3NF范式
依赖关系
R(U) x与y都是u的子集,若对于R(U) 的任意可能关系 r,r中不存在两行记录在x 上的值相同,而在y值上不同,称:x->y,x依赖y
x->y x不包含于y 非平凡函数
x--y x包含于y 平凡函数
x->y y->x x<- ->y
x->y x任意一个子集x' 都有y不依赖于x'
3NF范式
就是如果关系r中的每一个 都是不可分 就是第一范式 属性不可分 1NF。注意:在任何一个关系数据库中,第一范式是对关系模式的基本要求,不满足第一范式的数据库就不是关系数据库
2NF 所有的非主属性完全 依赖于任意候选键
3NF范式 表中的每一个属性都不传递依赖于任何候选键
1NF转换成2NF
采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。
将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。
例:选课关系 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相联系,需要时再进行自然联接,恢复了原来的关系
BCNF
BCNF是由Boyce和Codd提出的,比3NF又进了一步,通常认为是修正的第三范式.
所谓第三范式,定义是关系模式R<U,F>中若不存在这样的码X,属性组Y及非主属性Z,使得X—>Y,Y—>Z成立,(不存在Y—>X),则称R<U,F>为3NF.
即当2NF消除了非主属性对码的传递函数依赖,则称为3NF
对3NF关系进行投影,将消除原关系中主属性对码的部分与传递依赖,得到一组BCNF关系。
BCNF定义,关系模式中,若X函数确定Y且Y不在X内时X必含有码,则此关系属于BCNF。
具有函数依赖集F的关系模式R属于BCNF的条件是,对所有F的闭包中形如 X->Y,
下面至少有一个成立:
1X->Y是平凡的依赖。
2X是R的一个超码。
一个满足BCNF的关系模式有:
1 所有非主属性对每一个码都是完全函数依赖;
2 所有的主属性对每一个不包含它的码,也是完全函数依赖;
3 没有任何属性完全函数依赖于非码的任何一组属性。
由于R∈BCNF,按定义排除了任何属性对码的传递依赖与部分依赖,所以R∈3NF。但是若R∈3NF,则R未必属于BCNF。
例如:关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一个教师只教一门课。每门课有 若干个教师,某一学生选定某门课,就对应一个固定的教师。
由语义可得到如下函数依赖:
(S,J)->T;(S,T)->j;T->J。
(S,J),(S,T)都是候选码。
STJ是3NF,因为没有任何非主属性对码传递依赖或部分依赖。但STJ不是BCNF关系,因为T是决定因素而T不包含码。