【发布时间】:2023-03-31 22:06:01
【问题描述】:
考虑以下两个表:
Table A: [K1, K2, PropA]
Table B: [K3, PropB]
表 A 的主键是复合 [K1,K2]。
表 B 的主键是K3。
表对表 B 具有包容性依赖关系-K3 中的值必须与 K2 中的值匹配。不幸的是,由于K2 不是唯一的主键,我无法在这些列上定义外键约束。
在我看来,解决方案是要么在应用层强制执行它,要么将K1 列传播到表 B,这样它将包含表 A 的整个外键。
我的问题:这在数据库设计中被认为是好的还是坏的做法?假设从维护角度或完整性角度来看,添加额外的列不是问题(插入是事务性的)。
我正在使用 MSSQL 和 Oracle。
【问题讨论】:
-
K3是唯一的吗?你能把Table A -> K2的外键映射到K3吗?我们需要了解有关数据关系的更多细节以帮助您,但您所描述的内容(或我的理解方式)听起来不是好的做法。 -
@Vitaliy 你没有提到你正在使用什么 DBMS。请注意,并非所有 DBMS 都受到此限制。在某些情况下(MySQL 是一个示例),您可以在两个表之间创建引用完整性约束,即使此类约束的目标是非唯一且不可为空的。对于不直接支持此类约束的软件,有可能的解决方法。您的问题确实提出了一个重要的观点:现代数据库软件对数据完整性约束的支持通常很差,这意味着数据库设计人员有时不得不做出一些尴尬的妥协。
-
如果一个特定的
K2值有多个K1值,表B 中将使用哪一个? -
@sqlvogel - MSSQL 和 Oracle。
-
@Damien_The_Unbeliever - K2 在 B 中是独一无二的。
标签: database database-design foreign-keys referential-integrity