如何从功能依赖中获取最小密钥?
Posted
技术标签:
【中文标题】如何从功能依赖中获取最小密钥?【英文标题】:How to obtain a minimal key from functional dependencies? 【发布时间】:2012-04-27 04:51:22 【问题描述】:我需要一些帮助和指导。
我有以下关系:R = A, B, C, D, E, F
和函数依赖集
R 的主键是什么?
如果我应用推理规则,我会得到这些额外的函数依赖:
D -> A
D -> E
D -> F
D -> AEF
A -> E
A -> F
A -> DEF
我该如何继续?
【问题讨论】:
我认为A和D在方案中是1-1等价的。 此过程不一定确定主键(单个键)。 (“主键”正在逐渐成为主要的 SQL 概念,而不是关系概念。)正确应用此过程将为您提供 set 候选键。如何从一组候选键中选择一个主键不是该过程的一部分。 是的,你是对的。此过程将为您提供候选键:)) 【参考方案1】:有一个众所周知的算法可以做到这一点。我不记得了,但练习似乎很简单,不用它。
我认为这都是关于传递性的:
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:如果你碰巧有这个算法,请把它贴出来,我很乐意重新学习:)
【讨论】:
非常感谢 :) 我还没有听说过任何算法,我只知道一些可以用来推导新的函数依赖关系的推理规则 :)) @user1285737 无需感谢,这就是接受答案的原因:) 无论如何,无论关系和功能依赖的复杂性如何,都有一种算法可以为您提供正确的结果。我希望我能记住它:'( 不是 B, D 也是候选键,因此可以选择为主键吗?谢谢 是的。可以有多个候选键,但只有一个是主键。 谢谢 :) 我假设当我将关系转换为 2NF、3NF 等时,我需要知道所有候选键??【参考方案2】:算法:密钥计算(调用 x = ∅)
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
【讨论】:
以上是关于如何从功能依赖中获取最小密钥?的主要内容,如果未能解决你的问题,请参考以下文章
android ios 任何 BLE 的任何唯一密钥(我们正在使用所有 BLE - 不依赖制造商)来识别它
如何从 ISecurityTokenValidator 正确获取依赖范围的服务