gpt4 book ai didi

relational-database - 将关系分解为 BCNF

转载 作者:行者123 更新时间:2023-12-03 11:03:20 25 4
gpt4 key购买 nike

我无法确定关系何时处于 Boyce-Codd 范式以及如何将其分解为 BCNF 信息(如果不是)。鉴于这个例子:

R(A, C, B, D, E) 具有函数依赖关系:A -> B, C -> D

我该如何分解它?

我采取的步骤是:

A+ = AB  
C+ = CD
R1 = A+ = **AB**
R2 = ACDE (since elements of C+ still exist, continue decomposing)
R3 = C+ = **CD**

R4 = ACE (此关系中不存在 FD 闭包)

所以现在我知道 ACE 将构成整个关系,但分解的答案是:AB、CD、ACE。

我想我正在努力解决如何将关系正确分解为 BCNF 形式以及如何判断何时完成。真的很感激任何能在解决这些问题时引导我完成他们的思考过程的人。谢谢!

最佳答案

尽管问题很老,但其他问题/答案似乎并没有提供关于确定和分解与 BCNF 的关系的非常清晰的分步一般答案。

1.确定BCNF:
要使关系 R 在 BCNF 中,所有在 R 中成立的函数依赖(FD)需要满足行列式 X 都是 R 的超键的性质。即如果 X->Y 在 R 中成立,则 X 必须是R 在 BCNF 中。

在您的情况下,可以证明唯一的候选键(最小超键)是 ACE。
因此,两个 FD:A->B 和 C->D 都违反了 BCNF,因为 A 和 C 都不是 super 键或 R。

2.将R分解成BCNF形式:
如果 R 不在 BCNF 中,我们将 R 分解为一组在 BCNF 中的关系 S。
这可以通过一个非常简单的算法来完成:

Initialize S = {R}
While S has a relation R' that is not in BCNF do:
Pick a FD: X->Y that holds in R' and violates BCNF
Add the relation XY to S
Update R' = R'-Y
Return S

在您的情况下,迭代步骤如下:
S = {ABCDE}       // Intialization S = {R}
S = {ACDE, AB} // Pick FD: A->B which violates BCNF
S = {ACE, AB, CD} // Pick FD: C->D which violates BCNF
// Return S as all relations are in BCNF

因此,R(A,B,C,D,E) 被分解为一组满足 BCNF 的关系:R1(A,C,E)、R2(A,B) 和 R3(C,D)。

还要注意,在这种情况下,函数依赖被保留,但对 BCNF 的规范化并不能保证这一点。

关于relational-database - 将关系分解为 BCNF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com