可能的重复:
您觉得您的主键怎么样?

我知道使用 GUID 的好处,以及在数据库中使用 INT 作为 PK 的好处。考虑到 GUID 本质上是 128 位 INT,而普通 INT 是 32 位,因此 INT 可以节省空间(尽管这一点在大多数现代系统中通常没有实际意义)。

最后,在什么情况下您会使用 INT 作为 PK 而不是 GUID?

有帮助吗?

解决方案

Kimberley Tripp(SQLSkills.com)关于使用GUID作为主键的文章。由于不必要的开销,她建议反对它。

其他提示

除了在需要同步多个数据库实例时选择不好时,INT还有一个我没有提到的缺点:插入总是出现在索引树的一端。当你有一个具有大量移动的表时,这会增加锁争用(因为相同的索引页必须通过并发插入来修改,而GUID将被插入到整个索引中)。如果使用B *树或类似的数据结构,则还可能必须更频繁地重新平衡索引。

当然,在进行手动查询和报告构建时,int更容易看到,并且空间消耗可能通过FK使用而增加。

我有兴趣看到有关例如SQL Server实际上使用IDENTITY PK来处理大量插入的表。

回答你的问题: 最后,在什么情况下你会看到自己使用INT作为PK而不是GUID?

如果我的系统具有离线版本的在线/离线版本,我可以使用GUID,您可以保存数据,并且在同步期间有一天将数据传输回服务器。这样,您确定在数据库中两次不会使用相同的密钥。

  

INT是一个节省空间(尽管如此)   在大多数现代人中,这一点通常都没有用   系统)。

不是这样。乍一看似乎是这样,但请注意,每个表的主键将在索引中的整个数据库中重复多次,并在其他表中作为外键重复。它几乎涉及任何包含其表的查询 - 当它是用于连接的外键时非常密集。

此外,请记住,现代CPU非常非常快,但RAM速度却没有跟上。因此缓存行为变得越来越重要。获得良好缓存行为的最佳方法是使用较小的数据集。因此,4到16个字节之间看似无关的差异很可能会导致速度明显不同。不一定总是 - 但这是需要考虑的事情。

我们在非常复杂的企业软件中到处都有指南。工作顺利。

我相信 Guid 在语义上更适合用作标识符。在遇到这个问题之前,不必要地担心性能也是没有意义的。谨防过早优化。

任何类型的数据库迁移都有一个优点。使用Guids,您将不会发生碰撞。如果您尝试合并多个使用整数作为标识的数据库,则必须替换它们的值。如果这些旧值在 url 中使用,那么在 SEO 命中后它们现在会有所不同。

在比较主键与外键之间的关系时,INT会更快。如果表格被正确编入索引并且表格很小,您可能看不到太慢,但您必须尝试确保。 INT也更容易阅读,并与其他人沟通。说起来要简单得多,“你能看一下1234的记录吗?”而不是“你能看一下记录031E9502-E283-4F87-9049-CE0E5C76B658吗?”

某些操作系统不再根据独特的硬件功能(CPUID,MAC)生成GUID,因为它使跟踪用户变得容易(隐私问题)。这意味着GUID的唯一性通常不再像许多人想象的那样普遍。

如果您使用数据库的某些auto-id功能,理论上数据库可以绝对确保没有重复。

如果数据存在于单个数据库中(因为我们一般编写的应用程序的大多数数据都是这样),那么我使用 IDENTITY 。打算使用这种方式很简单,不会破坏聚集索引并且绰绰有余。如果你使用负值,你将耗尽20亿个记录(如果你使用负值,大约40亿),但如果你在一个表中有那么多记录,那么你就会干杯,然后你就会遇到数据仓库问题。 / p>

如果数据存在于多个独立数据库或具有第三方服务的接口中,那么我将使用可能已生成的 GUID 。一个很好的例子是数据库中的UserProfiles表,它通过Active Directory分配给它们的 objectGUID 将Active Directory中的用户映射到应用程序中的用户配置文件。

如果您计划在某个阶段合并数据库,即对于多站点复制类型设置,Guid会节省很多痛苦。但除此之外,我发现Int更容易。

我一直认为PK应该是可能的数字。不要忘记将GUID作为PK可能意味着它们也在其他表中用作foriegn键,因此分页和索引等会更大。

我认为数据库也很重要。从MySQL的角度来看 - 通常,数据类型越小,性能越快。

对于int vs GUID似乎也适用 - http://kccoder.com/mysql/uuid-vs-int-insert - 表演/

如果此键绑定到类似的值,我将使用GUID作为PK。例如,用户标识(WinNT中的用户使用GUID描述)或用户组标识。 另一个例子。如果您开发用于文档管理的分布式系统,并且世界各地的不同地方的系统的不同部分都可以创建一些文档。在这种情况下,我会使用GUID,因为它保证在分布式系统的不同部分创建的2个文档不会具有相同的Id。

在调试时,INT肯定更容易阅读,而且要小得多。

但是,我会使用GUID或类似产品作为产品的许可证密钥。你知道它会是独一无二的,你知道它不是顺序的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top