我想知道为什么Adventure工作数据库中的EmailAddress表使用复合主键(BusinessEntityID,EmailAddressID(Identity))? 如果它与两个字段的集群索引相关的东西,我将不胜感激,如果告诉我复合主键如何物理存储(以何种顺序和数据插入方式)?
答案 0 :(得分:1)
正是因为这样,多个人可以使用相同的电子邮件地址,并且同一个人可以使用多个电子邮件地址,即,它使人与电子邮件地址之间的关系很多 - 对多
如果仅仅需要强制执行电子邮件地址应该属于某个人,那么将其作为外键并且BusinessEntityID
列不可为空就足够了。
<强>更新强>
此处涉及2个表格,Person
和EmailAddress
。
Person
中的每条记录都由BusinessEntityID
标识。要将Person
中的记录与另一个表T
中的记录相关联,只需在此表T
中包含引用BusinessEntityID
的列即可。现在,如果我们需要确保T
中的所有记录必须与Person
中的某些记录相关联,那么我们会在T.BusinessEntityID
上放置一个外键约束并使其不可为空。如果最重要的是,我们希望确保T
中的每条记录都必须与Person
中的一条且仅一条记录相关联,那么我们可以在列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和销售团队。
John有2个个人电子邮件地址。 Jane还有2个个人电子邮件地址。此外,电子邮件address sales@example.com
属于销售团队,但也属于John和Jane。
这是一种多对多的关系。
另外,如果EmailAddress中的复合键是群集的,则密钥按它们出现的顺序存储。请阅读this以获取更多信息。
答案 1 :(得分:0)
这是因为组成,没有人就不能存在一个电子邮件地址。 因此,BusinessEntityID也是EmailAddress表的主键