说明
我在csdn上看过几篇求最小依赖集的方法,感觉他们有的各不相同,甚至有的不太理解,或者有的叙述错误,看了一些资料,在此进行总结,求最小函数依赖集方法
定义
如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集或最小覆盖。
①F中任一函数依赖的右部仅含有一个属性。
②F中不存在这样的函数依赖X→A,使得F与F-{X→A}。
③F中不存在这样的函数依赖X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价。
求解方法
①将F中的所有依赖右边化为单一元素。简记:右部单属性
②去掉F中的所有依赖左边的冗余属性。简记:去掉左部冗余
③去掉F中所有冗余依赖关系。简记:去掉冗余依赖。
切记求解步骤为①②③,不能调换,若调换为①③②,则在消除左部冗余使F发生变化后,需要重新进行消除函数冗余依赖的操作 |
我的解释
①右部单属性,如X→BC,则把它拆为X→B,X→C。理论依据为分解规则:由X→Y,及Z⊆Y,有X→Z。
②去掉左部冗余,如在第①步后,得到的函数依赖集为F1,对其中形如AB→ Y,进行考察:
1.去掉A,得B→Y,继续基于F1,计算B+,若B+包含Y,则可以去掉A,即以B→Y替换原式的AB→ Y。若两个都能去掉,保留其中一个即可,同时也可以看出最小函数依赖的结果并不一定是唯一的,其实它也和上面②处理冗余的顺序以及③处理冗余的顺序有关系
注意是基于F1,即在第①步后获得的F1,去掉A,得到B→Y,而在计算B的闭包时,F中依然是AB→ Y |
2.去掉B,得A→Y,继续基于F1,计算A+,若A+包含Y,则可以去掉B,即以A→Y替换原式的AB→ Y。
例如
求得
F1={①ABD→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。
去除A:
计算BD在F1上的闭包BD+=BDE不包含C,所以不能去掉。
理解:
如果BD+包含C,说明能由F1导出BD→C,
而由Armstrong公理系统中的增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含。
因为BD→C,A⊆U,所以有ABD→AC为F1所蕴含。
再由分解规则:由X→Y,及Z⊆Y,有X→Z。
可得C⊆AC,所以有ABD→C。
设ABD去掉左部A后,得到的新的函数依赖集为F2
这里引入一个概念,在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫作F的闭包,记为F+。个人理解,就是F中的各种函数依赖,利用推理规则,所能推出来的所有公式的集合。
显然有F1+⊆F2+ (因为F2能导出F1集合的所有元素,显然有F2逻辑蕴含的函数依赖的全体肯定包括F1逻辑蕴含的函数依赖的全体,即F1+⊆F2)
而BD+包含C,说明能由F1导出BD→C,即F1能导出F2集合的所有元素。
同上,显然有F2+⊆F1+
再由引理:F+=G+的充分必要条件是F+⊆G+,G+⊆F+
下面给出看到过的另一种判断方法
去掉A得到得到新的函数依赖集F2={①BD→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。如果BD在F2上的闭包和BD在F1上的闭包相等,则可以去掉。
不要记混了,计算闭包是在F1上,而不是把F1中ABD→C改成BD→C,再计算闭包,因为如果AB→C,如果记混了,B→C去替换AB→C,再在此基础上计算B的闭包,必然有B+=BC,因为B→C,所以B+包含C,这样判别是毫无意义的 |
例题
设有函数依赖集F={C→A, A→B, B→C, C→B, A→C, BC→A},求其最小函数依赖集Fmin。
第一步,右部单属性:
原式不改变。
第二步,消除左部冗余:
BC→A,A在(B)F+=ABC中,A在(C)F+=ABC中,保留一个BC中的一个即可。
- 保留B:C→A, A→B, B→C, C→B, A→C, B→A
- 保留C:C→A, A→B, B→C, C→B, A→C
第三步去掉冗余依赖:
1.若保留B:C→A, A→B, B→C, C→B, A→C, B→A
考察C→A,去掉C→A后,A→B, B→C, C→B, A→C,B→A, C+=ABC,A在C+中,可以去掉。变为A→B, B→C, C→B, A→C, B→A
考察A→B,去掉A→B后,B→C, C→B, A→C, B→A,A+=ABC,B在A+中,可以去掉。变为B→C, C→B, A→C, B→A
考察B→C,去掉B→C后, C→B, A→C, B→A,B+=ABC,C在B+中,可以去掉。变为C→B, A→C, B→A
考察C→B,去掉C→B后,A→C, B→A,C+=C,B不在C+中,不可以去掉
考察A→C,去掉C→B后,C→B, B→A,A+=A,C不在A+中,不可以去掉
考察B→A,去掉B→A后,C→B, A→C,,B+=B,A不在B+中,不可以去掉
结束,得到Fmin={C→B, A→C, B→A}
2.若保留C:C→A, A→B, B→C, C→B, A→C
考察C→A,去掉C→A后,A→B, B→C, C→B, A→C, C+=BC,A不在C+中,不可以去掉
考察A→B,去掉A→B后,C→A, B→C, C→B, A→C, A+=ABC,B在A+中,可以去掉
变为C→A, B→C, C→B, A→C
考察B→C,去掉B→C后, C→A,C→B, A→C, B+=B,C不在B+中,不可以去掉。
考察C→B,去掉C→B后,C→A,B→C, A→C, C+=AC,不在C+中,不可以去掉。
考察A→C,去掉A→C后, C→A, B→C, C→B, A+=A,C不在A+中,不可以去掉。
结束,得到Fmin={C→A, B→C, C→B, A→C }
综上:Fmin={C→B, A→C, B→A}或Fmin={C→A, B→C, C→B, A→C }
如果先考察A→C,A+=ABC,C在其中,可以去掉,变为C→A, A→B, B→C, C→B 考察C→A,C+=BC,A不在C+中,不能去 考察 A→B,A+=A,B不在A+中,不能去 考察 B→C,B+=B,C不在B+中,不能去 考察C→B,C+=ABC,B在C+中,可以去掉变为C→A, A→B, B→C 有Fmin={C→A, A→B, B→C},又得到了一个最小依赖集 |