如何找到候选键

时间:2017-04-18 07:03:25

标签: database schema normalization functional-dependencies candidate-key

我有一个关系A,B,C,D,E与功能依赖

1)A-> BC

2)CD-> E

3)B-> D

4)E-> A

使用1给出A,D,E然后使用4将得到D,E

使用2给出A,B,C,D然后使用3给出A,B,C并使用1给出A

使用2给出A,B,C,D并且使用1给出A,D

使用4得到B,C,D,E,使用2给出B,C,D,使用3给出B,C

使用3给出A,B,C,E并且使用1给出A,E并且使用4给出E

所以我会有5个超级钥匙? (A,E,AD,BC,DE)。从我的超级钥匙我会选择独特的。

因为我可以从E中获得A,所以我可以删除A和AD(因为DE是相同的),因为我可以从A中获取BC,所以我可以删除它,所以我留下了

E,DE

这会是我的超级钥匙吗?或者只是E?

1 个答案:

答案 0 :(得分:3)

根据定义,关系的候选键K是一组属性,用于确定所有其他属性,以便我们无法从中删除任何属性而不会丢失此属性。

要查找关系的所有键,如果不遵循正式算法,那么您可以从FD的每个行列式检查开始,并通过计算其闭包来查看这是否是(超级或候选)键。 。例如,从A开始,您可以找到:

A+ = A
   = ABC (by using 1)
   = ABCD (by using 3)
   = ABCDE (by using 2)

所以,A确定所有属性,因此是候选键(而不是严格的超级键,因为你不能从中删除任何属性!)

计算其他决定因素的闭包,你可以找到:

CD+ = ABCDE (candidate key, since C+ and D+ do not contain all the attributes)
B+ = BD (not a key)
E+ = ABCDE (candidate key)

现在你有三个候选键,A,E和CD。由于B只确定D,我们可以尝试添加一些东西,看它是否可以成为密钥的一部分。我们添加A或E,因为它们已经是键,并且我们添加D,因为它已经由B确定(因此它确实会产生它)超级钥匙)。所以我们尝试C:

BC+ = ABCDE (candidate key, since B+ and C+  do not contain all the attributes)

所以,最后,我们可以说这个关系有四个(也就是四个)候选键:

A
BC
CD
E