Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 server 当关联两个表时,应该分别执行复合键还是主键/外键?_Sql Server_Database_Database Design_Key_Database Deployment - Fatal编程技术网

Sql server 当关联两个表时,应该分别执行复合键还是主键/外键?

Sql server 当关联两个表时,应该分别执行复合键还是主键/外键?,sql-server,database,database-design,key,database-deployment,Sql Server,Database,Database Design,Key,Database Deployment,表示两个表之间关系的行业设计标准是什么?您应该使用复合键,还是主键和外键分开?这两个选项之间是否存在性能差异 例如,假设您有一个用户,该用户可以有零个或多个订单。用户表的属性为PK UserID和Name。没有用户,订单永远不会存在。现在,这就是我问题的核心所在 您是否遵循第一个图,其中OrderID和UserID之间使用复合键 或者,您是否遵循第二个图,其中没有复合键,并且订单只是由OrderID和用户表的FK UserID标识 通常的规则是,除非您有明确的扩展要求,否则请尽可能地缩小密钥 典

表示两个表之间关系的行业设计标准是什么?您应该使用复合键,还是主键和外键分开?这两个选项之间是否存在性能差异

例如,假设您有一个用户,该用户可以有零个或多个订单。用户表的属性为PK UserID和Name。没有用户,订单永远不会存在。现在,这就是我问题的核心所在

您是否遵循第一个图,其中OrderID和UserID之间使用复合键

或者,您是否遵循第二个图,其中没有复合键,并且订单只是由OrderID和用户表的FK UserID标识


通常的规则是,除非您有明确的扩展要求,否则请尽可能地缩小密钥

典型情况

按照您的示例,当您开始设计OrderDetails表时,使用design 1,您的选项是:

将整个PK、OrderId、UserId迁移到子表中,或 在Orders表中引入一些单列备用键,并引用此AK,而不是PK。 如果您确实需要订单详细信息中的用户,这是极不可能的,那么前一种模式可以,但您可能不需要。此外,如果您需要实现诸如更改订单所有权之类的功能,使用第一种方法,您会发现任务突然变得比通常应该的复杂得多

因此,在绝大多数情况下,后一种设计是可行的

极端情况

假设您有一些特殊的业务需求,比如:

对于每个用户,订单号应形成一个独立于任何其他用户订单的序列

看起来是设计1的合理理由,不是吗?好的,是和否。当然,您必须创建一个由UserId、OrderId组成的复合键,以便不同的用户可以重用订单号,但是:

这样的密钥不必是主键。此外,您不必通过子表中的任何外键引用它。只需创建一个代理Id bigint identity1,1主键并从任何地方引用它。 规则不更新密钥,或者至少不引用可更新密钥仍然有效。如果该键可能是可更新的,那么它很难被外键引用。
使用复合键的一对零或多关系。在本例中,它可能看起来像SQL中的主键OrderID、CustomerID。其中CustomerID也是UserIDdiagram 2的外键。假设需要一个订单作为另一个表中的外键。在图1中,另一个表还需要CustomerID列和OrderID。如果OrderID是唯一的,那么就没有必要了对不起,我更新了图表以使它更清晰。。。因此,没有用户的订单永远不可能存在这一事实并不证明使用复合密钥是合理的,事实上并非如此。因为当您这样做时,所有需要链接到表Order的表都必须具有UserID列。这实际上是不必要的,因为这两种情况之间存在真正的功能差异,而不仅仅是性能/风格差异。在结构2中,OrderID在整个表中是唯一的,因此一旦用于一个客户,该订单ID就不能用于任何其他客户。在结构1中,OrderID和CustomerID的组合是唯一的,在这种情况下,您可以将相同的OrderID用于两个不同的客户。这非常有帮助,为我提供了一条非常清晰的路线。非常感谢你!!