4.3.3 第二范式
【定义4.9】 如果一个关系模式R∈1NF,且它的所有非主属性都完全函数依赖于R的任一候选码,则R∈2NF。
关系模式SLC出现上述问题的原因是DEPT,SLOC对码的部分函数依赖。为了消除这些部分函数依赖,可以采用投影分解法,把SLC分解为两个关系模式:
SC(SNO,CNO,GRADE)
SL(SNO,DEPT,SLOC)
其中SC的码为(SNO,CNO),SL的码为SNO。
显然,在分解后的关系模式中,非主属性都完全函数依赖于码了。从而使上述3个问题在一定程度上得到部分的解决。
①在SL关系中可以插入尚未选课的学生。
②删除学生选课情况涉及的是SC关系,如果一个学生所有的选课记录全部删除了,只是SC关系中没有关于该学生的记录了,不会牵涉SL关系中关于该学生的记录。
③由于学生选修课程的情况与学生的基本情况是分开存储在两个关系中的,因此不论该学生选多少门课程,他的DEPT和SLOC值都只存储了1次。这就大大降低了数据冗余程度。
④由于学生从数学系转到信息系,只需修改SL关系中该学生元组的DEPT值和SLOC值,由于DEPT,DLOC并未重复存储,因此简化了修改操作。
2NF就是不允许关系模式的属性之间有这样的依赖X→Y,其中X是码的真子集,Y是非主属性。显然,码只包含一个属性的关系模式,如果属于1NF,那么它一定属于2NF,因为它不可能存在非主属性对码的部分函数依赖。
上例中的SC关系和SL关系都属于2NF。可见,采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常、数据冗余度大等问题。
但是将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。也就是说,属于2NF的关系模式并不一定是一个好的关系模式。
例如,2NF关系模式SL(SNO,DEPT,SLOC)中有下列函数依赖。
SNO→DEPT
DEPT→SLOC
SNO→SLOC
由上可知,SLOC传递函数依赖于SNO,即SL中存在非主属性对码的传递函数依赖,SL关系中仍然存在插入异常、删除异常和数据冗余度大的问题。
(1)删除异常
如果某个系的学生全部毕业了,在删除该系学生信息的同时,把这个系的信息也丢掉了。
(2)数据冗余度大
每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现,重复次数与该系学生人数相同。
(3)修改复杂
当学校调整学生住处时,比如信息系的学生全部迁到另一地方住宿,由于关于每个系的住处信息是重复存储的,修改时必须同时更新该系所有学生的SLOC属性值。
所以SL仍然存在操作异常问题。仍然不是一个好的关系模式。