给定一个关系、一组函数依赖关系,并将其分解为多个关系 (> 2) ,是否有某种方法可以检查此分解是无损还是有损?
为了将 R 分解为两个关系 R1 和 R2,我们检查 R1 和 R2 的交集是否形成 R1 或 R2 的主键。如果是这样,那么分解是无损的。
考虑下面的问题,其中给出了关系 R,它的 FD 集和分解。
现在,我认为这种分解是有损的......但它更多的是一种直觉。如果让我证明这一点,我可能无法证明。 我的直觉基于以下事实:关系对 R2-R3 、 R1-R2 、 R1-R4 之间没有共同属性,该属性在该对的任一关系中都是质数。因此,R1、R2、R3 和 R4 之间的自然连接操作将产生一些不在原始关系中的行。
但我自己不确定这种分解是否有损。有人可以帮助我理解这一点吗?
谢谢!
最佳答案
当公共(public)列是一个组件的超键时,即包括一个组件的 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
我们现在可以基于任一关系的 CK 无损连接 ABCDH 和 ADEH,然后基于 CK D 将结果与 CDEH 无损连接。
所以分解是无损的。
或者我们可以尝试分解。尝试 R = R1 加入 ADEH。我们找到了 ADEH 的 FD 和 CK(恰好在上表中)。我们继续,看看能否继续无损分解得到R2、R3和R4。
有关通用算法,请参阅 the Chase .
关于sql - 无损连接分解两个以上关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21560069/