GUID / UUID数据库密钥的优缺点

过去我曾在很多数据库系统上工作过,如果所有数据库键都是GUID / UUID值,那么在数据库之间移动条目会变得容易得多。 我已经考虑过几次这条路,但总会有一些不确定性,特别是在性能和​​未读出电话的URL上。

有没有人在数据库中广泛使用GUID? 通过这种方式我可以获得什么好处,以及可能的缺陷是什么?


优点:

  • 可以离线生成它们。
  • 使复制微不足道(而不是int的,这使它很难)
  • ORM通常喜欢它们
  • 独特的应用程序。 所以我们可以在我们的应用程序(也是guid)中使用我们的CMS(guid)中的PK,并且知道我们永远不会发生冲突。
  • 缺点:

  • 更大的空间使用,但空间便宜(呃)
  • 无法通过ID订购来获取插入订单。
  • 在网址中看起来很丑,但真的,跆拳道你在做一个真正的数据库密钥在URL!?
  • 更难以手动调试,但并不难。
  • 就个人而言,我使用它们来制作大小适中的系统中的大多数PK,但是我已经在一个遍布整个地方的系统上“受过训练”,所以我们必须拥有它们。 因人而异。

    我认为重复数据的东西是垃圾 - 但你可以得到重复的数据。 代孕键通常在我曾经工作过的地方皱眉。 尽管我们使用类似WordPress的系统:

  • 该行的唯一ID(GUID / whatever)。 用户永远不可见。
  • 公共ID从某个字段生成一次(例如标题 - 使其成为文章的标题)
  • 更新:所以这个人获得了很多+1,我认为我应该指出GUID PK的一个很大的缺点:聚集索引。

    如果你有很多记录和GUID上的聚集索引,你的插入性能就会下降,因为你插入项目列表中的随机位置(多数民众赞成在点),而不是在最后(这是快速)

    所以,如果你需要插入性能,也许使用auto-inc INT,并且如果你想与其他人分享它(例如,通过一个URL显示给用户)就会生成一个GUID,


    @Matt Sheppard:

    假设你有一张顾客的桌子。 当然,你不希望顾客多次出现在餐桌上,或者在整个销售和物流部门发生大量混乱(特别是如果关于顾客的多行包含不同的信息)。

    因此,您有一个唯一标识客户的客户标识符,并且确保标识符由客户(在发票中)知道,以便客户和客户服务人员在需要沟通时有一个共同参考。 为了保证不存在重复的客户记录,可以通过客户标识符上的主键或客户标识符列上的NOT NULL + UNIQUE约束来为表添加唯一性约束。

    接下来,出于某种原因(我想不出来),你会被要求在客户表中添加一个GUID列并将其作为主键。 如果客户标识符列现在没有唯一性保证,那么您需要在整个组织中发现未来的问题,因为GUID始终是唯一的。

    一些“架构师”可能会告诉你:“哦,但我们处理我们的应用层中真正的客户唯一性约束!”。 对。 有关通用编程语言和(尤其是)中间层框架的时尚将一直在变化,并且通常永远不会超出您的数据库。 而且很有可能在某些时候需要访问数据库而不通过本应用程序。 ==麻烦。 (但是幸运的是,你和“建筑师”早已不在了,所以你不会在那里清理垃圾。)换句话说:在数据库中保持明显的约束(以及其他层次,如果你有时间)。

    换句话说:将GUID列添加到表中可能有很好的理由,但请不要因为这种诱惑而降低您在真实(非非GUID)信息内实现一致性的雄心。


    主要优点是您可以创建唯一的ID而无需连接到数据库。 而且id是全球唯一的,所以你可以轻松地合并来自不同数据库的数据。 这些看起来很小的优势,但在过去为我节省了很多工作。

    主要的缺点是需要更多的存储空间(在现代系统中不是问题),并且这些id不是人类可读的。 调试时这可能是一个问题。

    有一些性能问题,如索引碎片。 但这些都很容易解决(吉米·尼尔森的梳子指南:http://www.informit.com/articles/article.aspx?p = 25862)

    编辑合并我对这个问题的两个答案

    @Matt Sheppard我认为他意味着你可以将具有不同GUID的行复制为主键。 这是任何一种代理键的问题,而不仅仅是GUID。 而且就像他说的那样,通过给非关键列添加有意义的唯一约束,很容易解决这个问题。 另一种方法是使用自然键,这些键存在真正的问题。

    链接地址: http://www.djcxy.com/p/16257.html

    上一篇: Advantages and disadvantages of GUID / UUID database keys

    下一篇: Is a GUID unique 100% of the time?