可能重复:
你喜欢什么样的主键?
我知道使用GUID和使用数据库中的INT作为PK的好处。考虑到GUID本质上是一个128位的INT,而普通的INT只有32位,因此在大多数现代系统中,INT节省了空间(尽管这一点通常无关紧要)。
最终,在什么情况下您会选择使用INT作为PK,而不是GUID呢?
可能重复:
你喜欢什么样的主键?
我知道使用GUID和使用数据库中的INT作为PK的好处。考虑到GUID本质上是一个128位的INT,而普通的INT只有32位,因此在大多数现代系统中,INT节省了空间(尽管这一点通常无关紧要)。
最终,在什么情况下您会选择使用INT作为PK,而不是GUID呢?
Kimberley Tripp(SQLSkills.com)撰写了一篇关于使用GUID作为主键的文章。她建议不要这样做,因为会带来不必要的开销。
回答你的问题:
最终,在什么情况下,您会使用INT作为主键而不是GUID?
如果我的系统有在线/离线版本,并且在离线版本中可以保存数据并在同步期间将其传输回服务器的一天,则我会使用GUID。这样,您可以确保数据库中不会出现相同的键。
我们在我们的复杂企业软件中随处可见Guid。运作顺畅。
我认为,Guid更符合语义要求,适合作为标识符。在面临这个问题之前,不必无端担心性能问题。要警惕过早进行优化。
对于任何类型的数据库迁移,使用Guid也具有优势。使用Guid,您将不会发生冲突。如果尝试合并几个使用整数作为标识符的DB,则必须替换它们的值。如果这些旧值被用于URL中,那么现在将因SEO而产生差异。
INT类型是空间节省型的(虽然在大部分现代系统中这点通常已经无关紧要)。
并非如此。虽然乍一看是这样,但请注意每个表的主键会在整个数据库中以索引和其他表中的外键形式被多次重复。当它作为连接使用的外键时,在包含其所属表格的任何查询中都将非常频繁地参与其中。
此外,请记住现代CPU运算速度非常快,但是RAM的速度没有跟上。缓存行为因此变得越来越重要。获得良好的缓存行为的最佳方式是具有更小的数据集。因此,尽管4字节和16字节之间的看似微不足道的差异并不总是能产生显著的速度差异,但这是值得考虑的一个方面。
在比较主键和外键关系等值时,INT类型会更快。如果表格被适当地索引且表格较小,则可能不会看到太大的减速,但您必须尝试一下才能确定。 INT也更容易阅读,并与其他人沟通。说“你能看看记录1234吗?”比说“你能看看记录031E9502-E283-4F87-9049-CE0E5C76B658吗?”要简单得多。
如果您计划在某个阶段合并数据库,例如多站点复制类型设置,则Guid将节省很多麻烦。但除此之外,我发现Int更容易理解。
如果数据存储在单个数据库中(大多数我们编写的应用程序的数据都是如此),那么我会使用 IDENTITY
。它很容易使用,旨在以这种方式使用,不会使聚集索引碎片化,并且已经足够了。您将在某些记录数量达到20亿条时耗尽空间(如果使用负值,则为40亿条),但是如果您在一个表中有如此多的记录,那么您肯定会遇到数据仓库问题。
如果数据存储在多个独立的数据库中或与第三方服务进行接口,则我会使用已生成的 GUID
。一个很好的例子是数据库中的UserProfiles表通过他们在Active Directory分配给他们的objectGUID
将Active Directory中的用户映射到应用程序中的用户配置文件。
一些操作系统不再基于唯一硬件特征(CPUID,MAC地址)生成GUID,因为这使得跟踪用户变得太容易(涉及隐私问题)。这意味着GUID的唯一性通常不像许多人想象的那样普遍。
如果您使用数据库的自动ID功能,则该数据库理论上可以确保没有重复。
我一直认为 PK 应该在可能的情况下是数字。不要忘记,将 GUID 作为 PK 可能意味着它们也会被用作其他表中的外键,所以分页和索引等操作会更加复杂。