如何找到一组功能依赖的最小覆盖?

时间:2014-09-20 18:53:50

标签: database functional-dependencies

我想找到以下功能依赖集的最小覆盖:

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

所以我们可以说这些功能依赖是该集的最小覆盖,是真的吗?以及我们如何推断出集合的关键字?

1 个答案:

答案 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书。