2012-02-20 22 views
1

我已经为需要成为表主键的表添加了一个'版本'列,但是我有一个与不包含表的外键关系版本。 (而且不应该)我相信我至少会得到一个答案,解释为什么这是不可能的,我得到了为什么我不能在这里创建一个关系。我正在寻找一种轻松/无痛的方式。我需要的行为是主表可以添加版本,而'其他表'仍然链接到所有这些表。这实际上是一个没有连接表的多对多关系。 (然而实际上,在任何给定的时间,只有给定键的主表的一个'版本'是活动的。)我打算使用检查约束和触发器的混合来强制我自己的参考完整性......但是有没有更好的方法?由于与单列上的组合外键的关系

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

OTHERTABLE

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

如果您不需要'版本'在其他表中,请不要将它作为父表的主键的一部分。 – 2012-02-20 15:24:50

+0

然后,我会在主表中有重复的'TableIDs ... – Paul 2012-02-20 15:25:39

+1

其他表应该具有FK到特定版本吗? – 2012-02-20 15:26:30

回答

2

我认为最好将TABLE分成两个表格:一个数据不会改变(可能只是ID本身),另一个数据需要进行版本控制。 OTHERTABLE将有一个外键到第一个。 (我应该提到我们在我工作的地方使用了这种方法,有时会导致令人讨厌的复杂情况,特别是当我们想改变我们关于哪些字段需要版本化的想法时,这并不完美。其他的方法往往会导致甚至更大问题

+0

+1 - 现在我想到了,我在另一个应用程序中也使用了这种方法。在这种情况下,这基本上只是一个链接表...我会看看这是否有任何其他影响这个特定的数据库。 – Paul 2012-02-20 15:34:57

+0

实现,精美的作品。只需要将一行代码添加到应用程序来处理插入主表中。 – Paul 2012-02-21 04:06:17

0

免责声明:以下是有效的SQL Server。我对其他RDBMS没有任何要求。

不要让它成为PK的一部分,只是在这两个字段添加一个UNIQUE INDEX强制唯一性:

CREATE UNIQUE INDEX ix_MyIndexName ON TABLE(TableID, Version)

你不会需要接触现有的密钥,但它会继续从表中重复出现值。

如果您决定一步一步地引用这两个字段(并且您正在使用SQL Server),那么您可以使用唯一索引作为外键的目标(如果需要)。

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) 
0

稍微低调,但这里的任何内容都将基于@ ypercube的评论 - 其他表格可能并非全部都是为引用版本1而构建的(使用计算列强制1出现在每一个列中表)