这里有两个函数依赖关系,它们适用于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没有被保留。我是对还是错?
发布于 2017-06-13 01:46:01
(在这个问题的第一个版本中,您会说,“原来的主键被破坏了”。你的意思似乎是,原来的FD (功能依赖)已经被“破坏”了。(否则,你的陈述就没有意义了。)不要写/想一些模糊的东西,比如“坏了”,努力用适当的技术术语来写/想些清晰而准确的东西。例如,当组件满足他们的FDs时,他们的连接不一定满足最初的FD。有一个更专门的短语: FD没有被保存。)
我们可以随时向BCNF靠拢。但不一定要保护所有的FDs。
如果有人声称分解是BCNF的,并且某些FDs在组件中持有,那么他们应该通过展示如何从BCNF分解算法中得到分解来支持它。(还有其他方法可以从定义中证明这一点,这就是算法是如何工作的。)您可以分解成这些组件,而A->E在R2中保持,但是BCD->E在R1中不存在。ABCD->E不被保存。在将其分解为更小的组件时,没有办法保存它,因为没有任何较小的组件拥有所有这些属性。
您还可以通过一个定理证明{R1,R2}是R的无损分解,即当(当且仅当)公共列包含其中一个列的一个CK (候选键)时,二进制分解是无损的。这里常见的列集是{E},它包括自己,它是R2的CK,因此分解是无损的。您可以通过BCNF的定义来显示它们都在BCNF中。在这里,在每个分量中,非平凡FDs的所有决定因素都是CKs的超集,因此每个都在BCNF中。
组件始终是与其连接的原始组件的投影。因此,在任何将原始值设置为某个值的业务情况下,组件将被设置为对其的投影,并将返回到原始值。因此FD将在连接中保持不变。但是,如果FD不被保留,那么如果我们约束(错误检查)每个FD组件的尝试更新,那么我们就不会约束(错误检查)原来的FD。因此,为了防止组件& join的错误更新,我们需要添加一个不同的约束。
现在你可以问自己,为什么你认为你对FDs被保存在BCNF有一个意见?在数学中,我们没有观点,我们有定理的证明。如果你认为你可以证明或引用它是错误的,问这个理由是否正确。如果你没有证据或推荐信,就不要认为你有自己的观点。如果你不是真的想说你有自己的观点,那就不要说你想说的,说你想说的。也是为了将来--你怎么能回答这个问题呢?你一定得到了一个推荐信,很多都是免费在线提供的。你学到了一些关于BCNF的东西。如果你读过关于BCNF的整个章节,它会告诉你FDs不能总是被保存。所以,在你问问题之前,请做适当的研究。
发布于 2017-06-12 18:37:59
R可以在BCNF中分解。采用经典的分析算法,其结果是:
R1(A, E) {E → A}和
R2 (B, C, D, E) {}但是分解会导致依赖A B C D → E的丢失。请注意,问题中的分解仍然在BCNF中,但是分解仍然会导致相同依赖项的丢失(而在R1中,dependency B C D → E确实是而不是 hold)。
https://stackoverflow.com/questions/44501555
复制相似问题