如何从功能依赖中获取最小密钥?

Posted

技术标签:

【中文标题】如何从功能依赖中获取最小密钥?【英文标题】:How to obtain a minimal key from functional dependencies? 【发布时间】:2012-04-27 04:51:22 【问题描述】:

我需要一些帮助和指导。

我有以下关系: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

我该如何继续?

【问题讨论】:

我认为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 - 不依赖制造商)来识别它

FastAPI 从 API 密钥获取用户 ID

如何从 ISecurityTokenValidator 正确获取依赖范围的服务

如何在单元测试中从依赖注入容器中获取实例?

如何从 sql server information_schema(元数据)中获取依赖表?

如何从 MySQL (MardiaDB) 依赖表中的最新记录中获取信息?