我需要一些帮助和指导。
我有以下关系:R = {A, B, C, D, E, F}
和一组功能依赖
F = { {AB -> C}; {A -> D}; {D -> AE}; {E -> F}; }
R的主键是什么?
如果我应用推理规则,我会获得这些额外的函数依赖:
D -> A
D -> E
D -> F
D -> AEF
A -> E
A -> F
A -> DEF
如何继续?
答案 0 :(得分:5)
有一种众所周知的算法可以做到这一点。我不记得了,但是练习似乎很简单,不使用它。
我认为这完全是关于传递性的:
CurrentKey = {A, B, C, D, E, F}
你知道D确定E和E确定F.因此,D通过传递性确定F.由于F没有确定任何东西,我们可以删除它,因为E可以从D获得,我们也可以删除它:
CurrentKey = {A, B, C, D}
由于AB确定C和C没有确定任何我们知道它不能成为密钥的一部分,所以我们将其删除:
CurrentKey = {A, B, D}
最后我们知道A确定D所以我们可以从密钥中删除后者:
CurrentKey = {A, B}
如果您拥有此可能的密钥,则可以重新创建所有功能依赖项,这是一个可能的密钥。
PS:如果你碰巧有这个算法,请发布它,因为我很乐意重新学习:)
答案 1 :(得分:-1)
算法:密钥计算(用x = call调用)
procedure key(x;A;F)
foreach ! B 2 F do
if x and B 2 x and B ̸2 then
return; /* x not minimal */
fi
od
if x+ = A then
print x; /* found a minimal key x */
else
X any element of A x+;
key(x [ fXg;A;F);
foreach ! X 2 F do
key(x [ ;A;F);
od
fi