前言
定义:如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集。亦称为最小覆盖。
(1)F中任一函数依赖的右部仅含有一个属性。
(2)F中不存在这样的函数依赖X→A,使得F与F-{X→A}等价。
(3)F中不存在这样的函数依赖X→A, X有真子集Z使得(F- {X→A})∪{Z→A}与F等价
换句话说,极小函数依赖集就是消除函数依赖集中重复蕴含的依赖。极小函数依赖集是求候选码、判断模式分解无损连接性和进行保持函数依赖性3NF求解常用的工具,了解此算法非常重要。
算法
假设:关系模式R<U,F>,其中U属性集,F为属性集上的函数依赖,求F的极小函数依赖集的算法如下:
①应用分解规则,使得F中的每一个函数依赖的右部属性单一化。
②去掉多余的依赖:由第一个依赖开始,在F中去掉它(假设为:X->Y),在其余的函数依赖中求X在F其余依赖上的属性闭包,若闭包含有Y则可以去掉函数依赖X->Y,否则不能
③去掉左部多余的属性:逐一检查F左边非单属性的依赖,若XY->A,能否替换为X->A.具体做法在求X在F上的属性闭包,若包含A,则可替换,否则不可替换
示例
【例1】:设关系模式R(ABCDE)上的函数依赖集F={A→BC, BCD→E, B→D, A→D, E→A},求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={ACD},不包含B,A→B不能去掉
假设去掉:A→C,F={A→B,BCD→E, B→D, A→D, E→A},求A={ABD},不包含C,A→C不能去掉
假设去掉:BCD→C,F={A→B,A→C, B→D, A→D, E→A},求BCD={BCD},不包含E,BCD→C不能去掉
假设去掉:B→D,F={A→B,A→C, BCD→E, A→D, E→A},求B={BD},不包含E,B→D不能去掉
假设去掉:A→D,F={A→B,A→C, BCD→E, B→D, E→A},求A={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={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={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={BD},不包含E;不可替换
尝试使用C→E代替BC→E,F={A→B,A→C, BC→E, B→D, E→A},C={C},不包含E;尝试使用D→E,D={D},不包含E,不可替换
因此最小依赖集F‘={A→B,A→C, BC→E, B→D, E→A}
【例2】设R(U,F)是一个关系模式,U=(A,B,C,D,E,G) F={BG→C,BD→E,DG→C,ADG→BC,AG→B,B→D},求F最小依赖集
- 右部单一化
F={BG→C,BD→E,DG→C,ADG→B,ADG→C,AG→B,B→D} - 消除冗余的函数依赖
去掉BG→C,F={BD→E,DG→C,ADG→B,ADG→C,AG→B,B→D}, BG={BGDEC},包含C,可以去掉
去掉BD→E,F={DG→C,ADG→B,ADG→C,AG→B,B→D}, BD={BD},不包含E,不能去掉
去掉DG→C,F={BD→E,ADG→B,ADG→C,AG→B,B→D}, GD={GD},不包含C,不能去掉
去掉ADG→B,F={BD→E,DG→C,ADG→C,AG→B,B→D},ADG={ABDGC},,包含B,可以去掉
去掉ADG→C,F={BD→E,DG→C,AG→B,B→D},ADG={ACDG},包含C,可以去掉
去掉AG→B,F={BD→E,DG→C,B→D},AG={AG},不包含B,非冗余
去掉B→D,F={BD→E,DG→C,AG→B},B={B},不包含D,非冗余
最终结果为:F={BD→E,DG→C,AG→B,B→D} - 消除左部冗余属性
消除BD→E,冗余的左部,假设B→E,B={BDE},包含E,可以使用B→E代替,BD→E;
此时:F={B→E,DG→C,AG→B,B→D}
消除DG→C,冗余的左部,假设D→C,D={D},不包含C,不可替换;假设G→C,G={G},不包含C,不可替换
消除AG→B,冗余的左部,假设A→B,A={A},不包含B,不可替换;假设G→B,B={G},不包含B,不可替换
极小依赖集为:F’={B→E,DG→C,AG→B,B→D}
总结
极小函数依赖集求解过程中,消除冗余的函数依赖是假设成立的条件下,F1=F{},求在F1属性闭包。消除左部冗余的属性,假设消除后的消除冗余的函数依赖集合为F,XA→Y,去掉A,判断X→Y是否成立,是求X在F下的属性闭包,F中包含XA→Y,还要注意极小依赖集最终结果不唯一。