最近在准备软件设计师的资格考试。首先表达一下我为什么会去考这个证,主要有以下两点:
于是,我就准备通过考证,来建立我的技能体系。有一句话,我很喜欢:不要为了考证而去考证。所以,在学习每一章节的时候,我会尽量联系到我已有的工作上来或尝试用到某些方面。加深理解,也能提高工作上的效率。遇到感受很深刻的内容,我会记录下来,和大家分享一下。
本章的经验之谈,我觉得比较适合没有接触设计数据库的朋友,并且不会很深入,高手可以忽略啦。
工作中,我们根据需求进行数据库的设计,其实就是对表的字段设计,表中该有哪些字段是比较合理的。一般能够满足需求即可,很少会考虑到一些其他问题。其实对于数据库表的格式,是有评判优劣标准的(我也是看书知道的,以往评判一个表的好坏全由自己的经验而来)。
数据库的设计就是设计满足适当范式的模式。范式有1NF,2NF,3NF,BCNF,4NF和5NF。它们的关系是:5NF>4NF>BCNF>3NF>2NF>1NF。这里的范式,你可以认为是表中各个属性(字段)要满足对应范式的定义。实际工作中,我们一般满足3NF即可。
定义:若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式。
我的理解:就是表中的字段都是不可再分的数据项。如下表:
该表的就不满足第一范式,因为高级职称人数不是一个原子属性。将其拆分为教授和副教授则满足1NF。
定义:若关系模式R属于1NF,且每个非主属性完全依赖于码,则关系模式R属于2NF.
我们先看下表:
关系模式:F={Sno->Sname,Sno->Status,Status->City,(Sno,Pno)->Qty}
Sno | Sname | Status | City | Pno | Qty |
---|---|---|---|---|---|
S1 | 精益 | 20 | 天津 | P1 | 200 |
S1 | 精益 | 20 | 天津 | P2 | 300 |
S1 | 精益 | 20 | 天津 | P3 | 480 |
S2 | 盛锡 | 10 | 北京 | P2 | 168 |
S2 | 盛锡 | 10 | 北京 | P3 | 500 |
S3 | 东方红 | 30 | 北京 | P1 | 300 |
S3 | 东方红 | 30 | 北京 | P2 | 280 |
S4 | 泰达 | 40 | 上海 | P2 | 460 |
我们知道可以分辨出该表满足1NF。但是存在4个问题:
从关系模式F中我们可以看出,Sno,Pno是主码。而Sno->Status。因此非主属性Status部分依赖于码。故非2NF。我们可以进行以下修改。将表分解为:
TABLE1(Sno,Sname,Status,City),主码为Sno
TABLE2(Sno,Pno,Qty),主码为Sno,Pno
即可避免1NF存在的问题。
定义:若关系模式R(U,F)中不存在这样的码X,属性组Y及非主属性Z(Z不属于Y)使得X->Y,Y->Z成立,则关系模式R属于3NF。
我的理解:这个定义可能比较复杂。简单来说就是判断表中是否存在传递依赖,即X->Y,Y->Z的条件。若不存在,则是满足3NF。
例:我们刚在2NF中,将表分解为TABLE1(Sno,Sname,Status,City)。其中存在Sno->Status,Status->City。故上面的TABLE1和TABLE2花不满足3NF。需要再进行下面的分解:
TABLE1(Sno,Sname,Status)
TABLE2(Status,city)
TABLE3(Sno,Pno,Qty)
既满足3NF。
本章的主要目的就是想让大家了解数据库设计时需要注意的点。想要设计出一个优秀的数据库还需要更多的努力,在后面的学习中,如有相关的经验或总结,我会继续补充。
即使我们现在还不是大牛,但是在工作中,如果让我们设计数据库,起码已经知道评判的方式,最起码要建立一个满足3NF的数据表。
若有朋友也想考软件设计师,我这边可以将我的资料发给你。(在咸鱼上买的,个人觉得还不错,有很多的习题以及历年的考题)在下方留下你的邮箱即可