令 R(A,B,C,D,E) 为关系模式,F = {A→C, B→D, C→E, E→A},找到所有候选键。
我相信由于无法映射,该集合中不存在CK。B 或 D 除了 B -> D 之外的任何其他关系。这是否意味着没有候选键?尽管我能够将 A 映射到除 B 和 D 之外的所有其他实体。
令 R(A,B,C,D,E) 为关系模式,F = {A→C, B→D, C→E, E→A},找到所有候选键。
我相信由于无法映射,该集合中不存在CK。B 或 D 除了 B -> D 之外的任何其他关系。这是否意味着没有候选键?尽管我能够将 A 映射到除 B 和 D 之外的所有其他实体。
规范化的第一步是找到关系的所有键。以下是一些有助于找到钥匙的事实:
如果属性不在任何 FD 中,则它在每个键中。
如果一个属性出现在 FD 的右侧,但从未出现在左侧,则它永远不会出现在键中。
如果一个属性出现在 FD 的左侧,但从未出现在右侧,则它存在于每个键中。
要查找键,请确定上述每种情况中的属性。第一种和第三种情况中的那些必须在每个键中。称这组属性为核心。计算由核心确定的属性。这称为核心的闭合。如果所有的属性都在封闭的核中,那么核不仅是一把钥匙,它也是唯一的钥匙。如果关闭的核心不是整个属性集,那么就会丢失一些。写下这组属性,并删除上面第二组中的任何属性(即,它出现在 FD 的右侧,但从不出现在左侧)。这些是外在属性。要获得一把钥匙,必须向核心添加一个或多个外部属性。因此,将它们添加到核心,一次添加一个,然后一次添加两个,依此类推,
有三个候选键。
B 不会出现在任何函数依赖项的右侧。这意味着 B 必须是每个候选键的一部分。我认为仅此一项并不能保证至少有一个候选键,但通过检查应该清楚 AB 是这里的三个候选键之一。
你的教科书应该至少包含一个算法来确定所有候选键的集合。如果幸运的话,它包括一种适用于纸和铅笔的算法,以及另一种适用于通过编程实现自动化的算法。
在所有功能依赖项中严格仅位于左侧的每个属性都是必须构成每个候选键的一部分的属性。
下一步是实现单独这样一个属性是否可以生成,或者确定模式内的所有属性。如果是,则该属性是其原始独立形式的候选键。如果不是,则将该属性与其他每个属性分组,一次一个,一次两个,依此类推。所有这些遍历整个属性集的最小集合都可以称为候选键。
由于 B 不在右手边,所以 B 应该是候选键的一部分,并且 A 和 C 出现在两侧,因此它们可以与 B 形成超级键。在映射上 AB 和 BC 是超级键并作为候选键是最小的超级键,所以 AB 和 BC 是候选键。