Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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 带int-Clustered的uniqueidentifier PK:使用哪个作为外键?_Sql_Sql Server - Fatal编程技术网

Sql 带int-Clustered的uniqueidentifier PK:使用哪个作为外键?

Sql 带int-Clustered的uniqueidentifier PK:使用哪个作为外键?,sql,sql-server,Sql,Sql Server,我已经看过很多文章指出使用以下模式: ID(uniqueidentifier):主键,非集群 clusteredd(int):索引,聚集(标识) 我的其他专栏(各种) 我对这种模式的解释是,它允许使用uniqueidentifier(这在许多情况下都很有用)来标识记录,但这意味着聚集索引不会变得如此分散,因为生成的int identity列值的递增顺序 到目前为止,这一切对我来说都是有意义的 我不完全理解的是: 如果唯一标识符是uniqueidentifier,那么在相关表中将其用作FK是有

我已经看过很多文章指出使用以下模式:

  • ID
    uniqueidentifier
    ):主键,非集群
  • clusteredd
    int
    ):索引,聚集(标识)
  • 我的其他专栏(各种)
我对这种模式的解释是,它允许使用
uniqueidentifier
(这在许多情况下都很有用)来标识记录,但这意味着聚集索引不会变得如此分散,因为生成的
int identity
列值的递增顺序

到目前为止,这一切对我来说都是有意义的

我不完全理解的是:

如果唯一标识符是
uniqueidentifier
,那么在相关表中将其用作FK是有意义的。现在,当执行连接两个表的select语句时,
SQL Server
将对
uniqueidentifiers
执行连接。然而,由于实际上是int索引进行了聚集,因此我认为在int上进行聚集不会有助于连接的性能

如果我上面的假设是正确的,那么我并不欣赏添加聚集整数索引的好处


因此,我想我的假设是不正确的。有人能告诉我我的想法哪里出了问题吗?

可以找到对该主题的详细描述-使用GUID作为主键的最佳实践是什么…对您的问题的正确解释与往常一样:这取决于。首先:为什么不引用子表中的
ClusteredD
?您完全可以这样做-因为它是一个
INT-IDENTITY
列,所以您可以轻松地在它上面放置一个
唯一聚集索引
,从而将其用于FK约束。第二:由于
ID
列上有一个索引,因此联接将尽可能高效。我看不出有任何负面影响。。。是的,
ID
并没有决定物理表的结构,但是
ID
上的索引仍然提供了一个顺序(当然,只是索引列),这有助于JOINsIt不是一个“隐藏”表-每个非聚集索引也只包含叶级的集群键。因此,当你在非聚集索引中找到一个条目时,你也总是可以使用它的聚集键来访问实际的数据页。@marc_s-你最后的一条小评论是值得的!谢谢