关系模式的范式 主要有4种范式,1NF,2NF,3NF,BCNF,按从左至右的顺序一种比一种要求更严格。要符合某一种范式必须也满足它前边的所有范式。一般项目的数据库设计达到3NF就可以了,而且可根据具体情况适当增加冗余,不必教条地遵守所谓规范。 简单而言,1NF就是要求一张表里只放相互关联的字段,一个字段里只放一条信息,这只是最基本的要求。至于2NF,3NF,BCNF虽然描述的内容不同,但表现在数据特点上很相似,就好比在说不要为了向某厂订购一批货记下来,就把的厂的面积、电话等都放在同一张表里,而应该用两张表,以尽量避免浪费数据存储空间。因为和同一个厂可能会交易好几次,但没必要每次交易都记录全部的信息。 从范式所允许的函数依赖方面进行比较,四种范式之间的关联如下图所示。
以下对每种范式作一一说明。 2.3.4.2第一范式 在关系模式R中的每一个具体关系r中,如果每个属性值都是不可再分的最小数据单位,则称R是第一范式的关系。 例:如职工号,姓名,电话号码组成一个表(一个人可能有一个办公室电话和一个家里电话号码)规范成为1NF有三种方法: 2.3.4.3第二范式 关系的第二范式(2NF)定义:如果关系模式R为1NF,并且R中的每一个非主属性都完全依赖于R的某个候选关键字,则称R是第二范式的,简记为2NF。 【例2.40】设有关系模式R(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS),基于R的函数依赖集F={(S#,C#)→G,C#→TN,TN→TS},判断R是否为2NF。 解: (1)容易看出,关系模式R是1NF。因为R符合关系的定义,R的所有属性值都是不可再分的原子值。 R是否为2NF,应根据2NF的定义来判断。 首先要确定关系模式R中各属性间的函数依赖情况。如果没有直接给出R的函数依赖集,就要按照语义把它确定下来。在本例中,已直接给出基于R的函数依赖集F,我们可使用阿氏推理规则并结合下面介绍的方法,进一步确定R中哪些是主属性、哪些是非主属性、侯选关键字由哪些属性构成。 方法①写出函数依赖集F中的各个函数依赖以帮助分析。方法①的特点是直接。 F={(S#,C#)→G, C#→TN, TN→TS } 方法②用有向图表示属性间函数依赖,结点表示属性,方框包含若干个结点表示属性组合,有向箭头表示函数依赖。本例的函数依赖图如图2.9所示。方法②的特点是直观。
图2.9函数依赖图例子 方法③把关系模式R与函数依赖集F结合起来,属性组合用下划线(或上划线)表示,函数依赖用有向箭头表示。本例的函数依赖简图如图2.10所示。方法③的特点是简单。
图2.10函数依赖简图例子 用阿氏推理规则由F可推出:(S#,C#)→{S#,C#,G,TN,TS},即属性组合(S#,C#)是R的候选关键字(R只有这一个候选键)。(S#,C#)的一个值可惟一标识R中的一个元组(并且没有多余的属性)。 在R中,S#,C#是主属性;其余的属性G,TN,TS为非主属性。 借助上面的图,我们可以看到,非主属性G对键是完全依赖:(S#,C#)→G。但非主属性TN,TS对键是部分依赖(他们仅依赖于键的真子集C#)。由于R中存在非主属性对候选键的部分依赖,所以关系模式R不是2NF。 R中存在非主属性对候选键的部分依赖,将会引起数据冗余、数据操作异常等问题。可以把关系R无损联接地分解成两个2NF的关系模式: ρ={R1,R2},R1={S#.C#,G},R2={C#,TN,TS}。 【例2.41】选课关系SCI(SNO,CNO,GRADE,CREDIT)其中SNO为学号,CNO为课程号,GRADEGE为成绩,CREDIT为学分。 由以上条件,关键字为组合关键字(SNO,CNO) 2.3.4.4第三范式 关系的第三范式(3NF)定义:如果关系模式R为2NF,并且R中的每一个非主属性都不传递依赖于R的某个候选关键字,则称R是第三范式的,简记为3NF。 【例2.42】续上例2.40(R(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS)),判断关系模式R1={S#.C#,G},R2={C#,TN,TS}是否为3NF。 解: (1)在关系模式R1={S#,C#,G},候选关键字是(S#,C#),主属性是S#,C#,非主属性是G,函数依赖为(S#,C#)→G。由于R1中不存在非主属性对候选关键字的传递依赖,所以关系模式R1是3NF。 (2)在关系模式R2={C#,TN,TS},候选关键字是C#,主属性是C#,非主属性是TN,TS,函数依赖为C#→TN,TN→TS。由于R2中存在非主属性对候选关键字的传递依赖C#TS,所以关系模式R2不是3NF。 可以把关系R2无损联接地分解成两个3NF的关系模式: ρ={R3,R4},R3={C#,TN},R4={TN,TS}。 【例2.43】如(SNO,SNAME,DNO,DNAME,LOCATION)各属性分别代表学号,
但这关系有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。 2.3.4.5Boyce-Codd范式 关系的Boyce-Codd范式(BCNF)定义:如果关系模式R为1NF,并且R中的每一个函数依赖X→Y(YÏX),必有X是R的超关键字,则称R是Boyce-Codd范式的,简记为BCNF。 从BCNF的定义中,可以明显地得出如下结论: (1)所有非主属性对键是完全函数依赖; (2)所有主属性对不包含它的键是完全函数依赖; (3)没有属性完全函数依赖于非键的任何属性组合。 与2NF,3NF的定义不同,BCNF的定义直接建立在1NF的基础上。但实质上BCNF是3NF的改进形式。3NF仅考虑了非主属性对键的依赖情况,BCNF把主属性对键的依赖情况也包括进去。BCNF要求满足的条件比3NF所要求的更高。如果关系模式R是BCNF的,那么R必定是3NF,反之,则不一定成立。 【例2.43】续前例2.42(学号S#,课程号C#,成绩G,任课教师TN,教师专长TS),判断两个3NF关系模式R3={C#,TN},R4={TN,TS}是否为BCNF。 解:在关系模式R3中有函数依赖C#→TN,决定因素C#是R3的键; 在关系模式R4中有函数依赖TN→TS,决定因素TN是R4的键; R3,R4都满足BCNF的定义,所以,这两个关系模式都是BCNF。
【例2.44】配件管理关系模式WPE(WNO,PNO,ENO,QNT)分别表仓库号,配件号,职工号,数量。有以下条件 |
理解:一范式 对属性原子性约束,属性是不可再分的。
二范式 主属性是两个字段的,非主属性部分依赖于主属性则不是二范式,只有非主属性完全依赖于主属性,则满足第二范式。
这其中会出现四种异常,数据冗余,更新异常,插入异常,删除异常,具体情况具体理解。
三范式:就是即满足第一范式,也满足第二范式,就像上面所说“R2={C#,TN,TS},候选关键字是C#,主属性是C#,非主属性是TN,TS,函数依赖为C#→TN,TN→TS。”也就是非主属性依赖了非主属性,或是候选键依赖了候选键,这就不是第三范式了。第三范式也不存在非主属性对非主属性的依赖。
BCNF:比第三范式要求更高,第三范式是要求你非主属性对非主属性的依赖情况,BCNF是把主属性对候选键的依赖情况。
机房收费系统设计关系模式时,没有考虑太多,因为根据界面看的需求本身就有局限性,机房收费系统也只是个独立的系统,不像评教系统那样,所以没考虑那么多,但在重新建表的时候也要按照建表的规则来思考,就当复习了一遍数据库原理的知识了。