最小依赖集 (解法+例题)

数据库 专栏收录该内容
1 篇文章 0 订阅

最小依赖集 (解法+例题)

网上看了很多最小依赖集的解法和例题,许多都存在错误,故自己参考总结写了一篇,如果有错误,感谢指正。

一、求最小依赖集的算法

①根据推理规则的分解性,右部最小化

②消除左边的冗余属性

③消除冗余的FD(依赖)

重点:操作步骤的顺序不能颠倒,颠倒了可能消除不了FD中左边冗余的属性,或冗余的依赖。

二、具体操作详解(以下两种意思相同,表述略有区别罢了)

(1)右部最小化:右切,使每个函数依赖的右部仅有一个属性
(2)规则最小化:除本求包(对每个函数依赖的左部做除本求包,求包的结果如果不包含本函数依赖的右部,本函数依赖保留;求包的结果如果包含了本函数依赖的右部,删除本函数依赖)
(3)左部最小化

注意,解题一定要先(3)后(2)

三、例题,反例等

反例,假如将②③步骤颠倒

例:求**F={ABD→AC,C→BE,AD→BF,B→E}**的最小函数依赖集 F m F_m Fm

注意:当在函数依赖已经改变的地方开始一个新步骤时,重写函数依赖集很重要,这样可以在下一步中方便引用。

第一步 对F中的函数依赖运用分解原则来创建一个等价函数依赖集H,该集合中每一个函数依赖的右部是单个属性:

H={①ABD→A,②ABD→C,③C→B,④C→E,⑤AD→B,⑥AD→F,⑦B→E}

第二步 考察每一个函数依赖是否是必须的,去除非必要的函数依赖

(1)ABD→A是平凡的函数依赖(就是A是ABD的子集,所以他是平凡的依赖),所以显然是非必要的函数依赖,因此去除。保留在H中的函数依赖是H={②ABD→C,③C→B,④C→E,⑤AD→B,⑥AD→F,⑦B→E}

(2)考察ABD→C,去掉此函数依赖将会得到新的函数依赖集J={③C→B,④C→E,⑤AD→B,⑥AD→F,⑦B→E}。如果ABD→C是非必要的,则 ( A B D ) J + (ABD)_J^+ (ABD)J+=ABDFE,不包含C,因此ABD→C是必要的函数依赖,不能去掉。

H={②ABD→C,③C→B,④C→E,⑤AD→B,⑥AD→F,⑦B→E}

(3)考察C→BJ={②ABD→C,④C→E,⑤AD→B,⑥AD→F,⑦B→E},则** C J + C_J^+ CJ+=CE**,不包含B,因此C→B是必要的函数依赖,保留在H中。

(4)考察C→EJ={②ABD→C,③C→B,⑤AD→B,⑥AD→F,⑦B→E},则 C J + C_J^+ CJ+=CBE,包含E,因此是不必要的,去除后得到的函数依赖集为H={②ABD→C,③C→B,⑤AD→B,⑥AD→F,⑦B→E}

(5)同理考察函数依赖⑤、⑥和⑦,最后得到的函数依赖集为H={②ABD→C,③C→B,⑤AD→B,⑥AD→F,⑦B→E}。为了第三步方便引用,我们进行重新编号:

H={①ABD→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。

第三步 考察每一个左部为多个属性的函数依赖,看左部的每个属性是否是必须的,能否用更小的属性集替代原有的属性集。

首先从函数依赖①ABD→C开始。

(1)去除A?

如果A可以去除,那么可得到新的函数依赖集J={①BD→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。去掉A后BD在J上的闭包将比在H下函数决定更多的属性,如果 ( B D ) J + (BD)_J^+ (BD)J+= ( B D ) H + (BD)_H^+ (BD)H+或者C∈ ( B D ) H + (BD)_H^+ (BD)H+,则说明去掉A得到的函数依赖集和原有的函数依赖集是等价的,可以用BD→C替换ABD→C。

( B D ) H + (BD)_H^+ (BD)H+=BDE,不包含C,所以A不能去掉。

(2)去掉B?

J={①AD→C,②C→B,③AD→B,④ AD→F,⑤ B→E} 。

( A D ) H + (AD)_H^+ (AD)H+=ADBC,包含了B,因此B→C是冗余的函数依赖,所以去除

(3)去掉D?J={①A→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。

因为H的函数依赖集在第三步发生了改变,因此我们需要回到第二步。如果顺序颠倒,则在消除左部冗余使F发生变化后,需要重新进行消除函数依赖的操作

此时H={①AD→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。

在进行第二步即重新进行消除函数依赖操作

其中考察到③,有 ( A D ) H + (AD)_H^+ (AD)H+=ADCB,包含B,因此AD→B是不必要的函数依赖,所以去除

最后

得到的函数依赖集为H={AD→C, C→B, AD→F, B→E}


例题:已知关系模式R(U,F),U={A,B,C,D,E,F,G},F={BCD→A,BC→E,A→F,F→G,C→D,A→G},求F的最小函数依赖集。

原参考省略了左部最小化的步骤,现我将其补上,仅供参考

③左部最小化

经过右部最小化和消除冗余依赖后F={BCD→A,BC→E,A→F,F→G,C→D}

针对BCD→A

  1. 去B? 则 ( C D ) F + (CD)_F^+ (CD)F+=CD,无A,保留
  2. 去C? 则 ( B D ) F + = B D (BD)_F^+=BD (BD)F+=BD,无A,保留
  3. 去D? 则 ( B C ) F + = B C D A E F G (BC)_F^+=BCDAEFG (BC)F+=BCDAEFG,有A,则D冗余,可以去掉。

所以F={BC→A,BC→E,A→F,F→G,C→D}

针对BC→E

  1. 去B 则 C F + C_F^+ CF+=CD,保留
  2. 去C 则 B F + B_F^+ BF+=B,保留

所以F={BC→A,BC→E,A→F,F→G,C→D}

但是

由于操作顺序颠倒,还需要进行冗余依赖的判断,判断后发现现在依赖保持不变。

所以F={BC→A,BC→E,A→F,F→G,C→D}


四、其他例题

例题一

例题二

例题(注意:本题由于顺序错误,导致了错误,纸质的部分进行了修改,但还是放出来以便大家更好的理解)

评论 10 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:游动-白 设计师:白松林 返回首页

打赏作者

鸵鸟桑

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值