2012-10-02 126 views
0

我們將文檔存儲在我們的數據庫(sql server)中,文檔遍佈各種表,因此沒有一個表包含所有這些表。生成一個可靠的全系統唯一標識符

我現在有一個要求,即爲所有文檔提供一個系統範圍的唯一ID,一個半可讀的文檔,而不是一個GUID。

我以前見過這個做法是通過創建一個具有單行/列的表來創建新文檔時增加的數字。

這是最好的方式去做,如何確保沒有人讀取當前的數字,如果有人要更新,反之亦然?

在這種情況下,數字可以像001一樣,並根據需要自動遞增,我主要擔心停止衝突而不是獲得一個奇特的標識符。

+0

爲什麼沒有在一個表中的所有文件? – Random832

+0

它現有的系統,他們不存在,再加上他們有不同的數據存儲對他們,不適用於所有文件類型 –

回答

2

如果你想在單行/列的方式,我用:

declare @MyRef int 
update CoreTable set @MyRef = LastRef = LastRef + 1 

的更新將是安全的 - 每個誰執行它會接人在@MyRef中有明顯的結果。這比單獨讀取,增量,更新更安全。


表DEFN:

create table CoreTable (
    X char(1) not null, 
    LastRef int not null, 
    constraint PK_CoreTable PRIMARY KEY (X), 
    constraint CK_CoreTable_X CHECK (X = 'X') 
) 
insert into CoreTable (X,LastRef) values ('X',0) 
1

您可以使用Redis進行此操作。看看這篇文章:http://rediscookbook.org/create_unique_ids.html

Redis是一個非常快速的內存NoSQL數據庫,但其中一個具有持久性功能。您可以快速使用Redis實例並使用它創建增量數字,這些數字將是唯一的。

然後,您可以在應用程序中將Redis用於其他許多用途。

另一個不涉及安裝Redis的查詢建議是按照您的建議使用單個數據庫行/列,並將其封裝在事務中。這樣你就不會遇到衝突。

+0

看起來很有趣,不知道如果我想要去那麼遠,只是爲了得到一個獨特的數字系統 - 全部 –

+1

如果事務需要很長時間,是否有人可以獲得當前索引,然後當事務完成時用重複值覆蓋它 –

+0

否,您應該讀取當前索引,並添加1(或者這樣),編寫它,然後將該編號用於新生成的記錄。所有這些都應該在交易中完成。如果另一個進程試圖讀取當前索引,那麼它也將在一個事務中,並且在第一個事務沒有提交時(記錄將被鎖定),它將不能讀取該數字。 –

1

一個'經典'的方法的確會有一個單獨的表(例如Documents)(至少)有一個ID列(int identity)。然後,將外鍵列和約束添加到所有現有文檔表中。這確保了文檔ID在所有表格上的唯一性。

事情是這樣的:

CREATE TABLE Documents (Id int identity not null) 


ALTER TABLE DocumentTypeOne 
ADD CONSTRAINT (DocumentId) DocumentTypeOne_Documents_FK Documents(Id)