确定 BCNF 违规

Determining BCNF violations

所以我与 FD 的关系模式如下所示:

R(A,B,C,D): AB -> C, B -> D, CD -> A, AD -> B

现在我试图找到所有 BCNF 违规,然后分解 table。我计算了所有 FD 的左侧并发现:

AB+ = {A, B, C, D}
B+ = {B, D} <- violation
CD+ = {C, D, A, B}
AD+ = {A, D, B, C}

所以我将 table 分解为如下所示:

R1 (B, D)
R2 (A, B, C)

唯一的问题是,我不确定在分解 table 时我是否只需要这样做,或者我是否需要做更多的事情。我主要对 AB、CD 和 AD 部分感到困惑。

在您的示例中,B → D 实际上是唯一违反 BCNF 的依赖项,因为在所有其他依赖项中,左侧是一个键(实际上关系的所有键都是 (A D)(A B)(B C)(C D)).

所以,你可以通过拆分原始关系RR1,包含B+,即BD,和R2,包含R - B+ + B,即 ABC,正如您正确找到的那样。

如果在任何分解关系中存在违反 BCNF 的依赖关系,则应再次应用此过程。但事实并非如此,因为 R1 中唯一的依赖项是 B → D,B 是唯一的键,而 [=19= 中的依赖项 AB → CBC → A ], 有键 ABBC.

此时可以终止进程,因为R1R2都在BCNF中。但我们还应注意,此分解 不会 保留依赖关系,因为 CD → AAD → B 已丢失。