代码之家  ›  专栏  ›  技术社区  ›  Nate CSS Guy

SQL Server数据库中最常见的ID类型是什么?哪个更好?

  •  6
  • Nate CSS Guy  · 技术社区  · 15 年前

    最好使用guid(uniqueidentifier)作为主/代理键列,还是使用序列化的“identity”整型列;以及 为什么 这样比较好吗?在什么情况下,你会选择其中一个而不是另一个?

    8 回复  |  直到 6 年前
        1
  •  9
  •   marc_s    15 年前

    我个人对我的大多数主键和集群键使用int标识。

    你需要分开 主键 这是一个逻辑结构——它唯一地标识您的行,它必须是唯一的、稳定的,不能为空。一个guid对于一个主键也能很好地工作-因为它被保证是唯一的。如果您使用SQL Server复制,那么使用GUID作为主键是一个不错的选择,因为在这种情况下,您无论如何都需要一个唯一标识的GUID列。

    这个 聚类密钥 在SQL Server中,物理结构用于对数据进行物理排序,而且要正确排序要困难得多。通常,SQL Server上的索引皇后金伯利特里普(Kimberly Tripp)还需要一个良好的集群密钥,该密钥必须是uniqe、稳定的、尽可能窄的,并且理想情况下是不断增加的(int标识就是这样)。

    请参阅她关于索引的文章:

    对于集群密钥来说,guid是一个非常糟糕的选择,因为它很宽,完全是随机的,因此会导致索引碎片化和性能低下。此外,集群键行还存储在每个非集群(附加)索引的每个条目中,因此您确实希望保持较小的值-guid为16字节,int为4字节,并且有几个非集群索引和数百万行,这会产生巨大的差异。

    在SQL Server中,您的主键在默认情况下是您的集群键——但不一定是。您可以很容易地使用一个guid作为非集群主键,使用一个int标识作为集群键——只需要注意一点。

        2
  •  7
  •   flesh    15 年前

    在需要确保唯一性的复制系统中使用GUID。

    如果您有一个非复制的数据库,并且希望最大限度地提高性能,请使用ints。

        3
  •  5
  •   Adriaan Stander    15 年前

    非常适合使用guid。

    使用主键/代理键进行存储。

    这也将使人们更容易与数据进行交互。

    创建索引也会更有效率。

        4
  •  4
  •   Community CDub    7 年前

    当考虑使用整数时,一定要考虑可能出现的最大值。由于删除操作,您通常以跳过的数字结尾,因此实际的最大ID可能比表中的记录总数大得多。

    例如,如果您不确定32位整数是否可行,请使用64位整数。

    您可能还会发现这些其他讨论非常有用:

    How do you like your primary keys?

    What’s the best practice for Primary Keys in tables?

    Picking the best primary key + numbering system.

    如果你在这里搜索“主键”,你会发现它们和很多非常有用的讨论。

        5
  •  2
  •   Adam Robinson    15 年前

    对此没有单一的答案。人们很快就可以使用guid(他们的随机性与 违约 主密钥的行为也充当集群密钥)可以很容易地减轻。guid的范围比整数大,但当您开始用值填充该范围时,会增加发生冲突的风险。

    当您有一个分布式系统(例如,复制的数据库)时,guid可能非常有用,在该系统中,大量的工作必须进入密钥生成机制,而不会导致系统各部分之间的冲突。同样,整数也很有用,因为它们很容易使用(每种语言都有一个整型,不是每种语言都有一个guid类型),并且可以是连续的(guid也可以,但这不是它们的 打算 使用)。

    所有这些都是关于你存储的东西和如何存储的。那些说“永远不要使用guid”的人!他们只是在传播FUD,但也不是每个问题的答案。

        6
  •  2
  •   Patrick Karcher    15 年前

    我相信它几乎总是一个序列化的IDENTY整数,但有些人会不同意。这取决于具体情况。

    认同的原因是效率和简单性。它更小。更容易索引。它创造了一个 伟大的 聚集索引。随着新记录的有序保存,碎片减少。对于连接的索引很好。在数据库中查看记录更容易。

    在某些情况下,确实有一个地方可以放吉他。当合并不同的数据时,或者当必须在某些地方创建记录时。吉他应该放在你的技巧袋里,但通常不会是你的第一选择。

        7
  •  2
  •   Cœur Gustavo Armenta    6 年前

    这是一个经常争论的话题,但我倾向于更多地倾向于身份,原因有两个。首先,一个整数相对于一个16字节的guid只有4个字节。这意味着索引更窄,查询更高效。其次,我们利用 @@IDENTITY SCOPE_IDENTITY 存储的程序等中有很多是用guid从窗口输出的。

    这里有一点不错 article by Jeff Atwood .

        8
  •  1
  •   Dan Williams    15 年前

    如果您认为需要使用数据库外部的数据,即其他数据库,请使用guid)。有人会争辩说,情况总是这样,但这是一种判断。