通过分解实现BCNF

时间:2017-06-12 14:11:44

标签: database database-normalization functional-dependencies bcnf

以下是R的两个功能依赖项。

  

R(A,B,C,D,E){ABCD-> E,E-> A}

我朋友的答案是它可以分解为BCNF。

  

R1(B,C,D,E){BCD-> E}

     

R2(A,E){E-> A}

然而,我认为这不可能是真的,因为原始的功能依赖性ABCD-> E尚未被保留。因此,在我看来,R不能被分解为BCNF,因为原始功能依赖性ABCD-> E尚未被保留。我是对还是错?

2 个答案:

答案 0 :(得分:1)

R 可以在BCNF中分解。使用经典分析算法,结果是:

R1(A, E) {E → A}

R2 (B, C, D, E) {}

但是分解会导致依赖性丢失A B C D → E。请注意,您的问题中的分解仍然在BCNF中,但仍然会导致相同依赖性的丢失(在R1中,依赖性B C D → E保持)。

答案 1 :(得分:1)

(在这个问题的第一个版本中,你说,“原来的主键已被破坏了。”你似乎意味着,原来的 FD (功能依赖)已被“破坏”。(否则,你的陈述是没有意义的。)而不是编写/思考像“破碎”这样模糊的东西,而是努力使用适当的技术术语来编写/思考一些清晰和精确的东西。例如,当组件满足他们的FD时,他们的联合不会t必然满足原始FD。为此恰好有一个更专业的短语:FD没有被保留。)

我们总能规范化到BCNF。但不一定要保留所有的FD。

如果某人声称对BCNF进行了分解,并且某些FD保留在组件中,那么他们应该通过展示他们如何从BCNF分解算法获得该分支来支持它。 (还有其他方法可以从定义中证明它,这就是算法如何被证明有效。)你可以分解为那些组件,而A-> E在R2中保存,但是BCD-> ; E不在R1中。并且不保留ABCD-> E.在分解为较小的组件时无法保留它,因为没有较小的组件具有所有这些属性。

您还可以通过一个定理证明{R1,R2}是R的无损分解,该定理表明当(如果且仅当)公共列包含其中一个的CK(候选键)时,二进制分解是无损的。他们。这里的公共列集是{E},其中包含自身,它是R2的CK,因此分解是无损的。您可以通过BCNF的定义显示它们都在BCNF中。这里,在每个分量中,非平凡FD的所有决定因素都是CK的超集,因此每个都在BCNF中。

组件始终是连接回原件的原件的投影。因此,在将原始设置为特定值的任何业务情况中,组件将被设置为对其的投影并将连接回原始组件。因此FD将在加入中保留。但是如果FD没有被保留,那么如果我们约束(错误检查)每个FD的组件的尝试更新,那么我们不会最终限制(错误检查)每个FD的原始。因此,为了防止错误地更新组件和加入我们需要添加一个不同的约束。

PS现在您可以问自己,为什么您认为您对BCNF中保存的FD有意见?在数学中我们没有意见,我们有定理的证明。如果您认为可以显示或引用它是错误的,请询问该理由是否正确。如果您没有证据或参考,请不要认为您有任何意见。如果你真的不是说你有意见,那就不要说你做了,说出你做的意味着什么。也是为了将来 - 你怎么能回答这个问题?你必须得到一个参考,许多可用,包括免费在线。您已经了解了有关BCNF的某些内容。如果您已经阅读了有关BCNF的整个部分,它会告诉您FD并不总是被保留。所以请在提出问题之前做适当的研究。