GUID与自增int ID的区别

6

我正在尝试将我的设计理念从LAMP技术栈转移到Microsoft技术栈,我突然想到一个问题 - 什么情况下我会使用GUID呢?相比于可靠的自增int,它有哪些优缺点呢?

4个回答

14

你可能从未遇到过需要超越自动递增ID的需求,这表明GUID通常只是为了解决问题而存在。在你熟悉的模式无法满足要求时,考虑使用它们。微软风格并不重要。

唯一实际使用场景我见过的是从两个数据源合并表格。


4
"老式、可靠的自增整数",它的使用程度在多大程度上取决于您的数据库需要扩展到多大规模。当您的设置中至少有两个主节点时,自动增量会停止工作。当然,这并不难解决,因为这是一个常见的问题;不同的数据库引擎可以协调主节点之间的序列,例如只有一个主节点可以从任何给定的序列中分配。
当您进入数据分片时,通常希望从键中知道分片信息。自增ID不包含应该托管该记录的分片信息。
GUID以不同的方式解决了这个问题;两个不同的主节点具有不同的主机标识符(通常是MAC地址)。由于这被用于计算新的GUID,因此不同的主节点无法创建冲突的GUID。此外,由于主机是ID的一部分,因此可以用它直接标识持有记录的分片。
第三个选项是根本不使用代理键(既不使用自动增量整数也不使用GUID)。"

看到同一主机上的多个GUID或没有MAC地址的设备是很常见的。 - dkretz
只是出于好奇,您看到重复项的频率有多高? - Dave
那个回答大部分超出了我的理解范围。我从未使用过比一次处理1 db更复杂的东西。不过,+1 是因为你提供了一些值得研究的术语。;-) - Major Productions
4
这是他所说的一个例子。在两个不同的数据中心中,你有两个数据库各自创建记录。如果你尝试合并这些记录,那么你必须确保主键不同。一种方法是在一个数据库中将自动递增值设为奇数,在另一个数据库中将其设为偶数。另一种方法是使用GUID,因为它们据说永远不会相撞。 - Dave

3

GUID存在一个问题:

由于它们不是顺序的,数据库将不得不努力更新索引。使用顺序id时,通常可以将其附加到末尾(或多或少)。由于GUID是随机的,因此必须将其适配到现有块中。尽管如此,我们在一些表格中使用GUID,即使在相当大的负载下,它们似乎也能正常工作。


好的,但是什么时候我想要使用它们? - Major Productions
1
顺序 GUID 可以解决这个问题,例如 https://dev59.com/lnVC5IYBdhLWcg3w1E1q - Douglas

1
我建议使用int ID而不是Guid,原因如下:
  • Int ID的大小为4字节(32位),而Guid的大小为16字节(128位),是其4倍,这可能会导致性能问题和存储问题。
  • 默认情况下,GUID不是连续的(要小心)。
  • 易于可视化表之间的链接和关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接