理解数据库关系模型的范式(复习)

关系模式的范式

主要有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)
在应用中使用以上关系模式有以下问题:
a.数据冗余,假设同一门课由40个学生选修,学分就重复40次。
b.更新异常,若调整了某课程的学分,相应的元组CREDIT值都要更新,有可能会出现同一门课学分不同。
c.插入异常,如计划开新课,由于没人选修,没有学号关键字,只能等有人选修才能把课程和学分存入。
d.删除异常,若学生已经结业,从当前数据库删除选修记录,就会可能连课程号及学分完全从数据库中删除,则此门课程及学分记录无法保存。
原因:非关键字属性CREDIT仅函数依赖于CNO,也就是CREDIT部分依赖组合关键字(SNO,CNO)而不是完全依赖。
解决方法:分成两个关系模式SC1(SNO,CNO,GRADE),C2(CNO,CREDIT)。新关系包括两个关系模式,它们之间通过SC1中的外关键字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)各属性分别代表学号,
姓名,所在系,系名称,系地址。判断关系模式S1是否为3NF。


关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,是2NF。

但这关系有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。
原因:关系中存在传递依赖造成的。关键字SNO对LOCATION函数决定是通过传递依赖:SNO->DNO,及DNO->LOCATION实现的。也就是说,SNO不直接决定非主属性LOCATION,不是3NF。
解决目地:每个关系模式中不能留有传递依赖。
解决方法:分为两个关系S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION)
注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系。

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)分别表仓库号,配件号,职工号,数量。有以下条件
a.一个仓库有多个职工。
b.一个职工仅在一个仓库工作。
c.每个仓库里一种型号的配件由专人负责,但一个人可以管理几种配件。
d.同一种型号的配件可以分放在几个仓库中

分析:由以上得PNO不能确定QNT,由组合属性(WNO,PNO)来决定,存在函数依赖(WNO,PNO)->ENO。由于每个仓库里的一种配件由专人负责,而一个人可以管理几种配件,所以有组合属性(WNO,PNO)才能确定负责人,有(WNO,PNO)->ENO。因为一个职工仅在一个仓库工作,有ENO->WNO。由于每个仓库里的一种配件由专人负责,而一个职工仅在一个仓库工作,有(ENO,PNO)->QNT。
找一下候选关键字,因为(WNO,PNO)->QNT,(WNO,PNO)->ENO,因此(WNO,PNO)可以决定整个元组,是一个候选关键字。根据ENO->WNO,(ENO,PNO)->QNT,故(ENO,PNO)也能决定整个元组,为另一个候选关键字。属性ENO,WNO,PNO均为主属性,只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的,并且是直接依赖,所以该关系模式是3NF。
分析一下主属性。因为ENO->WNO,主属性ENO是WNO的决定因素,但是它本身不是关键字,只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字(ENO,PNO)的部分依赖,因为(ENO,PNO)->ENO但反过来不成立,而P->WNO,故(ENO,PNO)->WNO也是传递依赖。
虽然没有非主属性对候选关键辽的传递依赖,但存在主属性对候选关键字的传递依赖,同样也会带来麻烦。如一个新职工分配到仓库工作,但暂时处于实习阶段,没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全,则在删除配件的同时该职工也会被删除。
解决办法:分成管理EP(ENO,PNO,QNT),关键字是(ENO,PNO)工作EW(ENO,WNO)其关键字是ENO
缺点:分解后函数依赖的保持性较差。如此例中,由于分解,函数依赖(WNO,PNO)->ENO丢失了,因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现一部件由两个人或两个以上的人来同时管理。因此,分解之后的关系模式降低了部分完整性约束。

理解:一范式 对属性原子性约束,属性是不可再分的。

二范式 主属性是两个字段的,非主属性部分依赖于主属性则不是二范式,只有非主属性完全依赖于主属性,则满足第二范式。

这其中会出现四种异常,数据冗余,更新异常,插入异常,删除异常,具体情况具体理解。

三范式:就是即满足第一范式,也满足第二范式,就像上面所说“R2={C#,TN,TS},候选关键字是C#,主属性是C#,非主属性是TN,TS,函数依赖为C#→TN,TN→TS。”也就是非主属性依赖了非主属性,或是候选键依赖了候选键,这就不是第三范式了。第三范式也不存在非主属性对非主属性的依赖。

BCNF:比第三范式要求更高,第三范式是要求你非主属性对非主属性的依赖情况,BCNF是把主属性对候选键的依赖情况。

机房收费系统设计关系模式时,没有考虑太多,因为根据界面看的需求本身就有局限性,机房收费系统也只是个独立的系统,不像评教系统那样,所以没考虑那么多,但在重新建表的时候也要按照建表的规则来思考,就当复习了一遍数据库原理的知识了。

你可能感兴趣的:(理解数据库关系模型的范式(复习))