无损连接分解超过两个关系

时间:2014-02-04 18:07:04

标签: sql database-design database-normalization

给定一个关系,一组函数依赖关系,并将它分解为多个关系(> 2),是否有一些方法可以检查这种分解是无损还是有损?

为了将R分解为两个关系R1和R2,我们检查R1和R2的交集是否形成R1或R2的主键。如果是,那么分解是无损的。

考虑下面的问题,其中给出了关系R,它的FD集和分解。

enter image description here

现在,我认为这种分解是有损的...但它更像是一种直觉。如果我被要求证明这一点,我可能无法做到。 我的直觉是基于这样的事实:关系对R2-R3,R1-R2,R1-R4之间没有共同的属性,这在该对的任一关系中都是素数。因此,R1,R2,R3和R4之间的自然连接操作将产生一些不在原始关系中的行。

但我自己不确定这种分解是否有损..有人可以帮助我理解这个吗?

谢谢!

3 个答案:

答案 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. 感谢..