求解函数依赖是否保持中的投影算法


前言

在学习数据库时,我们总会遇到求解一个分解是否满足函数依赖是否保持,在求解投影时常常利用传递函数依赖来求解,但是经常会有遗漏,本文总结了一种求解投影的算法供大家参考。


提示:以下是本篇文章正文内容,下面案例可供参考,如有问题可在评论区反馈

设有关系模式 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={ABCF,CDE,BD,BEF,EFA}
判断分解 ρ = { 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在每个分解上的投影

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)={ABCD,BD,BCA}
F 2 = ∏ u 2 ( F ) = { A → E F , E F → A } F_2=∏u_2(F)=\{A→EF,EF→A\} F2=u2(F)={AEF,EFA}
这个投影是如何求解的呢?
下面给出求解投影的算法

1.求F1

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\} {ABCD,BD}
    [注]:满足条件的依赖指右边推出的属性在 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\} {BCA}
    [注]:由于 B → D B→D BD所以 B C → D BC→D BCD就不需要了。
    若有属性集的闭包包含 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={ABCD,BD,BCA}

2.求F2

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\} {AEF}
    若有属性的闭包包含 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\} {EFA}
    若有属性的闭包包含 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={AEF,EFA}


二、看F+是否等价于G+

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=F1F2={ABCDEF,BD,BCAD,EFA}
由于 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^+ ABG+
2、 A → C ∈ G + A→C∈G^+ ACG+
3、 A → F ∈ G + A→F∈G^+ AFG+
4、 C D → E , C D CD→E,CD CDE,CD G G G上的闭包 ( C D ) + = C D , E (CD)^+=CD,E (CD)+=CD,E不属于 ( C D ) + (CD)^+ (CD)+
C D → E CD→E CDE 不属于 G + G^+ G+
G + ≠ F + G^+≠F^+ G+=F+
∴该分解不具有函数依赖保持性

  • 47
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一步一个脚印ッ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值