簡體   English   中英

PHP從數據庫生成唯一ID

[英]PHP Generating unique id from database

在我的項目中,我正在從數據庫表生成唯一ID,該ID取屬性'serial_key'的最大整數值加上該數字1。 它正在生成唯一索引以添加新的記錄元組。

但是,當我在Intranet或Internet的多台PC上部署應用程序時,該機制失敗了,它立即在所有不同的計算機上生成了相同的唯一ID。 而且我在服務器中有大量數據,因此我必須管理相同的ID模式,因為它是采用特定格式構造的。 請建議如何解決此問題。 謝謝。

您可以使用HiLo算法來生成唯一密鑰。 可以針對性能或連續鍵進行調整。 如果在所有客戶端(我猜是Java和php)中實現它,您將在任意數量的鍵中獲得唯一鍵(或數據庫性能允許)。 您也不會依賴任何數據庫,並且如果為吞吐量而對其進行調整,則不需要太多其他數據庫查詢。

請參閱此SO-Answer

您可以通過在serial_key列上使用AUTO_INCREMENT屬性來解決此AUTO_INCREMENT 這樣,您就不必擔心數據沖突。 這是主鍵的常見做法。

適當的“分配器表”設計,用於基於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年代就與他進行了交流,向他提出了這種改進的方案,但是他過於固執和固執,無法承認使用線性數字線的優勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM