4

假设我们有以下功能依赖:

AB -> C 
DEG -> H
A -> B
DG -> H

我们可以看到,由于B+的闭包,可以去掉B,即(G-(AB ->C) U(A -> C) = ACB

为了找到最小覆盖,我如何处理关于 DEG -> H,DG -> H 的其他左手冗余 - 这些可以减少吗?如果可以,你能解释一下使用闭包!

非常感谢,马修

4

1 回答 1

3

有一些规则可以做到这一点。这真的很容易。函数依赖集是最小的;

  1. 如果依赖项的右侧只有单个属性。和...
  2. 没有可以删除的功能依赖,这是保留原始封面的一种方式。和...
  3. 您无法从依赖项左侧删除属性并保留原始封面

因此,如果您正在寻找一个最小的封面,您必须确保这些。当然,您必须保持闭包等效。

如果你看看:

AB -> C 
DEG -> H
A -> B
DG -> H

您可以轻松找到冗余。没有必要同时包含 DEG → H 和 DG → H,因为 DG → H 已经涵盖了 DEG → H 涵盖的所有内容。所以你可以删除它。

仍然等效:

AB -> C 
A -> B
DG -> H

您仍然可以从第一行中看到您可以删除 B,因为它在功能上取决于 A。

仍然等效:

A -> C 
A -> B
DG -> H

我们找到了一个最小的封面。没有任何依赖可以被移除来保持闭包,并且右侧只有单属性,而DG是左侧唯一的双属性,必须保留。我们不能既不删除 D 也不删除 G 并保留原来的闭包。

我们可以使用阿姆斯壮公理证明这一点。如果我们能得到原始集合,那么这确实是一个等价的最小集合。(我稍后会发布 - 我希望它是正确的。)

于 2012-10-27T07:28:39.757 回答