我在使用这个教科书问题时遇到了麻烦
考虑一组功能依赖关系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}
答案 0 :(得分:0)
如果我理解你的符号,那么最小封面仅包含A→C
,但这肯定不是起始F
的封面,因为F
中的许多依赖关系不能从单一依赖A→C
。例如,您如何从A→B
派生A→C
?在最小的封面中,您可以“简化”功能依赖集,而不会丢失信息。
所以,让我们从头开始,看看如何进行最小化覆盖。
首先,您应该在右侧重写具有多个属性的依赖项,正如您所说,这不是必需的。
然后,对于左边有多个属性的每个依赖项,我们应该看看是否可以删除其中一些属性。只有两种情况,CD→A
和AC→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'
。