Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 冒险工作数据库中复合主键的概念_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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

Sql 冒险工作数据库中复合主键的概念,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我想知道为什么冒险工作数据库中的EmailAddress表使用复合主键(BusinessEntityID,EmailAddressID(Identity))? 如果这与为这两个字段设置集群索引有关,请告诉我复合主键是如何物理存储的(以何种顺序以及如何插入数据),我将不胜感激 这是因为组成,一个电子邮件地址不可能没有人存在。 所以BusinessEntityID也是EmailAddress表的主键,因为这样,同一个电子邮件地址可以被多个人使用,也可以被同一个人使用多个电子邮件地址,也就是说,它使人

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


这是因为组成,一个电子邮件地址不可能没有人存在。
所以BusinessEntityID也是EmailAddress表的主键,因为这样,同一个电子邮件地址可以被多个人使用,也可以被同一个人使用多个电子邮件地址,也就是说,它使人和电子邮件地址之间的关系多对多

如果只需要强制电子邮件地址应该属于某人,那么就足以使其成为外键,并且列
BusinessEntityID
不可为空

更新:

这里涉及两个表,
Person
EmailAddress

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

当我们创建两列时,
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和销售团队

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

这是一种多对多的关系


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

谢谢您的回复,请告诉我或给我一些关于复合主键物理存储方式的参考资料。只有一个字段被认为是一个集群还是它们中的两个?- 1给出复合密钥设置的不正确原因,并将其与外键约束混淆。谢谢您的答复,但是如果我们没有使用BuffeleTyId作为主键(只是我们已经有了Email地址)我认为我们仍然可以为多人提供相同的地址,反之亦然。我说的对吗?我们认为,将表中的两个字段关联为多对多关系是正确的吗?因为如果EmailAddress中的BusinessEntityID不是主键(只是一个FK),我们仍然会有许多邮件用于一个人,许多人用于同一个邮件。事实上,你是绝对正确的。实际上,我想不出一个好的理由来解释他们为什么这样构造
EmailAddress
表的PK。通常,如果您有两个带有
A.Id
A
表和带有
B.Id
B
表,并且您想在
A
B
之间建立多对多关系,您可以使用
C.AId
C.BId
创建第三个表
C
(AId,BId)为C`设置PK,并为AId和BId设置FKs,以强制执行引用完整性。这显然不是这里发生的事情。我的回答误导了你。