我們將文檔存儲在我們的數據庫(sql server)中,文檔遍佈各種表,因此沒有一個表包含所有這些表。生成一個可靠的全系統唯一標識符
我現在有一個要求,即爲所有文檔提供一個系統範圍的唯一ID,一個半可讀的文檔,而不是一個GUID。
我以前見過這個做法是通過創建一個具有單行/列的表來創建新文檔時增加的數字。
這是最好的方式去做,如何確保沒有人讀取當前的數字,如果有人要更新,反之亦然?
在這種情況下,數字可以像001一樣,並根據需要自動遞增,我主要擔心停止衝突而不是獲得一個奇特的標識符。
我們將文檔存儲在我們的數據庫(sql server)中,文檔遍佈各種表,因此沒有一個表包含所有這些表。生成一個可靠的全系統唯一標識符
我現在有一個要求,即爲所有文檔提供一個系統範圍的唯一ID,一個半可讀的文檔,而不是一個GUID。
我以前見過這個做法是通過創建一個具有單行/列的表來創建新文檔時增加的數字。
這是最好的方式去做,如何確保沒有人讀取當前的數字,如果有人要更新,反之亦然?
在這種情況下,數字可以像001一樣,並根據需要自動遞增,我主要擔心停止衝突而不是獲得一個奇特的標識符。
如果你想在單行/列的方式,我用:
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)
您可以使用Redis進行此操作。看看這篇文章:http://rediscookbook.org/create_unique_ids.html
Redis是一個非常快速的內存NoSQL數據庫,但其中一個具有持久性功能。您可以快速使用Redis實例並使用它創建增量數字,這些數字將是唯一的。
然後,您可以在應用程序中將Redis用於其他許多用途。
另一個不涉及安裝Redis的查詢建議是按照您的建議使用單個數據庫行/列,並將其封裝在事務中。這樣你就不會遇到衝突。
看起來很有趣,不知道如果我想要去那麼遠,只是爲了得到一個獨特的數字系統 - 全部 –
如果事務需要很長時間,是否有人可以獲得當前索引,然後當事務完成時用重複值覆蓋它 –
否,您應該讀取當前索引,並添加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)
爲什麼沒有在一個表中的所有文件? – Random832
它現有的系統,他們不存在,再加上他們有不同的數據存儲對他們,不適用於所有文件類型 –