功能依赖的最小覆盖

时间:2015-10-03 06:48:23

标签: database relational-database normalization functional-dependencies

我在使用这个教科书问题时遇到了麻烦

考虑一组功能依赖关系F = {A→B,B→C,CD→A,AC→D}

计算F的最小封面。

我试图按照简单的步骤来这样做。首先,我可以看到没有右手单身人士可以做。是否有可能在左侧单独输出CD和AC?我需要吗?

这是我的尝试,而不是遵循步骤方法。这是对的吗?

F = { A→ B, B→C, CD→A, AC → D}
=> F = { A → C, CD → A, AC → D}
=> F = { CD → C, AC → D}
=> F = { D→ C, AC → D}
=> F = {AC → C}
=> F = {A->C}

1 个答案:

答案 0 :(得分:0)

如果我理解你的符号,那么最小封面仅包含A→C,但这肯定不是起始F的封面,因为F中的许多依赖关系不能从单一依赖A→C。例如,您如何从A→B派生A→C?在最小的封面中,您可以“简化”功能依赖集,而不会丢失信息。

所以,让我们从头开始,看看如何进行最小化覆盖。

首先,您应该在右侧重写具有多个属性的依赖项,正如您所说,这不是必需的。

然后,对于左边有多个属性的每个依赖项,我们应该看看是否可以删除其中一些属性。只有两种情况,CD→AAC→D。检查以这种方式执行。如果关于F的其他属性的闭包包括右手,则可以消除属性。所以我们必须为第一个依赖计算C +和D +,为第二个依赖计算A +和C +。

C⁺ = {C}
D⁺ = {D}

两个闭包都不包含A,因此必须保持依赖CD→A

A⁺ = {A, B, C, D}
C⁺ = {C}

由于属性A的关闭包含D,因此可以从左侧删除C,并且新的依赖关系集是:

F' = {A→B, B→C, CD→A, A→D}

此时我们需要检查是否可以消除任何功能依赖,通过计算左侧部分相对于其他依赖关系的闭包,并查看此闭包是否包含右手部分

A⁺ = AD
B⁺ = B
CD⁺ = CD
A⁺ = ABC

在任何情况下,闭包都不包含右手,因此F的最小封面为F'