SQL多对多关系表,但是唯一的条目

时间:2008-11-12 22:51:20

标签: sql

对你们来说,这是一个不错的低手高球。

所以基本上我的内容表中有唯一的主键ID,而且我的标签表中有唯一的主键ID。

我有一个表有一个标识列作为主键,但另外两个字符是contentID和tagID。我需要对表做些什么来确保我只有一次只有相同的contentID和tagID组合。

4 个答案:

答案 0 :(得分:2)

您在contentID,tagID上添加了唯一约束。

对于SQL Server

ALTER TABLE ContentTag ADD CONSTRAINT
    IX_ContentID_TagID_Unique UNIQUE NONCLUSTERED ( contentID,  tagID ) 
GO

答案 1 :(得分:2)

在多对多连接表上有一个数字(代理)键是有一个原因的......也就是说,当有其他子派生表需要外键返回到此表中的记录时。 ..也就是说,你有Table PetStore w / StoreId,表品种w / BreedId,以及多对多连接表StoreBreeds,每个商店都有一行=品种组合...然后让我们说你要追踪每个品种的每个品种的价格和商店折扣,因为它随着时间的推移而变化,因此您需要另一张表来记录每个商店的每个品种的价格,有效的开始和结束日期反映了价格的日期范围。对该商店的那个品种有效..

如果你只为多对多连接表提供了一个有意义的复合键,那么子表中的FK也必须是复合的,基于StoreId和BreedId ......对于性能,添加一个无意义的连接表的整数代理键允许您将其用作派生子表中的FK,从而提高连接的性能以检索这些子记录...

在一个简单的例子中, 可能 不那么重要,但在更复杂的情况下,复合键由4列或更多列组成,影响可能是可观。

答案 2 :(得分:1)

从数据建模的角度来看,没有理由在映射表中需要一个标识列。主键约束应该是contentIDtagID上的两列约束。

某些框架(例如Rails)要求每个表都有一个名为id的代理键,即使它对实体关系没有意义。这很遗憾,但显然这个惯例在其他地方给了他们一些效率。

除了代理键列上的表格主键外,您始终可以在UNIQUEcontentID上创建tagID约束。

答案 3 :(得分:0)

考虑这个问题:

表A有2个子表(B& C)

B和C的PK是一个身份,他们都有一个FK回到表A.

我有一个表D,它是B和C

上的连接表

表D具有同一性的PK和FK回到B和C.

A .....两行...... A1和A2

B ......两行...... B1(FK到A1)& B2(FK到A2)

C ......两排...... C1(FK到A1)& C2(FK到A2)

D .....我可以将以下内容添加到D .... FK到B1和FK到C1 .....这是错误的。

我想确保D中引用的B和C都指向同一个A !!!

使用复合键这是可能的....但我无法看到如何在数据库中完成它,并且身份是用户无处不在。

艾伦