2013-08-26 70 views
0

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

但是,當我在內部網或互聯網上的多臺PC上部署應用程序時,此機制失敗,它在瞬間在所有不同的機器上生成相同的唯一ID。而且我在服務器中有很多數據,所以我必須管理相同的id模式,因爲它是以特定格式構建的。請建議如何解決此問題。謝謝。

+0

使用mysql UUID(),您也可以使用時間戳+ ip生成新的數字 –

+2

爲什麼不只是使用自動遞增標識列? – Orangepill

+0

實際上它會在頁面加載和用戶填充後生成密鑰,然後提交。這就是爲什麼自動遞增不起作用。 – user2431351

回答

0

您可以使用HiLo算法來生成唯一的密鑰。它可以調節性能或連續按鍵。如果你在所有的客戶端實現它(我猜java和php),你會得到唯一的鍵,只要你喜歡(或者你的數據庫性能允許)。你也不會依賴任何數據庫,如果你調整它的吞吐量,你不需要額外的數據庫查詢。

看到這個SO-Answer

+0

使用類似的分配器表的更好的解決方案,但只是從線性數字空間中分配20個整數的範圍。 (而不是Ambler關於分配高16位或32位的醜陋想法,這通常會浪費大部分低位字,並會產生人爲不友好的密鑰。) –

0

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

0

基於便攜式數據庫的密鑰分配的適當的「分配器表」設計:優先使用斯科特安布勒的誤導式「高低」理念。

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 

猜測哪些鍵是更容易爲開發商或DB管理工作。

在90年代,我確實與他通信以向他提出這個改進方案,但他太過堅持以承認使用線性數字線的優點。