我想知道为什么 Adventure 工作数据库中的 EmailAddress 表使用复合主键(BusinessEntityID,EmailAddressID(Identity))?如果这与为这两个字段设置集群索引有关,如果告诉我复合主键如何物理存储(以何种顺序以及如何插入数据),我将不胜感激?
2 回答
就是因为这样,同一个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 列A
和B
表的主键的一部分时,我们告诉数据库这两列的值对于该表中的所有记录必须是唯一的。它与每个列中的值和任何外键关系无关。
为了显示:
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 中的复合键是集群的,则这些键按它们出现的顺序存储。阅读此内容以获取更多信息。
那是因为组合,一个电子邮件地址不能没有一个人存在。所以 BusinessEntityID 也是 EmailAddress 表的主键