使用Guid(UniqueIdentifier)作为Primary / Surrogate Key列或序列化的“identity”整数列是否更好;和 为什么 它更好?在哪种情况下你会选择一个而不是另一个?
答案 0 :(得分:9)
我个人使用INT IDENTITY来处理我的大多数主键和群集键。
您需要将主键分开,这是一个逻辑构造 - 它唯一标识您的行,它必须是唯一且稳定且非NULL。 GUID也适用于主键 - 因为它保证是唯一的。如果使用SQL Server复制,GUID作为主键是一个不错的选择,因为在这种情况下,无论如何都需要唯一标识的GUID列。
SQL Server中的集群密钥是一个物理结构,用于数据的物理排序,并且更难以正确使用。通常情况下,SQL Server上的索引女王Kimberly Tripp也需要一个好的聚类密钥,它是唯一的,稳定的,尽可能窄的,并且理想情况下不断增加(这是一个INT IDENTITY)。
请参阅她关于索引的文章:
GUID对于群集密钥来说是一个非常糟糕的选择,因为它很宽,完全随机,因此导致错误的索引碎片和糟糕的性能。此外,群集密钥行也存储在每个非群集(附加)索引的每个条目中,因此您确实希望保持较小 - GUID为16字节,而INT为4字节,并且有几个非聚集索引和几百万行,这会产生巨大的差异。
在SQL Server中,您的主键默认情况下是您的群集密钥 - 但它不一定是。您可以轻松地将GUID用作NON-Clustered主键,并使用INT IDENTITY作为您的群集密钥 - 只需要了解它就可以了。
答案 1 :(得分:7)
在复制系统中使用GUID,您需要保证唯一性。
使用具有非复制数据库且您希望最大限度提高性能的ints。
答案 2 :(得分:5)
很少使用GUID。
使用主键/代理键进行存储。
此外,这将使人与人之间的数据交互变得更加容易。
创建索引也会更有效率。
见
答案 3 :(得分:4)
在考虑使用整数时,请确保允许可能出现的最大可能值。由于删除,您经常会跳过跳过的数字,因此实际的最大ID可能比表中的记录总数大得多。
例如,如果您不确定32位整数是否可以,请使用64位整数。
您可能还会发现这些其他SO讨论很有用:
How do you like your primary keys?
What’s the best practice for Primary Keys in tables?
Picking the best primary key + numbering system.
如果你在这里用SO搜索“主键”,你会发现那些以及更有用的讨论。
答案 4 :(得分:2)
这是一个经过深思熟虑的话题,但由于几个原因,我倾向于更倾向于身份。首先,整数只有4个字节而不是16个字节的GUID。这意味着更窄的索引和更有效的查询。其次,我们在存储过程中使用了@@IDENTITY
和SCOPE_IDENTITY
等等,这些过程会出现在带有GUID的窗口中。
这是一个不错的小article by Jeff Atwood。
答案 5 :(得分:2)
对此没有单一的答案。人们可以快速使用Guid(他们的随机性质与主键的默认行为也充当群集键)的问题可以轻松减轻。 Guids的范围大于整数,但是当你开始用值填充该范围时,你会增加碰撞的风险。
当您拥有一个分布式系统(例如,复制数据库)时,Guid会非常有用,其中一项非常重要的工作必须进入一个不会导致系统各部分之间发生冲突的密钥生成机制。同样,整数是有用的,因为它们易于使用(每种语言都有一个整数类型,并非每种语言都有Guid类型)并且可以是顺序的(Guids也可以,但那不是它们的预期使用)。
所有关于你的存储和方式。那些说“永远不会使用Guid's!”的人只是传播FUD,但它们也不是每个问题的答案。
答案 6 :(得分:2)
我相信它几乎总是一个序列化的identy整数,但有些人会不同意。这取决于具体情况。
身份的原因是效率和简单性。它更小。更容易索引。它创建了一个伟大的聚簇索引。随着新记录的有序保存,碎片减少。非常适合连接的索引。在数据库中观察记录时更容易。
在某些情况下肯定会有一个Guids的地方。合并不同的数据时,或者必须在某些地方创建记录时。 Guids应该在你的技巧包中,但通常不会是你的首选。
答案 7 :(得分:1)
如果您认为需要使用数据库外部的数据(即其他数据库),请使用GUID。有些人会争辩说,情况总是如此,但这是一种判断力。