29

我无法确定关系何时处于 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 形式以及如何判断何时完成。非常感谢任何能在解决这些问题时引导我完成他们的思考过程的人。谢谢!

4

2 回答 2

117

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

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

在您的情况下,可以证明唯一的候选键(最小超级键)是 ACE。因此,两个 FD:A->B 和 C->D 都违反了 BCNF,因为 A 和 C 都不是超级键或 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 的规范化并不能保证这一点。

于 2013-08-23T09:13:35.873 回答
0

1NF -> 2NF -> 3NF -> BCNF

根据给定的 FD 集“ACE”形成密钥。显然 R(A,B,C,D,E) 不在 2NF 中。2NF 分解给出 R1(A,B)、R2(C,D) 和 R3(A,C,E)。这种分解分解的关系在 3NF 和 BCNF 中。

于 2016-04-30T21:06:45.590 回答