【问题标题】:PHP Generating unique id from databasePHP从数据库生成唯一ID
【发布时间】:2013-08-26 06:02:13
【问题描述】:

在我的项目中,我从一个数据库表中生成一个唯一 ID,该 ID 采用属性“serial_key”的最大整数值,并将该数字加 1。它正在生成唯一索引以添加新的记录元组。

但是当我在 Intranet 或 Internet 中的多台 PC 上部署应用程序时,这种机制失败了,它会立即在所有不同的机器上生成相同的唯一 ID。而且我在服务器中有大量数据,因此我必须管理相同的 id 模式,因为它是采用特定格式构建的。请建议如何解决此问题。谢谢。

【问题讨论】:

  • 使用mysql UUID(),也可以使用时间戳+ip生成新号码
  • 为什么不使用自动递增标识列?
  • 实际上是在页面加载和用户填写后生成key然后提交。这就是为什么自动递增不起作用的原因。
  • 为什么要生成密钥,让提交返回密钥值,以防您需要它用于其他用途。这样就可以使用自动增量。

标签: java php sql wamp


【解决方案1】:

您可以使用 HiLo 算法来生成唯一密钥。它可以针对性能或连续键进行调整。如果您在所有客户端(我猜是 java 和 php)中实现它,您将在任意数量的键中获得唯一键(或者您的数据库性能允许)。您也不会依赖任何数据库,如果您针对吞吐量对其进行调整,您将不需要太多额外的数据库查询。

看到这个SO-Answer

【讨论】:

  • 更好的解决方案是使用类似的分配器表,但只需从线性数字空间分配 20 个整数的范围。 (而不是 Ambler 分配高 16 位或 32 位的丑陋想法,这通常会浪费大部分低位字并生成对人类不友好的键。)
【解决方案2】:

您可以通过在 serial_key 列上使用 AUTO_INCREMENT 属性来解决此问题。这样您就不必担心数据冲突。这是主键的常见做法。

【讨论】:

    【解决方案3】:

    为可移植的基于 DB 的密钥分配进行适当的“分配器表”设计:优先使用 Scott Ambler 被误导的“hi-lo”想法。

    create table KEY_ALLOC (
        SEQ varchar(32) not null,
        NEXT bigint not null,
        primary key (SEQ)
    );
    

    分配下一个,比如说,20 个键(然后作为一个范围保存在服务器中并根据需要使用):

    select NEXT from KEY_ALLOC where SEQ=?;
    update KEY_ALLOC set NEXT=(old value+20) where SEQ=? and NEXT=(old value);
    

    如果您可以提交此事务(使用重试处理争用),则您已分配 20 个密钥并可以根据需要分配它们。

    此方案比从 Oracle 序列分配快 10 倍,并且在所有数据库中 100% 可移植。

    与 Scott Ambler 的 hi-lo 理念不同,它将键空间视为一个连续的线性数字线——从中有效地分配可配置大小的小块。这些密钥对人类友好,不会浪费大块。 Ambler 先生的想法是分配高 16 位或 32 位,并且需要丑陋的复合键或随着高字数的增加生成对人类不友好的大键值。

    分配键的比较:

    Linear_Chunk       Hi_Lo
    100                65536
    101                65537
    102                65538
    .. server restart
    120                131072
    121                131073
    122                131073
    .. server restart
    140                196608
    

    猜猜开发人员或数据库管理员更容易使用哪些键。

    实际上,我早在 90 年代就与他通信,向他提出了这个改进方案,但他太固执和固执地承认使用线性数轴的好处。

    【讨论】:

      猜你喜欢
      • 2013-05-22
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 2012-03-28
      相关资源
      最近更新 更多