我正在尝试解决一个有关证明给定分解是有损还是无损的问题
通过应用以下公式验证R(ABCDE)的以下分解中的哪些是无损的或有损的 测试无损连接属性。 F = {AB→C,C→E,B→D,E→A}是功能依赖项的集合 在R上 一世。 R(ABCDE)分解为R1(AB),R2(ADE)和R3(BCD) ii。 R(ABCDE)分解为R1(BCD),R2(ACE)和R3(BD)
**
**
仅当给定表之间具有公共属性并且公共属性是候选键/超级键时,分解才能是无损的。
在第一部分中,R1中没有候选密钥,R2中没有候选密钥,因此我们可以将其称为有损分解吗?
在第二部分中,C是R2的候选密钥,B是R3的候选密钥,但是R1没有密钥,并且R2和R3没有共享公共属性,因此它也不是无损分解吗?
我的解释是否正确?或者还有其他标准?
答案 0 :(得分:1)
说明很明确:“通过对无损连接属性进行测试”。大概这是一个重要的定理,它表示当/ iff ...时,二进制连接/分解是无损的。但是您不必引用它。看你的课本。 (请注意,Wikipedia的文章有问题。)您确实说过“如果没有则只能是无损的”,但这只是说有必要,这是一个方向上的“如果”,而您还没有说什么也足够,那就是另一个方向是“ if”,这是您需要的方向,因此您的推理不正确-除非您只是使用较差的语言并且您的意思是“ iff”。但是,即使使用“ iff”,您的定义也是错误的。您需要说“公共列构成了至少一个组件的超键” 。而且“之间存在公共属性”不属于任何属性,无论联接是否无损,都不需要具有公共属性。没有公共属性意味着公共属性集{}和交叉连接;但是,如果其子集{}是某个组件的CK(该组件最多具有一行),则联接是无损的。--但是您不需要知道这一点,只需使用定理即可。另外,还需要告诉您F是封面,然后告诉我们-或找不到CK。另一个问题是“我们没有CK”(每个模式都有一个CK,因为所有列的集合都构成一个超键),而且总是有琐碎的FD。但是,您不必知道,必须使用定义,定理和算法来查找CK。另外,您还需要找到所给封盖的所有FD,然后使用其中具有所有属性的FD计算每个组件的新CK。还有另一个定理说,闭包的FD恰好是组件中容纳的FD。可能存在给定的FD暗示的FD,并且即使给定的FD也没有它们的所有属性。-但是您不需要知道这一点,只需证明您拥有CK即可通过使用定义,定理和算法证明您拥有FD。但是“属性”定理还涉及 binary 分解-那么您是否被告知要假设但不告诉我们R = R1 JOIN(R2 JOIN R3)的顺序?从FD,覆盖,闭合和CK的定理,算法和定义中可以很清楚地看出来,但是您需要准确地记住定义和定理,然后精确而乏味地应用它们。这就是我刚刚做的。
为什么您对这两个部分的问题有疑问?您为什么不应用“财产”定理?您为什么不解决有关二进制连接的事实呢?
如果您不确定如何做在教科书中看到的练习,并且知道自己不需要创造力,那么您实际上不知道自己在做什么,因此请回到教科书中查找。
通常,我会用以下评论结束像这样的投票问题:
关于“这是正确的”:合理地展示参考书/教科书之后的工作步骤-您可能会发现使您的问题变得不必要的错误,并且我们不知道您要遵循的算法是什么,我们想要检查您的工作但不重做;当算法允许它们时,我们需要您选择;否则,我们无法告诉您您做对还是错了;我们也不想重写您的教科书。请参阅How to Ask,点击谷歌搜索“ stackexchange家庭作业”和投票箭头鼠标悬停文本。
通常,当我在引用的数据库规范化作业中看到良好的F或其他FD集合或列表时,没有任何解释时,我会尝试通过评论以下内容的变体来解决问题:
“我有这些FD”是什么意思? “所有这些FD都持有”?-不可能。 “这些都是持有的非平凡的FD”吗?-不可能。 “这是一些持有的FD”吗?-无法回答问题。找出什么是封面,以及应用特定定义/规则/算法的确切条件。为了确定CK和NF,我们必须给定形成掩体的FD。有时覆盖率极低/无法还原。并且必须提供所有属性的集合。 See this answer.
因此,当您重做此练习时,如果不确定自己在某个时候会做什么并提出其他问题,请务必遵循这些评论。