这有点老了,但是有很多观点,所以我认为添加我自己的解释可能会有所帮助。
对于第一个问题:
R = (A, B, C, D, E)
A => B
ED => A
BC => E
基本上,候选键必须满足两个条件:
1) 候选键必须能够确定所有其他变量。这基本上意味着使用候选键中的变量,您应该能够按照功能依赖项中的箭头找到所有其他变量。
2) 候选键必须最小。例如,我们可以从 ABCDE 中找到每个变量,因为 ACBDE 是每个变量已经存在。但是,我们可以去掉一些变量。例如,可以发现 ACD 是一个候选键。由于 ACD 是有效的候选键,并且 ACD 是 ABCDE 的子集,我们知道 ABCDE 不能是候选键。换句话说,我们可以将变量从 ABCDE 中分离出来,并且仍然有一个候选键,所以 ABCDE 不是最小的。
如果您不熟悉使用函数依赖项查找候选键,一个好的开始是尝试随机变量并查看它们是否满足上述两个条件。
让我们从变量 A 开始。我们的第一个函数依赖告诉我们 A 决定 B,所以现在我们有两个变量,A 和 B。但是,AB 不满足任何其他函数依赖,所以我们再倒霉。我们已经确定 A 本身不是候选键(从逻辑上讲,AB 也不是,因为我们已经发现我们不能用 AB 推导出 C、D 和 E)。
接下来,让我们试试 ABC。因为我们知道我们总是可以用 A 得到 B(从 A => B),所以将 A 和 B 放在同一个候选键中并没有什么意义。这是因为如果 ABC 有效,那么 AC 必须有效,因为我们可以从 AC 获得 ABC。
让我们用 AC 而不是 ABC 再试一次。 A 决定 B,所以现在我们有变量 A、B 和 C。BC 决定 E (BC => E),所以现在我们有 A、B、C 和 E。但是,我们无法获得变量 D!事实上,从逻辑上讲,因为 C 和 D 不是任何函数依赖的结果(它们从不在右侧),所以我们知道 C 和 D 必须是每个候选键的一部分(正如在另一个发布)。
我们可以尝试查看 CD 是否是候选键,但从逻辑上讲,由于 C 在功能上不能自行确定任何内容,D 自身不能确定任何内容,而 CD 不能确定任何内容,因此 CD 不能候选键。
让我们试试 ACD。首先,我们知道,A 决定 B,所以我们有变量 A、B、C 和 D。BC 决定 E (BC => E),所以我们有所有 5 个变量,所以我们有一个候选键!
但是,多个候选键是可能的,所以我们还没有完成。请记住,每个键都必须包含 C 和 D,所以让我们尝试 BCD。 BC 决定 E,所以我们有 B、C、D 和 E。ED 决定 A (ED => A),所以我们有所有 5 个变量。我们还有另一个候选键!
让我们尝试最后一个可能的答案:CDE。 ED 确定 A,所以我们有 A、C、D 和 E。A 确定 B,所以我们有所有 5 个变量并且我们有一个候选键。
我们的 3 个可能的候选键是 ACD、BCD 和 CDE。我们知道,如果我们从其中一个键中取出任何变量,它将不是有效键,因此我们知道所有这些键也是最小的。
我们来看第二个问题:
R = (A, B, C, D)
D => B
AB => D
AB => C
C => A
既然我们现在已经掌握了基础知识,那就让我们少试错,多做分析推理。
首先,AB 确定了 C 和 D。另外,A 和 B 显然不是候选键,所以我们知道 AB 是最小的。 AB 是我们的第一个候选键。
CD 确定 A 和 B,而 C 和 D 本身显然不是键,所以 CD 是我们的第二个候选键。
查看我们的函数依赖关系,我们知道如果我们得到 A 和 B 或 C 和 D,我们可以找到所有其他变量。知道了这一点,我们看到因为 D 给了我们 B,所以我们缺少的只是 A。因此,AD 是候选键。
使用相同的逻辑,由于 C 确定 A,如果我们添加 B,我们将拥有 AB,并且能够找到所有缺失的内容。因此BC也是一把钥匙。同样,与本练习的其他候选键一样,BC 非常小。
我们最终可能的候选键是 AB、CD、AD 和 BC。