我想找到以下功能依赖集的最小覆盖:
A -> BC
B -> C
A -> B
AB -> C
第一步:将每个功能依赖关系的RHS分解为单个属性:
A -> B
A -> C
B -> C
A -> B
AB -> C
然后我会移除两个 A -> B
,所以我们会得到:
A -> B
A -> C
B -> C
AB -> C
第二步:尝试从每个功能依赖关系的LHS中删除不必要的属性(其LHS具有2个或更多属性):
对于AB -> C
,请检查A是否必要:
将AB -> C
替换为B -> C
,因此如果B +包含C,则A是不必要的:
B+ = B (B -> C)
= BC (so A is unnecessary)
通过以下方式检查B是否必要:
将AB -> C
替换为A -> C
,如果A +包含C则不需要B:
A+ = A (A -> B)
= AB (A -> C)
= ABC (so B is unnecessary)
现在我们有:
A -> B
A -> C
B -> C
第三步:尝试删除不必要的功能依赖项:
A -> B
检查A +是否包含B而不使用A -> B
:
A+ = A (A -> C)
= AC (so A -> B is necessary)
A -> C
检查A +是否包含C而不使用A -> C
:
A+ = A (A -> B)
= AB (so A -> C is necessary)
B -> C
检查B +是否包含C而不使用B -> C
:
B+ = B (so B -> C is necessary)
现在我们有:
A -> B
A -> C
B -> C
最后,将具有共同LHS的功能依赖关系组合在一起:
A -> BC
B -> C
所以我们可以说这些功能依赖是该集的最小覆盖,是真的吗?以及我们如何推断出集合的关键字?
答案 0 :(得分:1)
为F计算规范封面:
使用union规则替换任何具有公共左侧的依赖项。
所以组合A - > BC和A - > B成A - >公元前 现在设置为{A - >; BC,B - > C,AB - > Ç}
A在AB中是无关紧要的 - > ç
检查从AB中删除A的结果 - > C由其他依赖项隐含
是:实际上,B - > C已经存在!
现在设置为{A - >; BC,B - > Ç}
C在A - >中是无关紧要的。 BC
检查是否A - >; C is B和其他依赖关系
逻辑上暗示了C.是:在A上使用及物性 - > B和B - > C.
可以在更复杂的情况下使用A的属性闭包
规范封面是:A - > B,B - > ç
来源:Korth,sudarshan DBMS书。