依据函数依赖关系推导候选键

34

假设有一个关系R,其属性为ABCDE。以下是给定的依赖关系:A -> B,BC -> E和ED -> A。答案已经给出,是CDE、ACD和BCD。我只需要知道如何得出答案。谢谢。

4个回答

93

候选键是最小的超键。换句话说,键中没有不必要的属性。找到候选键的第一步是找到所有超键。对于那些不熟悉的人,超键是一个属性集,其闭包是所有属性的集合。换句话说,超键是一个您可以从中开始,并按照功能依赖性,将引导您到包含每个属性的集合的属性集。

由于我们有以下功能依赖关系:A -> B,BC -> E和ED -> A,因此我们有以下超键:

  • ABCDE(所有属性始终是超键)
  • BCED(我们可以通过ED -> A获得属性A)
  • ACDE(只需通过A -> B添加B)
  • ABCD(只需通过BC -> E添加E)
  • ACD(我们可以通过A -> B获得B,然后通过BC -> E获得E)
  • BCD(我们可以通过BC -> E获得E,然后从ED -> A获得A)
  • CDE(我们可以通过ED -> A获得A,然后从A -> B获得B)

(这里的一个技巧是,由于C和D从未出现在功能依赖关系的右侧,因此每个键都必须包括C和D)

现在我们有了所有的超键,我们可以看到只有最后三个是候选键。因为前四个都可以被删减。但是我们不能从最后三个超键中取走任何属性,并仍然使它们保持超键。

因此,候选键是:ACD,BCD和CDE。


11
要找到候选键,您需要将FD(函数依赖)分割成左、中、右属性: - 左侧包括仅出现在左侧的属性(CD) - 中间包括既出现在左侧又出现在右侧的属性(ABE) - 右侧包括仅出现在右侧的属性(无)
现在从左侧找到属性的闭包: * CD+ -> CD 由于我们没有得到关系的所有属性,我们需要逐个添加中间属性(ABE)并再次尝试找到闭包。
所以: * CDA+ -> CDABE(CDA是候选键) * CDB+ -> CDBEA(CDB是候选键) * CDE+ -> CDEAB(CDE是候选键)

1
使用算法; 1.选择任何属性或一组属性 例如:ACD 2.选择第一个提到的函数依赖关系 例如:A -> B 3.函数依赖关系的左侧是否是您在步骤1中选择的属性/属性集的子集? 如果是,请将函数依赖关系的右侧添加到属性中。如果不是,请忽略此功能依赖关系。 例如:A是ACD的子集。因此将B添加到ACD中。现在的ACD是ABCD 4.现在转到下一个函数依赖关系。重复步骤3。 例如:BC -> E BC是ABCD的子集。因此,ABCD现在是ABCDE 5.如果您现在拥有所有属性,则可以停止。 如果您没有所有属性,请继续进行下一个函数依赖关系并重复步骤3。如果您已经达到了最后一个函数依赖关系并且没有所有属性,请返回第一个函数依赖关系并重复步骤3和4。在这个循环中保持循环,直到您拥有的属性集不管重复步骤3的函数依赖关系如何都不会改变。

例如:当我拥有属性集ACD的ABCDE时,我可以停止。

如果您拥有所有属性,则具有超键。 例如:ACD是一个超键,因为我拥有ABCDE。


不错,这比“自上而下”方法容易多了 :) - ztv
3
步骤二至五只是计算闭包,而第一步则是验证所选属性集是否为超键,而非寻找超键。 - SnzFor16Min

-6

CD是候选键,因此ACD、BCD、CDE都可以成为候选键。C、D在任何功能依赖的右侧都不出现,这就是为什么CD是候选键的原因。

这个链接将帮助您理解。


10
CD 不是候选关键字。属性 C 和 D 在任何函数依赖的右侧都没有出现。这并不意味着 CD 是候选关键字,而是意味着每个候选关键字都必须包括 {CD}。 - Mike Sherrill 'Cat Recall'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接