具有功能依赖性的候选密钥识别

问题描述 投票:2回答:2

我无法理解如何识别函数依赖项中的键。我一直在看例子,例如:

给定ABCD关系,找到所有不包括超密钥的密钥

A -> BC, C -> D, CD -> AB.

这给出了密钥C和A.我认为接近这个问题的方式是BC和D都依赖于A和C,AB依赖于CD,这意味着它们都是密钥,但是因为CD是一个超级密钥(C是一个也是一个密钥的子集),CD不被认为是一个最小的超级密钥。

但是,在另一个例子中,

ABCDE
AB → CD
E → A
D → A

这里唯一的关键显然是BE。为什么这是真的,任何人都可以澄清找到这些问题的关键步骤吗?

谢谢。

relational-database relation functional-dependencies candidate-key
2个回答
5
投票

第二个更简单,所以先拿它。 。 。你知道B必须在任何键中,因为它不在任何右侧。 (也就是说,即使你有ACDE的值,也无法推断出B的值。)同样对于E;所以,任何关键必须包括BE。但BE本身就是一个充分的关键,因为E给你A(因此BE→ABE)而AB给你CD(因此BE→ABCDE)。

在第一个中,我们可以看到A是一个键,因为A给你B和C,C给你D.同样,C是一个键,因为C给你D,C和D一起给你A和B.相反,我们看到A和/或C必须在任何键中,因为每个左手侧至少包括其中一个键。


6
投票

一个更正式的程序。

拿一个FD,例如(例2),AB - > CD。

使用普通FD增加此值,直到您拥有RHS上的所有属性。

你在RHS上缺乏ABE,所以你必须使用普通的FD ABE - > ABE来增加获得ABE - > ABCDE。

这告诉您ABE是超级密钥,因为知道ABE的某一行中的值将足以确定该行中所有属性的值。

现在检查OTHER FD,看看是否有任何一个在这种情况下允许你减少LHS(ABE)。 E - > A允许您从ABE中删除A,因此只保留BE - > ABCDE。减少的规则是:如果另一个FD(E)的LHS是您尝试减少(ABE)的超级密钥的适当子集,那么您可以从超级密钥中删除仅在RHS中提到的所有属性。其他FD(如果您正在查看“其他”FD,例如E - > EA !!!,则无法删除E.)

此过程不适合机械实现,因为您可能还需要查看其他FD的“组合”。然而,大多数用例甚至大多数伪造的类练习通常都不够复杂,不足以导致这个程序失败(即给你留下一个合适的超级钥匙,而不是一个不可简化的超级钥匙)。

(PS找到所有键,你需要将它应用于所有给定的FD)

© www.soinside.com 2019 - 2024. All rights reserved.