6.2 规范化
♥ 2NF还有什么问题?
◾ 采用投影分解法,把S-L-C分解为两个关系模式:SC和S-L,消除了S-L-C中非主属性对码的部分函数依赖
◾ 一般的,如果吧1NF关系模式通过投影分解方法,消除非主属性对码的部分函数依赖,分解为多个2NF的关系模式
◾ 可以在一定程度上减轻原1NF关系模式中存在的插入异常、删除异常、数据冗余度打、修改复杂等问题
◾ 但是还不能完全消除关系模式中的各种异常情况和数据冗余
◾ 2NF关系模式S-L(Sno, Sdept, Sloc)中
函数依赖:Sloc传递函数依赖于Sno,即S-L中存在非主属性对码的传递函数以来Sno -传递-> Sloc
S-L关系存在的问题:
(1)插入异常
如果某个系因种种原因(例如刚刚成立),目前暂时没有在校学生,我们就 无法把这个系的信息,存入数据库。
(2)删除异常
如果某个系的学生全部毕业了,我们在删除该系的学生信息的同时,把这个系的信息(Sdept、Sloc)也丢掉了。
(3)数据冗余度大
每一个系的学生都住在同一个地方,关于系的住处的信息却重复出现,重复次数与该系学生人数相同
(4)修改复杂
学校调整学生住处时,由于关于每个系的住处信息时重复存储的,修改时必须同时更新该系所有学生的Sloc属性值
♥ 原因:
S-L中Sloc传递函数依赖于Sno,即非主属性==传递函数依码
♥ 解决方法:
采用投影分解法,把S-L分解为两个关系模式,以消除传递函数依赖:
S-D(Sno, Sdept)
D-L(Sdept, Sloc)
S-D的码为Sno,D-L的码为Sdept
在分解后的关系模式中既没有非主属性对码的部分函数依赖,也没有非主属性对码的传递函数依赖,进一步解决了上述四个问题
♥ 异常的情况得到改善:
(1)D-L关系中可以插入系的信息,即使还没有在校学生
(2)某个系的学生全部毕业了,只是删除S-D关系中的相应元组,D-L关系中关于该系的信息仍存在。
(3)关于系的住处的信息这只是在D-L关系中存储一次
(4)当学校调整某个系的学生住处时,只需修改D-L关系中一个元组的Sloc属性值
♥ 3NF的定义
定义6.7 关系模式R<U, F>∈1NF,若R中不存在这样的码X、属性组Y以及非主属性Z(Y⊉Z),是的X → Y,Y → Z,Y ↛ X成立,则层R<U, F> ∈ 3NF(不存在传递依赖)
栗子:
S-D(Sno, Sdept) ∈ 3NF
D-L(Sdept, Sloc) ∈ 3NF
♥ 一无列再分,二无部分依赖,三无传递依赖
♥ 3NF的一些性质:
◾ 若R∈3NF,则R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码
◾ 如果R∈3NF,则R∈2NF
◾ 采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决 原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题
◾ 将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余