前言

定义:如果函数依赖集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},求Aimplementation project 去除依赖_属性闭包={ACD},不包含B,A→B不能去掉
假设去掉:A→C,F={A→B,BCD→E, B→D, A→D, E→A},求Aimplementation project 去除依赖_属性闭包={ABD},不包含C,A→C不能去掉
假设去掉:BCD→C,F={A→B,A→C, B→D, A→D, E→A},求BCDimplementation project 去除依赖_属性闭包={BCD},不包含E,BCD→C不能去掉
假设去掉:B→D,F={A→B,A→C, BCD→E, A→D, E→A},求Bimplementation project 去除依赖_属性闭包={BD},不包含E,B→D不能去掉
假设去掉:A→D,F={A→B,A→C, BCD→E, B→D, E→A},求Aimplementation project 去除依赖_属性闭包={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},求Eimplementation project 去除依赖_属性闭包={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},BCimplementation project 去除依赖_属性闭包={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},Bimplementation project 去除依赖_属性闭包={BD},不包含E;不可替换
尝试使用C→E代替BC→E,F={A→B,A→C, BC→E, B→D, E→A},Cimplementation project 去除依赖_属性闭包={C},不包含E;尝试使用D→E,Dimplementation project 去除依赖_属性闭包={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最小依赖集

  1. 右部单一化
    F={BG→C,BD→E,DG→C,ADG→B,ADG→C,AG→B,B→D}
  2. 消除冗余的函数依赖
    去掉BG→C,F={BD→E,DG→C,ADG→B,ADG→C,AG→B,B→D}, BGimplementation project 去除依赖_属性闭包_11={BGDEC},包含C,可以去掉
    去掉BD→E,F={DG→C,ADG→B,ADG→C,AG→B,B→D}, BDimplementation project 去除依赖_属性闭包_11={BD},不包含E,不能去掉
    去掉DG→C,F={BD→E,ADG→B,ADG→C,AG→B,B→D}, GDimplementation project 去除依赖_属性闭包_11={GD},不包含C,不能去掉
    去掉ADG→B,F={BD→E,DG→C,ADG→C,AG→B,B→D},ADGimplementation project 去除依赖_属性闭包_11={ABDGC},,包含B,可以去掉
    去掉ADG→C,F={BD→E,DG→C,AG→B,B→D},ADGimplementation project 去除依赖_属性闭包_11={ACDG},包含C,可以去掉
    去掉AG→B,F={BD→E,DG→C,B→D},AGimplementation project 去除依赖_属性闭包_11={AG},不包含B,非冗余
    去掉B→D,F={BD→E,DG→C,AG→B},Bimplementation project 去除依赖_属性闭包_11={B},不包含D,非冗余
    最终结果为:F={BD→E,DG→C,AG→B,B→D}
  3. 消除左部冗余属性
    消除BD→E,冗余的左部,假设B→E,Bimplementation project 去除依赖_属性闭包_11={BDE},包含E,可以使用B→E代替,BD→E;
    此时:F={B→E,DG→C,AG→B,B→D}
    消除DG→C,冗余的左部,假设D→C,Dimplementation project 去除依赖_属性闭包_11={D},不包含C,不可替换;假设G→C,Gimplementation project 去除依赖_属性闭包_11={G},不包含C,不可替换
    消除AG→B,冗余的左部,假设A→B,Aimplementation project 去除依赖_属性闭包_11={A},不包含B,不可替换;假设G→B,Bimplementation project 去除依赖_属性闭包_11={G},不包含B,不可替换
    极小依赖集为:F’={B→E,DG→C,AG→B,B→D}

总结

极小函数依赖集求解过程中,消除冗余的函数依赖是假设implementation project 去除依赖_函数依赖_23成立的条件下,F1=Fimplementation project 去除依赖_函数依赖_24{implementation project 去除依赖_函数依赖_23},求implementation project 去除依赖_函数依赖_26在F1属性闭包。消除左部冗余的属性,假设消除后的消除冗余的函数依赖集合为F,XA→Y,去掉A,判断X→Y是否成立,是求X在F下的属性闭包,F中包含XA→Y,还要注意极小依赖集最终结果不唯一