给定一个关系,一组函数依赖关系,并将它分解为多个关系(> 2),是否有一些方法可以检查这种分解是无损还是有损?
为了将R分解为两个关系R1和R2,我们检查R1和R2的交集是否形成R1或R2的主键。如果是,那么分解是无损的。
考虑下面的问题,其中给出了关系R,它的FD集和分解。
现在,我认为这种分解是有损的...但它更像是一种直觉。如果我被要求证明这一点,我可能无法做到。 我的直觉是基于这样的事实:关系对R2-R3,R1-R2,R1-R4之间没有共同的属性,这在该对的任一关系中都是素数。因此,R1,R2,R3和R4之间的自然连接操作将产生一些不在原始关系中的行。
但我自己不确定这种分解是否有损..有人可以帮助我理解这个吗?
谢谢!
答案 0 :(得分:1)
这里有一个很好的答案的类似问题:Lossless Join and Decomposition From Functional Dependencies。只需使用chase / tableau方法(:
答案 1 :(得分:1)
当公共列是一个组件的超级密钥时,二进制分解是无损的,即包括一个组件的CK(候选密钥)。 (不是"素数属性",即一个属于CK的成员。)所以以下是无损的:
join FDs CKs
R1 R3 ABCDH A->B, A->C, D->H, AH->D AD, AH
R2 R4 CDEH E->C, D->EH D
R4 R3 ADEH D->EH, AH->D AD, AH
我们现在可以加入ABCDH& ADEH无损地基于任一关系的CK,然后基于CK D无损地加入CDEH的结果。
因此分解是无损的。
或者我们可以尝试分解。尝试R = R1 JOIN ADEH。我们找到了ADEH的FD& CKs(恰好在上表中)。我们继续,看看我们是否可以保持无损分解以获得R2,R3& R4。
有关常规算法,请参阅the Chase。
答案 2 :(得分:0)
据我所知,分解是无损的。如果你选择表格,R1交叉点R3和R2交叉点R4,它是无损的&它也涉及所有分解的表。如果你想在R1和&之间进行自然连接。 R3和R2& R4,你会回到桌子R. 感谢..