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的主要内容,如果未能解决你的问题,请参考以下文章
使用唯一随机值更新sql表中的所有行,而不使用c#中的主键或唯一键
SQL : ORA-02270: 此列列表没有匹配的唯一键或主键