【问题标题】:how to implement unique IDs across many tables如何在多个表中实现唯一 ID
【发布时间】:2012-07-28 01:29:03
【问题描述】:

如果您查看 facebook 的图形 API,似乎所有对象共享相同的 ID 空间,并且所有 Id 都是唯一的,即使它们位于不同的表中。

MySQL 中是否有处理此问题的功能? (如果没有,如何实现的高级想法?)

【问题讨论】:

    标签: mysql database unique key


    【解决方案1】:

    您可能想查看UUID()。它返回一个全局唯一 ID,因此您的 ID 永远不会发生冲突。

    要将其转换为整数格式,您可以

    UNHEX(REPLACE(UUID(),'-',''))
    

    用于存储在BINARY(16) 列中。

    (转换为整数的来源:Nicholas Sherlock's comment 在 MySQL 参考)

    【讨论】:

    • 它似乎返回了一个字符串,这如何转换为串行主键?
    • 实际上是以字符串格式返回的128位整数。编辑了我的答案以包含将其转换为 16 字节整数的方法。
    【解决方案2】:

    如果您有一个主数据库服务器,您可以创建一个名为 Object 的表,该表具有一个整数自增主键和一个对象类型列。每次创建对象时,首先在此 Object 表中插入一行,获取 id,然后使用该 id 将一行插入到将保存对象信息的任何表中。所以要创建一个事件:

    INSERT INTO Object (object_type) VALUES ('Event')
    

    获取最后一个插入 id,假设是 12345。

    INSERT INTO Event (id, name, location) VALUES (12345, 'Cookout', 'My back yard')
    

    【讨论】:

    • 这当然是可扩展的。
    • 那么你将如何查询给定 ID 的对象?遍历所有表?
    • @pyramation 先查询对象表找到类型,再查询相应的表。将最近查询的对象类型保存在 memcache 中,以避免额外的查询。
    • @walrii 这对于小型站点来说具有足够的可扩展性。除非你认为你会成长到 Facebook 或 Twitter 的规模,否则这会很好用。如果你确实长得那么大,这是一个很好的问题。然后你可以使用 Twitter 的 Snowflake:engineering.twitter.com/2010/06/announcing-snowflake.html
    【解决方案3】:

    或者使用单个序列来驱动 ID 值。

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2022-01-06
      • 2020-04-17
      • 2015-01-30
      • 2022-12-22
      相关资源
      最近更新 更多