PHP从数据库生成唯一ID

时间:2013-08-26 06:02:13

标签: java php sql wamp

在我的项目中,我从数据库表生成一个唯一的id,获取属性'serial_key'的最大整数值,并为该数字加1。它正在生成唯一索引以添加新的记录元组。

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

3 个答案:

答案 0 :(得分:0)

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

请参阅此SO-Answer

答案 1 :(得分:0)

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

答案 2 :(得分:0)

正确"分配器表"便携式基于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的高概念不同,它将键空间视为连续的线性数字线 - 从中​​有效地分配了可配置大小的小块。这些键是人性化的,不会浪费大块。 Ambler先生的想法是分配高16位或32位,并且需要丑陋的复合键或生成大的人类不友好的键值作为hi-words增量。

分配密钥的比较:

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

猜测哪些密钥更易于为开发人员或数据库管理员使用。

我实际上是在90年代与他通信,向他推荐这个改进的计划,但他太过困难了。顽固地承认使用线性数字线的优点。