【问题标题】:Finding candidate keys for given relation查找给定关系的候选键
【发布时间】:2014-02-09 01:16:53
【问题描述】:
R = (A, B, C, D, E)

函数依赖是:

A -> B
ED -> A
BC -> E

然后它将候选键列出为:

ACD, BCD, CDE

这些候选密钥是如何从上述 FD 中派生出来的?

同样,

R = (A, B, C, D)

函数依赖是:

D -> B 
AB -> D 
AB -> C 
C -> A

然后它将候选键列出为:

AB, BC, CD, AD

同样,我的问题是我不确定候选密钥是如何从 FD 派生的。

【问题讨论】:

    标签: functional-dependencies candidate-key


    【解决方案1】:

    属性闭包是关系的所有属性的集合的最小属性集称为关系的候选键。

    在给定 a 的情况下为 R 找到密钥 K 的算法 函数依赖集 F

    输入:一个全称关系 R 和一组 对属性的功能依赖 F R.

       1. Set K:= R;
       2. For each attribute A in K {
          Compute (K - A)+ with respect to F;
          If (K - A)+ contains all the attributes in R,
              then set K := K - {A};
    
    }
    

    根据该算法,属性闭包 ACD+、BCD+、CDE+ 包含 R 和最小的所有属性。

    【讨论】:

      【解决方案2】:

      这有点老了,但是有很多观点,所以我认为添加我自己的解释可能会有所帮助。

      对于第一个问题:

      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。

      【讨论】:

      • 非常感谢。在过去的一个小时里,我一直在寻找关于这个确切问题的帮助,这真的澄清了事情?你摇滚!
      【解决方案3】:

      本文介绍了如何从给定关系派生候选键。
      http://en.wikipedia.org/wiki/Candidate_key
      另请查看:candidate keys from functional dependencies
      功能依赖。
      这个也不错,我觉得:
      http://www.cs.newpaltz.edu/~pletcha/BuildingCandidateKeys.html
      所以基本上是:
      A => B(第一种情况):
      ED => A
      BC => E
      因为 C 和 D 不依赖于任何 fd,显然 CD 是每个候选键的一部分。

      ACD、BCD、CDE
      第二个:
      D => B
      AB => D
      AB => C
      C=>A

      所有单曲都依赖于其中一个 fd,因此它们都不包含在所有候选键中。
      A 不依赖于 D 也不依赖于 B,既不是显式的也不是隐式的。所以 AD 和 AB 是一个候选键。 B 不依赖于 C 和 A,因此 AB 和 BC。 C 不依赖于 D,
      因此 CD。

      AB、BC、CD、AD

      这个也很有用: http://csc.lsu.edu/~jianhua/fd_slide2_09.pdf

      【讨论】:

        猜你喜欢
        • 2012-01-04
        • 1970-01-01
        • 2017-04-27
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多