确定具有功能依赖性的候选键是简单的

时间:2012-11-29 15:57:07

标签: database relational-database functional-dependencies

设R(A,B,C,D,E)为关系模式,F = {A→C,B→D,C→E,E→A},找到所有候选键。

我认为由于无法映射,因此本集中不存在CK。 B或D除了B之外的任何其他关系 - > D.这是否意味着没有Candiate Keys?虽然我能够将A映射到除B和D之外的所有其他实体。

4 个答案:

答案 0 :(得分:3)

规范化的第一步是找到关系的所有键。以下是一些可以帮助找到密钥的事实:

  1. 如果某个属性不在任何一个FD中,那么它就在每个键中。

  2. 如果某个属性出现在FD的右侧,但从未出现在左侧,则它永远不会出现在某个键中。

  3. 如果某个属性出现在FD的左侧,但从未出现在右侧,那么它就在每个键中。

  4. 如果在FD的右侧和FD的左侧都出现属性,那么就无法对该属性说任何话。
  5. 要查找密钥,请确定上述每种情况中的属性。第一种和第三种情况中的那些必须在每个键中。将这组属性称为核心。计算由核心确定的属性。这被称为核心的封闭。如果所有属性都在核心的闭包中,那么核心不仅是一个密钥,它也是唯一的密钥。如果核心的闭包不是整个属性集,那么一些属性将会丢失。记下这组属性,并删除上面第二组中的任何属性(即,它出现在FD的右侧,但从不出现在左侧)。这些是外在属性。要获得密钥,必须向核心添加一个或多个外部属性。因此,将它们添加到核心,一次一个,然后一次两个,依此类推,直到找到每个密钥。

答案 1 :(得分:2)

有三个候选键。

B没有出现在任何功能依赖的右侧。这意味着B必须是每个候选键的一部分。我认为单独并不能保证至少有一个候选密钥,但从检查中可以清楚地看出AB是这里三个候选密钥之一。

您的教科书应包含至少一种用于确定所有候选键集的算法。如果你很幸运,它包括一种适用于纸和笔的算法,另一种适用于通过编程实现自动化。

答案 2 :(得分:0)

由于B不在右侧,因此B应该是候选键的一部分,并且A和C出现在两侧,因此它们可以与B形成超级键。映射AB和BC是超级键和因为候选键是最小超级键,所以AB和BC是候选键。

答案 3 :(得分:0)

严格仅在所有功能依赖关系的左侧的每个属性都是必须构成每个候选键的一部分的属性。

下一步是要了解这样的属性是否可以单独生成或确定模式中的所有属性。如果是,则该属性是其原始独立形式的候选键。如果不是,则将该属性与每个其他属性组合在一起,一次一个,一次两个,依此类推。遍历整个属性集的所有此类最小集都可以称为候选键