5

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

Country桌子

CountryID
CountryName

Language桌子

LanguageID
LangugageName

多对多表 - 使用复合:

CountryID  Pkey
LanguageID Pkey

或者

使用唯一 ID:

AutoID Pkey
CountryID 
LanguageID 
4

2 回答 2

3

复合键:

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

首要的关键

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

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

于 2012-11-01T08:09:52.370 回答
0

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

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

使用代理键的原因:

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

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

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

另请参阅:一列作为主键或两个外键作为主键

于 2012-11-01T12:52:35.860 回答