SQL Server +复合键或唯一ID

时间:2012-11-01 08:04:15

标签: sql database database-design

我对数据库设计很新,对于多对多的关系,创建复合密钥的差异和含义是什么,例如

Country

CountryID
CountryName

Language

LanguageID
LangugageName

多对多表 - 使用复合:

CountryID  Pkey
LanguageID Pkey

OR

使用唯一标识:

AutoID Pkey
CountryID 
LanguageID 

2 个答案:

答案 0 :(得分:3)

复合键:

组合键是多个列的组合,用于标识表中的唯一行。 复合键可以是主键。

PRIMARY KEY

PRIMARY KEY约束唯一标识数据库表中的每条记录。

所以这一切都取决于你的要求

第一次设计

Many to Many Table:
Using composite:
CountryID  Pkey
LanguageID Pkey

如果你使用这个设计而不是CountryID,而LanguageID是复合主键。这里是

表的数据将是

CountryId  LaguageID
  1           1 //valid
  1           2 //valid
  1           3 //valid
  1           1//not valid data as its form composite primary key

并在第二个设计

Using Unique Id:
AutoID Pkey
CountryID 
LanguageID 

AutoID成为主键,因此这将允许数据使用

AutoId    CountryId  LaguageID
 1          1           1 //valid
 2          1           2 //valid
 3          1           3 //valid
 4          1           1 //valid as AutoID is primary key
 1          2           3 // invalid as AutoID is prinary key

希望此演示文稿能帮助您了解差异

答案 1 :(得分:0)

  

为例如创建复合键和唯一ID的差异和含义是什么。

您需要在{CountryID,LanguageID}上创建“自然”键,以避免重复连接无论如何。唯一的问题是,您是否需要{AutoID}上的“代理”密钥?

代理密钥的原因:

  • 有子表引用此联结表(并且您希望保持其FK变细或阻止ON CASCADE UPDATE传播)。
  • 您正在使用喜欢简单PK的ORM。

除非其中一些原因适用,否则请仅使用自然键。

BTW,在支持clustering的DBMS下,这样的自然键通常是群集密钥的良好候选者。如果您对表进行集群,则每个其他索引(例如代理键下面的索引)都会产生额外的开销(与基于堆的表中的索引相比),因为它需要保留群集密钥数据的副本并且可能导致双重-lookup。

另请参阅:A column as primary key or two foreign keys as primary key