模式分解
概念
将关系R分解为R1,R2…RN
无损链接分解:将R1,R2…RN进行自然连接,数据内容与R相同。
保持函数依赖分解:分解后的关系模式的函数依赖与R的函数依赖等价。
若要保持函数依赖,则不一定能分解成BCNF。
所有关系模式一定能够分解成保持函数依赖和无损分解的3NF。
分解为3NF
无损链接分解
计算给出的函数依赖的最小依赖集Fmin,将所有左边相同的元素的函数依赖进行和并如:A->B,A->C作为一个关系模式R1={ABC},此时的分解为无损分解。
如:关系模式R,有U={A,B,C,D,E},F={BE->C,DE->C,DAE->BC,AE->B,B->D}
计算最小依赖集:
若依赖右边有超过一个属性,将依赖分解为右边只有一个属性。
DAE->BC-------DAE->B,DAE->C。F={BE->C,DE->C,DAE->B,DAE->C,AE->B,B->D}
对左边有多个属性的依赖,查看其左边属性的子集是否有依赖决定右边,若有:删去该依赖。
DAE->B,AE->B, DAE->C,DE->C可以将DAE->B,DAE->C从依赖集中删去。F={BE->C,DE->C,DAE->B ,DAE->C ,AE->B,B->D}
然后遍历每个依赖,求左边属性的闭包,不计算本依赖。若闭包含有右边属性将此依赖划掉,否则保留此依赖。
对BE->C,{BE}+={B,E,D,C},划掉BE->C,F={BE->C ,DE->C,DAE->B ,DAE->C ,AE->B,B->D}
对DE->C,{DE}+={DE},保留DE->C
对AE->B,{AE}+={A,E},保留AE->B
对B->D,{B}+={B}, 保留B->D
最终Fmin={DE->C,AE->B,B->D}
将每个函数依赖分解为一个关系模式,左边属性相同的合并。
R = R1(DEC) , R2(AEB) , R3(BD)
其主键为{AE}
保持依赖分解
判断无损链接分解的关系模式是否含有主键AE,若不含有,则将主键作为关系模式添加进去。若含有则不需要添加,本身就是无损链接分解和保持依赖分解。
对于上例,R2(AEB)含有主键AE,所以无需添加。若不含有,添加R4(AE)