冒险工作数据库中复合主键的概念

时间:2013-01-30 19:30:17

标签: sql sql-server sql-server-2008 tsql

我想知道为什么Adventure工作数据库中的EmailAddress表使用复合主键(BusinessEntityID,EmailAddressID(Identity))? 如果它与两个字段的集群索引相关的东西,我将不胜感激,如果告诉我复合主键如何物理存储(以何种顺序和数据插入方式)?

enter image description here

2 个答案:

答案 0 :(得分:1)

正是因为这样,多个人可以使用相同的电子邮件地址,并且同一个人可以使用多个电子邮件地址,即,它使人与电子邮件地址之间的关系很多 - 对多

如果仅仅需要强制执行电子邮件地址应该属于某个人,那么将其作为外键并且BusinessEntityID列不可为空就足够了。

<强>更新

此处涉及2个表格,PersonEmailAddress

Person中的每条记录都由BusinessEntityID标识。要将Person中的记录与另一个表T中的记录相关联,只需在此表T中包含引用BusinessEntityID的列即可。现在,如果我们需要确保T 中的所有记录必须Person中的某些记录相关联,那么我们会在T.BusinessEntityID上放置一个外键约束并使其不可为空。如果最重要的是,我们希望确保T中的每条记录都必须与Person中的一条且仅一条记录相关联,那么我们可以在列T.BusinessEntityID上放置唯一性约束

当我们创建表的主键的2列AB时,我们告诉数据库这两列的值一起必须对于该表中的所有记录都是唯一的。它与每个列中的值和任何外键关系无关。

举例说明:

Person (BusinessEntityID, Name) and PK is BusinessEntityID
---------------
1 | John
---------------
2 | Jane
---------------
3 | Sales Team



EmailAddress (BusinessEntityID, EmailAddressID, EmailAddress) and PK is [Business EntityID, EmailAddressID] where EmailAddress is auto-incremented
--------------
1 | 1 | john@example.com
------------------------
1 | 2 | john@contoso.com
------------------------
2 | 3 | jane@example.com
------------------------
2 | 4 | jane@contoso.com
------------------------
1 | 5 | sales@example.com
------------------------
2 | 6 | sales@example.com
------------------------
3 | 7 | sales@example.com

可以将类似于上面的数据放入示例中的表中。现在这里发生了什么?

有3个实体,John,Jane和销售团队。

John有2个个人电子邮件地址。 Jane还有2个个人电子邮件地址。此外,电子邮件address sales@example.com属于销售团队,但也属于John和Jane。

这是一种多对多的关系。

另外,如果EmailAddress中的复合键是群集的,则密钥按它们出现的顺序存储。请阅读this以获取更多信息。

答案 1 :(得分:0)

这是因为组成,没有人就不能存在一个电子邮件地址。 因此,BusinessEntityID也是EmailAddress表的主键