我有以下问题:
AB -> CD
H->B
G ->DA
CD-> EF
A -> HJ
J>G
我理解第一步(分解右侧)并获得以下结果:
AB -> C
AB -> D
H -> B
G -> D
G -> A
CD -> E
CD -> F
A -> H
A -> J
J -> G
我明白A - > h和h - > b,因此我可以从AB中删除B - > c和ab - > D,得到:
A -> C
A -> D
H -> B
G -> D
G -> A
CD -> E
CD -> F
A -> H
A -> J
J -> G
接下来的步骤是我无法计算的(减少左侧)
任何帮助将不胜感激。
答案 0 :(得分:2)
您已经缩小了封面中每个FD的左侧。下一步 是将该覆盖范围内的FD数量减少到最少。
通过忽略一个FD来做到这一点 时间,然后看看 你仍然可以使用另一个来提出相同的依赖属性集(闭包) 封面上的FD使用忽略的FD的LHS作为起点。如果你 可以,然后你忽略的FD是多余的,可能会从封面上掉下来。做这个 对于每个剩余的FD。剩下的是最小的封面。
首先,使用起始封面中的所有FD,派生属性集
由FD的LHS决定你会忽略。对于A
,闭包是:
A, B, C, D, E, F, G, H, J
尝试重新启动A -> D
并重新计算闭包......
initial closure: A
use A -> C closure: A, C
use A -> H closure: A, C, H
use A -> J closure: A, C, H, J
use J -> D closure: A, C, D, H, J
use J -> G closure: A, C, D, G, H, J
use H -> B closure: A, B, C, D, G, H, J
use CD -> E closure: A, B, C, D, E, G, H, J
use CD -> F closure: A, B, C, D, E, F, G, H, J
可以在不引用的情况下派生同一组属性
FD A -> D
所以这个FD是多余的,可以从封面上删除。实际上我们可以
一旦D
出现在派生的属性集中,就会停止进程 - 但是对于完整性
该过程继续证明无论是否可以实现完全相同的属性集
A -> D
。
请注意,给定FD组的最小覆盖率不必是唯一的。但是,任何给定的最小覆盖 必须包含与原始封面相同的依赖集,以便从最小封面中删除任何一个依赖都不会产生相同的封闭。