首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP从数据库生成唯一id

问PHP从数据库生成唯一id
EN

Stack Overflow用户
提问于 2013-08-26 14:02:13
回答 3查看 473关注 0票数 0

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

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

EN

回答 3

Stack Overflow用户

发布于 2013-08-26 14:11:01

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

请参阅此SO-Answer。

票数 0
EN

Stack Overflow用户

发布于 2013-08-26 14:15:15

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

票数 0
EN

Stack Overflow用户

发布于 2013-08-26 17:21:12

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

代码语言:javascript
复制
create table KEY_ALLOC (
    SEQ varchar(32) not null,
    NEXT bigint not null,
    primary key (SEQ)
);

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

代码语言:javascript
复制
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位,并且需要丑陋的组合键或生成大的人类不友好的键值作为嗨字的增量。

已分配密钥的比较:

代码语言:javascript
复制
Linear_Chunk       Hi_Lo
100                65536
101                65537
102                65538
.. server restart
120                131072
121                131073
122                131073
.. server restart
140                196608

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

实际上,我早在90年代就与他通信,向他建议这个改进的方案,但他太固执,不承认使用线性数字行的好处。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18437573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档