在学习数据库时,我们总会遇到求解一个分解是否满足函数依赖是否保持,在求解投影时常常利用传递函数依赖来求解,但是经常会有遗漏,本文总结了一种求解投影的算法供大家参考。
提示:以下是本篇文章正文内容,下面案例可供参考,如有问题可在评论区反馈
设有关系模式 R = ( A , B , C , D , E , F ) R=(A ,B ,C ,D ,E ,F ) R=(A,B,C,D,E,F)
R的函数依赖集 F = { A → B C F , C D → E , B → D , B E → F , E F → A } F=\{A→BCF ,CD→E ,B→D ,BE→F ,EF→A\} F={A→BCF,CD→E,B→D,BE→F,EF→A}
判断分解 ρ = { R 1 ( A , B , C , D ) , R 2 ( A , E , F ) } ρ=\{R_1(A,B,C,D),R_2(A,E,F)\} ρ={R1(A,B,C,D),R2(A,E,F)}是否具有函数依赖性
F 1 = ∏ u 1 ( F ) = { A → B C D , B → D , B C → A } F_1=∏u_1(F)=\{A→BCD,B→D,BC→A\} F1=∏u1(F)={A→BCD,B→D,BC→A}
F 2 = ∏ u 2 ( F ) = { A → E F , E F → A } F_2=∏u_2(F)=\{A→EF,EF→A\} F2=∏u2(F)={A→EF,EF→A}
这个投影是如何求解的呢?
下面给出求解投影的算法
R 1 ( A , B , C , D ) R_1(A,B,C,D) R1(A,B,C,D)
第一步:求 R 1 R_1 R1中每个属性在 F F F上的闭包
( A ) + = A B C D E F , ( B ) + = B D , ( C ) + = C , ( D ) + = D (A)^+=ABCDEF,(B)^+=BD,(C)^+=C,(D)^+= D (A)+=ABCDEF,(B)+=BD,(C)+=C,(D)+=D
将满足条件的依赖加入 F 1 F_1 F1,则有 { A → B C D , B → D } \{A→BCD,B→D\} {A→BCD,B→D}
[注]:满足条件的依赖指右边推出的属性在 R 1 R_1 R1中。
若有属性的闭包包含 R 1 R_1 R1中所有的属性则不参与下一步,因为 A B C D ⊂ ( A ) + ABCD⊂(A)^+ ABCD⊂(A)+所以 A A A不参加下一步。
第二步:从不满足闭包包含 R 1 R_1 R1所有属性的属性集 { B , C , D } \{B,C,D\} {B,C,D}中选择两个求闭包
( B C ) + = B C A D E F , ( B D ) + = B D , ( C D ) + = C D E (BC)^+=BCADEF,(BD)^+=BD,(CD)^+=CDE (BC)+=BCADEF,(BD)+=BD,(CD)+=CDE
将满足条件的依赖加入 F 1 F_1 F1,则有 { B C → A } \{BC→A\} {BC→A}
[注]:由于 B → D B→D B→D所以 B C → D BC→D BC→D就不需要了。
若有属性集的闭包包含 R 1 R_1 R1中所有属性则不参与下一步,因为 A B C D ⊂ ( B C ) + ABCD⊂(BC)^+ ABCD⊂(BC)+所以 B C BC BC不参加下一步
第三步:从不满足闭包包含 R 1 R_1 R1所有属性的属性集 { D } \{D\} {D},选择三个属性求闭包,这时属性不足三个,算法终止,输出 F 1 = { A → B C D , B → D , B C → A } F_1=\{A→BCD,B→D, BC→A\} F1={A→BCD,B→D,BC→A}
R 2 ( A , E , F ) R_2(A,E,F) R2(A,E,F)
第一步:求 R 2 R_2 R2中每个属性在 F F F上的闭包
( A ) + = A B C D E F , ( E ) + = E , ( F ) + = F (A)^+=ABCDEF,(E)^+=E,(F)^+=F (A)+=ABCDEF,(E)+=E,(F)+=F
将满足条件的依赖加入 F 2 F_2 F2,则有 { A → E F } \{A→EF\} {A→EF}
若有属性的闭包包含 R 2 R_2 R2中所有的属性则不参与下一步,因为 A E F ⊂ ( A ) + AEF⊂(A)^+ AEF⊂(A)+所以 A A A不参加下一步
第二步:从不满足闭包包含 R 2 R_2 R2所有属性的属性集 { E , F } \{E,F\} {E,F}中选择两个求闭包
( E F ) + = A E F (EF)^+=AEF (EF)+=AEF
将满足条件的依赖加入 F 2 F_2 F2,则有 { E F → A } \{EF→A\} {EF→A}
若有属性的闭包包含 R 2 R_2 R2中所有的属性则不参与下一步,因为 A E F ⊂ ( E F ) + AEF⊂(EF)^+ AEF⊂(EF)+所以 E F EF EF不参加下一步
第三步:从不满足闭包包含 R 2 R_2 R2所有属性的属性集{}中选择三个求闭包,这时属性不足三个,算法终止。
输出 F 2 = { A → E F , E F → A } F_2=\{A→EF,EF→A\} F2={A→EF,EF→A}
G = F 1 ∪ F 2 = { A → B C D E F , B → D , B C → A D , E F → A } G= F_1∪F_2 =\{A→BCDEF ,B→D ,BC→AD ,EF→A\} G=F1∪F2={A→BCDEF,B→D,BC→AD,EF→A}
由于 G G G中的每个依赖关系都是 F F F投影出来的,所以 G + G^+ G+⊂ F + F^+ F+
所以要看 G + = F + G^+=F^+ G+=F+ 只要考察 F + ⊂ G + F^+⊂G^+ F+⊂G+
考察 F F F中每个属性
1、 A → B ∈ G + A→B∈G^+ A→B∈G+
2、 A → C ∈ G + A→C∈G^+ A→C∈G+
3、 A → F ∈ G + A→F∈G^+ A→F∈G+
4、 C D → E , C D CD→E,CD CD→E,CD在 G G G上的闭包 ( C D ) + = C D , E (CD)^+=CD,E (CD)+=CD,E不属于 ( C D ) + (CD)^+ (CD)+
∴ C D → E CD→E CD→E 不属于 G + G^+ G+
∴ G + ≠ F + G^+≠F^+ G+=F+
∴该分解不具有函数依赖保持性