Database GUID与int ID自动增量

Database GUID与int ID自动增量,database,guid,Database,Guid,我正试图将我的设计敏感度从LAMP堆栈转移到Microsoft堆栈,我刚刚想到了一件事——我什么时候想使用GUID?与旧的、可靠的自动递增int相比,它有哪些优点/缺点?guid有一个问题: 因为它们不是连续的,所以数据库必须努力更新索引。对于顺序id,它通常可以将其附加到末尾(或多或少)。由于guid是随机的,所以它必须将其放入现有块中。也就是说,我们对一些表使用guid,即使在相当重的负载下,它们也能正常工作。“旧的、可靠的自动递增int”很大程度上取决于数据库的可伸缩性。当你有一个至少有两

我正试图将我的设计敏感度从LAMP堆栈转移到Microsoft堆栈,我刚刚想到了一件事——我什么时候想使用GUID?与旧的、可靠的自动递增int相比,它有哪些优点/缺点?

guid有一个问题:

因为它们不是连续的,所以数据库必须努力更新索引。对于顺序id,它通常可以将其附加到末尾(或多或少)。由于guid是随机的,所以它必须将其放入现有块中。也就是说,我们对一些表使用guid,即使在相当重的负载下,它们也能正常工作。

“旧的、可靠的自动递增int”很大程度上取决于数据库的可伸缩性。当你有一个至少有两个主程序的设置时,自动递增将停止工作。当然,解决这个问题并不太困难,因为这是一个非常普遍的问题;不同的数据库引擎可以协调主机之间的序列,例如,从任何给定序列中只能分配一个主机

当您开始对数据进行切分时,通常希望从密钥中了解切分。自动递增的id不包含关于哪个碎片应该承载该记录的信息

GUID以不同的方式解决问题;两个不同的主机具有不同的主机标识符(通常是MAC地址)。由于在计算新的GUID时使用了它,不同的主控器无法创建冲突的GUID。此外,由于主机是ID的一部分,因此可以使用它直接标识保存记录的碎片


第三种选择是根本不使用代理键(既不使用自动递增整数,也不使用guid)

根据您的经验,除了自动增量ID之外,您从未需要过任何东西,这可能表明GUI通常是一种解决问题的方法。当您遇到您熟悉的模式不起作用的需求时,使用它们。微观性是无关紧要的


我见过的唯一现实的场景是合并来自两个源的表。

我建议使用int-ID而不是Guid,原因如下:

  • Int ID的大小为4字节(32位),而Guid的大小为16字节(128位),是它的4倍。在这种情况下,您可能会遇到性能问题和存储问题
  • 默认情况下,GUID不是顺序的(请小心)
  • 很容易将表之间的链接和关系可视化

从同一主机上看到多个GUI是很常见的;或者没有MAC地址的设备。只是出于好奇,你多久会看到重复的?这个答案大部分都超出了我的理解。我一次不需要处理比1分贝更复杂的东西。尽管如此,+1还是为我提供了一些可供研究的条件这是他所说的话的一个例子。在两个不同的数据中心中有两个数据库,每个数据库都在创建记录。如果您尝试合并这些,那么您必须确保主键不同。一种方法是将“自动增量”设置为一个为奇数,另一个为偶数。另一个是使用guid。。。因为它们应该永远不会碰撞,好吧,但我什么时候想使用它们呢?顺序guid解决了这个问题,例如