3

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

在此处输入图像描述

4

2 回答 2

1

就是因为这样,同一个e-mail地址可以被多个Person使用,同一个Person也可以使用多个e-mail地址,即person和e-mail地址之间的关系是多对多的.

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

更新:

这里涉及 2 个表,Person并且EmailAddress.

中的每条记录Person都由一个 标识BusinessEntityID。要将一条记录Person与另一个表中的记录相关联T,只需在该表中包含一个T引用的列即可BusinessEntityID。现在,如果我们需要确保 in 中的所有记录T 必须与 in 中的某些记录相关联Person,那么我们将放置外键约束T.BusinessEntityID并使其不可为空。如果除此之外,我们希望确保 in 中的每条记录都T必须与 in 中的一条且只有一条记录相关联Person,那么我们可以对 column 设置唯一性约束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 和 Sales Team。

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

这是一个多对多的关系。

此外,如果 EmailAddress 中的复合键是集群的,则这些键按它们出现的顺序存储。阅读内容以获取更多信息。

于 2013-01-30T19:43:10.207 回答
0

那是因为组合,一个电子邮件地址不能没有一个人存在。所以 BusinessEntityID 也是 EmailAddress 表的主键

于 2013-01-30T19:38:21.473 回答