目录
一、什么是函数最小依赖集?
所给出的函数依赖集F满足以下三点要求:
- F里的子集右属性为单属性
- F里的每个子集左属性没有多余的元素
- F不包含多余的函数依赖
二、求解步骤
第一步:保证函数依赖集右边属性是单属性。若不是单属性时,通过分配律去拆除右属性;
第二步:去掉函数依赖集左边多余的属性。假设F中有XY →A,则在F中求X+,判断是否A⊆X+。若A⊆X+,则Y是多余的,可删去。
第三步:去掉多余的函数依赖。设删去子集情况,求左边元素的闭包里面是否包含着右边元素,若有则表示冗余可 删、更新函数集;若无则保留,下一个。
三、例题
例题1:左右属性都为单属性
设有如下的函数依赖集F,判断是否为最小函数依赖集.
F={A →B,C →E,A →D,B →D,B →C}
[第一步:判断F集合里的子集右边是否非单属性,无,略过“拆”]
[第二步:判断子集左边是否有多余属性,无,略过此步]
[第三步:依次删去子集,判所删子集左属性闭包是否包含右属性]
- 若删去A →B,此时F={C →E,A →D,B →D,B →C},A+={AD},不包含右属性B,保留A →B
- 若删去C →E,此时F={A →B,A →D,B →D,B →C},C+={C},不包含右属性E,保留C →E
- 若删去A →D,此时F={A →B,C →E,B →D,B →C},A+={ABCDE},包含右属性D,删A →D
F={A →B,C →E,B →D,B →C}
- 若删去B →D,此时F={A →B,C →E,A →D,B →C},B+={BCE},不包含右属性D,保留B →D
- 若删去B →C,此时F={A →B,C →E,A →D},B+={B},不包含右属性C,保留B →C
所以F2不是最小函数依赖集,Fmin={A →B,C →E,B →D,B →C}
例题2:出现左属性为单属性,右属性有多属性的情况
设有如下的函数依赖集F,求最小函数依赖集.
F={B→D,D→B,A →BD,C→BD }
[第一步:判断F集合里的子集右边是否为单属性,不全是,拆]
可转化为F={B→D,D→B,A →B,A →D,C→B , C→D}
[第二步:判断子集左边是否有多余属性,无,略过此步]
[第三步:依次删去子集,判所删左属性闭包是否包含右属性]
- 若删去B→D,B+={B},无D属性,保留B→D
- 若删去D→B,D+={D},无B属性,保留D→B
- 若删去A →B,A+={ADB},包含B属性,删去A →B
F={B→D,D→B,A →D,C→B , C→D}
- 若删去A →D,A+={A},无B属性,保留A →D
- 若删去C→B,C+={CDB},包含B属性,删去C→B
F={B→D,D→B,A →D, C→D}
- 若删去 C→D,C+={C},无D属性,删去 C→D
因此Fmin={B→D,D→B,A →D, C→D}
例题3:出现左属性右属性有双属性的情况
设有如下的函数依赖集F,求最小函数依赖集.
F={C →AB,A →B,B →C,A →C,BC →A}
[第一步:判断F集合里的子集右边是否为单属性,不全是,拆]
可转化为F={C →A,C →B,A →B,B →C,A →C,BC →A}
[第二步:判断子集左边是否有多余属性,有,则判断左边属性是否存在冗余的元素]
(1)对于BC →A,判断B是否是多余的,设删去B,F中依旧保留BC →A:
- 此时F={C →A,C →B,A →B,B →C,A →C,BC →A},B+={BCA}
- 包含A,则B是多余的,删去B得到C →A
(2)对于BC →A,判断C是否是多余的,设删去C,F中依旧保留BC →A:
- 此时F={C →A,C →B,A →B,B →C,A →C,BC →A},C+={CAB}
- 包含A,则C是多余的,删去C得到B →A
所以BC →A,可以变成B →A和C →A
同时C →A重复,去重,此时F={C →A,C →B,A →B,B →C,A →C,B →A}
[第三步:依次删去子集,判所删左属性闭包是否包含右属性]
- 若删去C→A,C+={CBA},包含A属性,删去
此时F={C →B,A →B,B →C,A →C,B →A}
- 若删去C→B,C+={C},不包含B属性,保留
- 若删去A →B,A+={ACB},包含B属性,删去
此时F={C →B,B →C,A →C,B →A}
- 若删去B →C,B+={BAC},包含C属性,删去
此时F={C →B,A →C,B →A}
- 若删去A →C,A+={AB},不包含C属性,保留
- 若删去B →A,B+={B},不包含A属性,保留
所以Fmin={C →B,A →C,B →A}
例题4:左右属性出现多属性情况
设有如下的函数依赖集F,求最小函数依赖集.
F={A→BCD,BC →DE,B→D,D→A}
[当两边属性都不是单属性时,首先第一步还是先将右边的属性拆成单属性:]
可转化为F={A→B,A→C,A→D,BC →D,BC →E,B→D,D→A}
[第二步消除左边多余的属性:]
(1)对于BC →D,判断B是否是多余的,设删去B,F中依旧保留BC →D:
- 此时F={A→B,A→C,A→D,BC →D,BC →E,B→D,D→A},C+={C}
- 不包含D,则B不是多余的,保留BC →D
(2)对于BC →D,判断C是否是多余的,设删去C,F中依旧保留BC →D:
- 此时F={A→B,A→C,A→D,BC →D,BC →E,B→D,D→A},B+={BDACE}
- 包含D,则C是多余的,删去C得到B →D
而且B→D在F中重复出现,去重,因此F={A→B,A→C,A→D,B →D,BC →E,D→A}
(3)对于BC →E,判断B是否是多余的,设删去B,F中依旧保留BC→E:
- 此时F={A→B,A→C,A→D,B →D,BC→E,D→A},C+={C}
- 不包含E,则B不是多余的,保留BC→E
(4)对于BC →E,判断C是否是多余的,设删去C,F中依旧保留BC→E:
- 此时F={A→B,A→C,A→D,B →D,BC→E,D→A},B+={BDACE}
- 包含E,则C是多余的,删去C得到B→E
此时F={A→B,A→C,A→D,B →D,B→E,D→A}
[第三步依次删去子集,判所删左属性闭包是否包含右属性]
- 若删去A→B,A+={ACD},不包含B,保留
- 若删去A→C,A+={ABDE},不包含C,保留
- 若删去A→D,A+={ABCDE},包含D,删去
F={A→B,A→C,B →D,B→E,D→A}
- 若删去B →D,B+={BE},不包含D,保留
- 若删去B→E,B+={BDAC},不包含E,保留
- 若删去D→A,D+={D},不包含A,保留
所以Fmin={A→B,A→C,B →D,B→E,D→A}