我一直在创建一个数据库,并且刚刚完成了规范化步骤。其中一个关系通过部分依赖违反了 2NF,因此我根据规范化指南将其拆分为两个关系。我想知道的是,对于我创建的新关系,它是否具有依赖于原始关系主键的外键?
例如;
标准化前:R{PK1, PK2, attr1, attr2}
归一化后:R1{PK1, PK2, attr1} R2{PK2, attr2}
PK2 应该与 PK1 有外键吗?
谢谢你的帮助
我一直在创建一个数据库,并且刚刚完成了规范化步骤。其中一个关系通过部分依赖违反了 2NF,因此我根据规范化指南将其拆分为两个关系。我想知道的是,对于我创建的新关系,它是否具有依赖于原始关系主键的外键?
例如;
标准化前:R{PK1, PK2, attr1, attr2}
归一化后:R1{PK1, PK2, attr1} R2{PK2, attr2}
PK2 应该与 PK1 有外键吗?
谢谢你的帮助
理想情况下,您希望在 R1{PK2} 和 R2{PK2} 之间强制执行连接依赖关系。不幸的是,大多数 DBMS(基于 SQL 的 DBMS)不能强制表之间的连接依赖关系。
如果你不能强制加入依赖,你至少可以让 R1.PK2 成为引用 R2.PK2 的外键。
不。
由于 attr2 在功能上仅依赖于 PK2,因此 attr2 对于具有给定值的 PK2 的所有行具有相同的值。如果您将 PK1 添加到 R2,您将有两个选择,都不好。
对于 PK2 的每个值,您只能在 R2 中拥有一行,在这种情况下,您仅限于 PK1 的一个值。这会过度限制您的数据。
您可以在 R2 中有许多行,所有行都具有相同的 PK2 值,但每行都具有不同的 PK1 值。现在你不再是 2NF 了,你又回到了你开始的地方。