确定 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)
).
所以,你可以通过拆分原始关系R
在R1,
包含B+
,即BD
,和R2
,包含R - B+ + B
,即 ABC
,正如您正确找到的那样。
如果在任何分解关系中存在违反 BCNF 的依赖关系,则应再次应用此过程。但事实并非如此,因为 R1
中唯一的依赖项是 B → D
,B 是唯一的键,而 [=19= 中的依赖项 AB → C
和 BC → A
], 有键 AB
和 BC
.
此时可以终止进程,因为R1
和R2
都在BCNF中。但我们还应注意,此分解 不会 保留依赖关系,因为 CD → A
和 AD → B
已丢失。
所以我与 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)
).
所以,你可以通过拆分原始关系R
在R1,
包含B+
,即BD
,和R2
,包含R - B+ + B
,即 ABC
,正如您正确找到的那样。
如果在任何分解关系中存在违反 BCNF 的依赖关系,则应再次应用此过程。但事实并非如此,因为 R1
中唯一的依赖项是 B → D
,B 是唯一的键,而 [=19= 中的依赖项 AB → C
和 BC → A
], 有键 AB
和 BC
.
此时可以终止进程,因为R1
和R2
都在BCNF中。但我们还应注意,此分解 不会 保留依赖关系,因为 CD → A
和 AD → B
已丢失。