【问题标题】:How to find a candidate key如何找到候选键
【发布时间】:2017-04-18 07:03:24
【问题描述】:

我有一个具有函数依赖关系的关系 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?

【问题讨论】:

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


    【解决方案1】:

    根据定义,关系的候选键 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
    

    【讨论】:

    • 谢谢!我很困惑,因为我认为我们删除了可以由另一个键确定的键。就像从列表中删除 BC 一样,因为 A-> BC。不过我现在明白了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多