SQL Server + 复合键或唯一 ID

Posted

技术标签:

【中文标题】SQL Server + 复合键或唯一 ID【英文标题】:SQL Server + Composite key or Unique Id 【发布时间】:2012-10-21 19:26:20 【问题描述】:

我对数据库设计相当陌生,对于多对多关系,创建复合键和唯一 id 的区别和含义是什么,例如

Country

CountryID
CountryName

Language

LanguageID
LangugageName

多对多表 - 使用复合:

CountryID  Pkey
LanguageID Pkey

使用唯一 ID:

AutoID Pkey
CountryID 
LanguageID 

【问题讨论】:

检查更新的答案,这会给你一个清晰的想法.. 【参考方案1】:

复合键:

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

主键

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 成为主键,因此这将允许数据 lke thsi

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

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

【讨论】:

您好,感谢您的意见,实际上我想了解更多的是优点和缺点,我应该使用其中一个而不是另一个。 在 OP 的问题中,第二种情况下的唯一 ID 不是 Surrogate Key。如果您将其添加到您的答案中会更好。【参考方案2】:

为例如创建复合键和唯一 id 的区别和含义是什么

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

使用代理键的原因:

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

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

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

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

【讨论】:

以上是关于SQL Server + 复合键或唯一 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何获取mysql数据库中某个表的主键或唯一字段

使用唯一随机值更新sql表中的所有行,而不使用c#中的主键或唯一键

复合唯一键约束,其中一列中包含多个空值

SQL : ORA-02270: 此列列表没有匹配的唯一键或主键

如何修复 sql 中的“ORA-02270:此列列表没有匹配的唯一键或主键”错误

Oracle (ORA-02270):该列列表没有匹配的唯一键或主键