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

dxu*_*dxu 2 relational-database relation functional-dependencies candidate-key

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

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

A -> BC, C -> D, CD -> AB.
Run Code Online (Sandbox Code Playgroud)

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

但是,在另一个例子中,

ABCDE
AB ? CD
E ? A
D ? A
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Erw*_*out 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(你不能删除E,如果你正在看一个"其他"FD,如E - > EA !!!).

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

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


rua*_*akh 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必须在任何键中,因为每个左手侧至少包括其中一个键.