尽管这个问题很老,但其他问题/答案似乎并没有就确定和分解与 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 的规范化并不能保证这一点。