将主键作为标识字段是否合适?

Pun*_*nit 2 sql database-design identity primary-key uniqueidentifier

我已经阅读了很多关于我们是否应该将主键作为标识列的文章,但我仍然感到困惑.

使列具有标识的优点在于它可以在连接中提供更好的性能并提供数据一致性.但是有一个与标识相关的主要缺点,即当INSERT语句失败时,IDENTITY值仍会增加如果事务被回滚,则新的IDENTITY列值不会回滚,因此我们最终会在排序方面出现空白.我可以使用GUID(通过使用NEWSEQUENTIALID),但它会降低性能.

gbn*_*gbn 7

差距无关紧要:标识列是内部的,不适用于最终用户使用或识别.

由于16字节宽度,GUID会破坏性能,甚至连续性能.

在对数据建模并计算出您的自然键之后,应选择标识列以尊重物理实现.也就是说,所选择的自然键是逻辑键,但您选择代理键(标识),因为您知道引擎的工作方式.

或者您使用ORM并让客户端尾随数据库狗...

  • @Jan,GUID的问题在于没有有意义的方式对它们进行排序.因此,GUID列上的索引远不如整数列上的索引那么有用. (4认同)
  • @Jan:是的,****KILLS**表现 - 完全.我使用GUID作为PK/CK和99.5%索引碎片的遗留系统每天使用INT IDENTITY - **巨大的**差异.几乎没有任何索引碎片,性能明显更好.作为SQL Server表上的群集索引的GUID是BAD BAD BAD - period. (3认同)
  • @Jan:它会使所有非聚集索引膨胀,因为引用聚簇键+它会导致碎片.我自己使用GUID,但从不作为集群PK (2认同)