我已经将一个'version'列添加到需要成为表主键一部分的表中,但是我有一个与不包含该版本的表的外键关系。 (并且不应该)我确定我将至少得到一个答案来解释为什么这是不可能的,我明白为什么我不能在这里建立关系。我正在寻找一种优雅/无痛的方式。我需要的行为是主表可以添加版本,而“其他表”仍然链接到所有这些。这实际上是没有连接表的多对多关系。 (但实际上在给定密钥的主表中只有一个'版本'在任何给定时间都是活动的。)我计划使用检查约束和触发器的混合强制执行我自己的参考完整性...但是有更好的方法?感谢
表格
TableID (uniqueidentifier) - PRIMARY KEY
Version (int) - PRIMARY KEY
...
OTHERTABLE
OtherTableID (int) - PRIMARY KEY
TableID (uniqueidentifier)
...
答案 0 :(得分:2)
我认为最好将TABLE
拆分为两个表:一个包含永不改变的数据(可能只是ID本身),另一个包含需要版本化的数据。 OTHERTABLE
将拥有第一个的外键。
(我应该提到我们在我工作的地方使用过这种方法,有时会引起烦人的复杂情况,特别是当我们想要改变我们对哪些字段需要进行版本化时的想法。这真的不完美。但其他方法往往会导致更大的问题。)
答案 1 :(得分:1)
如果我理解你的规格:
Parent
======
ParentID (uniqueidentifier) - PRIMARY KEY
...
OtherTable
==========
OtherTableID (int) - PRIMARY KEY
ParentID (int) - FOREIGN KEY
...
ParentVersion
=============
ParentID (int) - PRIMARY KEY FOREIGN KEY
Version (int) - PRIMARY KEY
如果您希望每个父级有一个活动版本,还需要一个表:
ParentActiveVersion
=============
ParentID (int) - PRIMARY KEY
Version (int)
FOREIGN KEY (ParentID, Version)
REFERENCES ParentVersion(ParentID, Version)
答案 2 :(得分:0)
免责声明:以下内容对SQL Server有效。我对其他RDBMS没有任何说法。
不要让它成为PK的一部分,只需在这两个字段上添加UNIQUE INDEX
即可强制执行唯一性:
CREATE UNIQUE INDEX ix_MyIndexName ON TABLE(TableID, Version)
您不需要触摸现有密钥,但它会将重复值保留在表格之外。
如果您决定立即引用这两个字段(并且您使用的是SQL Server),那么您可以使用唯一索引作为外键的目标(如果需要)。
答案 3 :(得分:0)
稍微有点笨拙,但这里的任何内容都将基于@ ypercube的注释 - 其他表可能不会全部构建为引用版本1(使用计算列强制1出现在每个表的列中)