2NF:
若R是1NF,且每一个非主属性,完全函数依赖于码,则R属于2NF。
下面举一个不是2NF的例子。
关系模式S-L-C(Sno,Sdept,Sloc,Cno,Grade)
其中Sloc为学生的住处,并且每一个系的学生住在同一个地方。S-L-C的码为
(Sno,Cno)。函数依赖有:
(Sno,Cno)->Grade是完全函数依赖。
Sno,Sdept,(Sno,Cno)->Sdept是部分函数依赖。
Sno,Sloc,(Sno,Cno)->Sloc是部分函数依赖。
因此上面的设计不是2NF。
一个关系模式不属于2NF就会出现下面的错误。
1.插入异常
如果要插入一个学生Sno,Sdept,Sloc但是这个学生没有选课,没有Cno那么就不能插入,因为Cno是码的一部分。
2.删除异常
如果一个学生就选了一门课,当他退选这门课的时候,我们就要把这个学生的信息一并删除掉。
3.修改复杂
如果学生从一个系转到另个系,并且他选了多门课程,然后他的每一条记录都要修改,就会产生修改复杂。
我们可以把上面的关系模式修改成其他的关系模式。
SC(Sno,Cno,Grade)
SL(Sno,Sdept,Sloc)
SC关系模式的码为(Sno,Cno),关系模式S-L的码为Sno,这样就使得非主属性对码都是完全函数依赖。
3NF:
若R属于3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码。
在上面的SC和SL中,SC满足3NF,但是SL关系模式不属于3NF。
解决的办法是将S-L分解
SD(Sno,Sdept)
DL(Sdept,Sloc)
分解后的关系模式S-D和D-L不再存在传递依赖。
BCNF
满足BCNF的关系模式有下面三个特点。
1.所有非主属性对每一个码都是完全函数依赖。
2.所有的主属性对每一个不包含它的码,也是完全函数依赖。
3.没有任何属性完全函数依赖于非码的任何一组属性。
由于R属于BCNF,按照定义排除了任何属性对码的传递依赖。所以R属于3NF.
下面我们介绍一个属于3NF但是不属于BCNF的例子。
在关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一个教师只教一门课程。每门课有若干教师,某一个学生选定一门课就对应一个固定教师。由语义可得到如下的函数依赖。
(S,J)->T;(S,T)->J;T->J用图6.6表示。
这里(S,J),(S,T)都是候选码
如果把(S,J)作为主码,它属于3NF但是它不属于BCNF,因为T不是主码但是它可以决定J。