前言
模式分解的本质是将一个大的模式分解为几个小的模式,在模式分解至少应达到3NF,而且要保证是无损连接性的,分解时尽可能保持函数依赖。事实证明,保持无损连接和保持函数依赖,可以达到3NF,但不一定能达到BCNF。以下具体说明保持函数依赖3NF求解算法
算法描述
假设:关系模式R<U,F>,其中U属性集,F为属性集上的函数依赖,将其分解成3NF并保持函数依赖算法如下:
①求F最小依赖集F‘;极小依赖集算法参考地址:
②将既不在左部,又不在右部的属性,构成一个独立的一个关系模式;
③若有唯一依赖X->A,且XA=R,则分解只有一个R,结束;
④将左部相同的所有函数依赖合并为一个新关系。每一个X
i
_i
i->A
i
_i
i,构成一个关系子模式R
i
_i
i={X
i
_i
iA
i
_i
i}
示例
【例1】关系模式R<U,F>,其中U={C,T,H,R,S,G},F={CS→G,C→T,TH→R,HR→C,HS→R},将其分解成3NF并保持函数依赖.
解:第一步: 求F的极小依赖集F’,
F‘=={CS→G,C→T,TH→R,HR→C,HS→R}
第二步: 不存在既不在左部,又不在右部的属性;
第三步: 函数依赖左部相同的函数依赖合并,将合并后的每个函数依赖形成一个新的关系模式,分解后ρ={R
1
_1
1(CSG),R
2
_2
2(CT),R
3
_3
3(THR),R
4
_4
4(HRC),R
5
_5
5(HSR)}
【例2】设关系模式R(ABCDE)上的函数依赖集F={A→BC, BCD→E, B→D, A→D, E→A},将其分解成3NF并保持函数依赖.
解:第一步: 求F的极小依赖集F’
将右部单一化:{A→B,A→C, BCD→E, B→D, A→D, E→A}
去掉多余的函数依赖
假设去掉:A→B,F={A→C, BCD→E, B→D, A→D, E→A},求A
F
+
_F^+
F+={ACD},不包含B,A→B不能去掉
假设去掉:A→C,F={A→B,BCD→E, B→D, A→D, E→A},求A
F
+
_F^+
F+={ABD},不包含C,A→C不能去掉
假设去掉:BCD→C,F={A→B,A→C, B→D, A→D, E→A},求BCD
F
+
_F^+
F+={BCD},不包含E,BCD→C不能去掉
假设去掉:B→D,F={A→B,A→C, BCD→E, A→D, E→A},求B
F
+
_F^+
F+={BD},不包含E,B→D不能去掉
假设去掉:A→D,F={A→B,A→C, BCD→E, B→D, E→A},求A
F
+
_F^+
F+={ABCD},包含D,A→D可以去掉,得到 F={A→B,A→C, BCD→E, B→D, E→A}
假设去掉:E→A, F={A→B,A→C, BCD→E, B→D},求E
F
+
_F^+
F+={E},不包含A,E→A不能去掉
此时F={A→B,A→C, BCD→E, B→D, E→A}
去掉左部的冗余
尝试使用BC→E代替BCD→E,F={A→B,A→C, BCD→E, B→D, E→A},BC
F
+
_F^+
F+={BCDE},包含E,可以使用BC代替BCD→E;
F={A→B,A→C, BC→E, B→D, E→A}
尝试使用B→E代替BC→E,F={A→B,A→C, BC→E, B→D, E→A},B
F
+
_F^+
F+={BD},不包含E;不可替换
尝试使用C→E代替BC→E,F={A→B,A→C, BC→E, B→D, E→A},C
F
+
_F^+
F+={C},不包含E;尝试使用D→E,D
F
+
_F^+
F+={D},不包含E,不可替换
因此最小依赖集F‘={A→B,A→C, BC→E, B→D, E→A}
第二步: 不存在既不在左部,又不在右部的属性;
第三步: 函数依赖左部相同的函数依赖合并,将合并后的每个函数依赖形成一个新的关系模式,分解后ρ={R
1
_1
1(ABC),R
2
_2
2(BCE),R
3
_3
3(BD),R
4
_4
4(EA)}
结论
保持函数依赖3NF分解算法重点是在求极小函数依赖集,完成后将左部相同的函数依赖连同其右部合成一个关系模式,把没有出现在任何一个函数依赖的属性合成一个关系模式。