【问题标题】:Determining BCNF violations确定 BCNF 违规
【发布时间】:2017-03-31 20:19:21
【问题描述】:

所以我有一个与 FD 的关系模式,如下所示:

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

现在我试图找出所有违反 BCNF 的行为,然后分解表格。我计算了所有 FD 的左侧,发现了这个:

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

所以我把表格分解成这样:

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

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

【问题讨论】:

    标签: database functional-dependencies bcnf


    【解决方案1】:

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

    因此,您可以通过将原始关系R 拆分为包含B+B+R2,其中包含R - B+ + B,即ABC,就像您一样正确找到。

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

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

    【讨论】:

    • 我唯一想知道的是 CD 和 AD,所以我认为我无法保留这些依赖项。
    • 是的,众所周知,在 BCNF 中分解关系的算法会导致依赖关系丢失。考虑例如 AD-> B。要保留此依赖关系,您可以添加一个新关系 ADB,但随后它将具有违反正常形式的依赖关系 B-> D。所以你应该在BD和AB中分解,你会再次失去依赖。
    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多