给定具有属性 ABCDE 的关系 R。您将获得以下依赖项:A -> B、BC -> E 和 ED -> A。我已经有了 CDE、ACD 和 BCD 的答案。我只需要知道该怎么做。谢谢。
4 回答
候选键是最小的超键。换句话说,键中没有多余的属性。找到候选键的第一步是找到所有的超级键。对于那些不熟悉的人,超级键是一组属性,其闭包是所有属性的集合。换句话说,超级键是您可以开始的一组属性,并且遵循功能依赖关系,将引导您找到包含每个属性的集合。
由于我们有函数依赖关系:A -> B、BC -> E 和 ED -> A,我们有以下超键:
- ABCDE(所有属性始终是超级键)
- BCED(我们可以通过 ED -> A 得到属性 A)
- ACDE(只需通过 A -> B 添加 B)
- ABCD(只需添加 E 到 BC -> E)
- ACD(我们可以通过 A -> B 得到 B,然后我们可以通过 BC -> E 得到 E)
- BCD(我们可以通过 BC -> E 得到 E,然后从 ED -> A 得到 A)
- CDE(我们可以通过 ED -> A 获得 A,然后从 A -> B 获得 B)
(这里要实现的一个技巧是,由于 C 和 D 永远不会出现在函数依赖的右侧,因此每个键都必须包含 C 和 D)
现在我们有了所有的超级键,我们可以看到只有最后三个是候选键。由于前四个都可以修剪下来。但是我们不能从最后三个超级键中删除任何属性,并且仍然让它们仍然是超级键。
因此候选键是:ACD、BCD 和 CDE。
希望有帮助,
要找到候选键,您需要将 FD 拆分为左、中、右的属性 - 左包括仅显示在左侧 (CD) 的属性 - 中包括显示在左右两侧的属性 ( ABE) - 右侧包括仅显示在右侧的属性(无)
现在从左边找到属性的闭包: * CD+ -> CD 由于我们没有得到关系的所有属性,我们需要一次添加一个中间属性(ABE)并尝试再次找到闭包。
所以: * CDA+ -> CDABE(CDA 是候选键) * CDB+ -> CDBEA(CDB 是候选键) * CDE+ -> CDEAB(CDE 是候选键)
使用算法;
1.获取任何属性或属性集
例如:ACD
2.取第一个提到的函数依赖
例如:A -> B
3. 依赖项的 LHS 是您在步骤 1 中选择的属性的子集吗?
如果是,则将功能依赖的 RHS 添加到属性中。如果否,则忽略此功能依赖。
例如:A 是 ACD 的一个子集。所以将 B 添加到 ACD。ACD 现在是 ABCD
4.现在转到下一个函数依赖。重复步骤3。
例如:BC -> E BC 是 ABCD 的子集。所以 ABCD 现在是 ABCDE
5.如果你现在拥有所有属性,你可以停止。
如果你没有所有属性,继续下一个函数依赖并重复步骤 3。如果你到达最后一个函数依赖并且没有所有属性,返回第一个函数依赖并重复步骤 3 和 4 . 继续在这个循环中循环,直到无论您重复步骤 3 的功能依赖关系如何,您所拥有的属性集都不会改变。
例如:因为我有属性集 ACD 的 ABCDE,所以我可以停下来。
如果您拥有所有属性,则您有一个超级键。例如: ACD 是超级键,因为我有 ABCDE。
CD是候选键,所以ACD、BCD、CDE都可以是候选键。C,D 不会出现在任何函数依赖项的右侧,这就是 CD 是候选键的原因。
这将帮助您理解。