sql - 无损连接分解两个以上关系

标签 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 之间的自然连接操作将产生一些不在原始关系中的行。

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

谢谢!

最佳答案

当公共(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/

相关文章:

mysql - 如果我们更改主键值,为什么我们不必更改从属列值?

mysql - 将具有相同主键的两个表规范化为 3NF

php - 当我在 PHP 中使用对另一个类的引用时,插入 MySQL 不起作用

database - 根据不断变化的要求记录每日检查结果

mysql - A "recomendations"表结构

php - 处理订单 : Save recipient address, 或通过 lastInsertId() 引用?

php - 在 SQL 数据库中存储逗号分隔的列表 - 对吗?

sql - Postgres 案例说明

Mysql 其中匹配全部

mysql - 在MYSQL中搜索特定关键字