单列复合外键的关系

时间:2012-02-20 15:23:14

标签: sql database-design database-schema relationship

我已经将一个'version'列添加到需要成为表主键一部分的表中,但是我有一个与不包含该版本的表的外键关系。 (并且不应该)我确定我将至少得到一个答案来解释为什么这是不可能的,我明白为什么我不能在这里建立关系。我正在寻找一种优雅/无痛的方式。我需要的行为是主表可以添加版本,而“其他表”仍然链接到所有这些。这实际上是没有连接表的多对多关系。 (但实际上在给定密钥的主表中只有一个'版本'在任何给定时间都是活动的。)我计划使用检查约束和触发器的混合强制执行我自己的参考完整性...但是有更好的方法?感谢

表格

TableID (uniqueidentifier) - PRIMARY KEY
Version (int) - PRIMARY KEY
...

OTHERTABLE

OtherTableID (int) - PRIMARY KEY
TableID (uniqueidentifier)
...

4 个答案:

答案 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出现在每个表的列中)