2009-10-14 26 views
3

我正在權衡可用於多主複製的整數主鍵的選項。 (我使用整數密鑰而不是GUID銷售)用於複製的整數主鍵

最好的我可以拿出最重要的數據先服務器號碼最後: 例如。在服務器2 = 102 上服務器發票1 1 = 101 發票1其中非serverno部分(invoiceno)來自一個分貝數發生器

算法:GEN_ID(INVOICENO_GEN,1)* 100 + serverno 並可以通過查看數值和數學得到服務器編號。

這爲99個服務器留下空間,但仍然很短並且可讀,不會發生衝突。使用該方案和普通整數大小列將使最大行數(21 474 836)或者如果使用bigint數十億。

例如發票表鍵是這樣的:

Server 1  
101 
201 
301 
401 

Server 2  
102 
202 
302 
402 

所以我的問題是:任何批評或缺陷我忽略了?

數據庫是Firebird。

回答

2

剛剛創建一個複合主鍵怎麼樣?

定義要在每個服務器上設置的「ServerID」,例如,作爲INT的1,2,3,4等。然後將「InvoiceID」作爲您的Invoice表中的INT。

創建主鍵爲(ServerID,InvoiceID)。

這樣,你就有超過99個服務器的空間,你不必操縱/計算任何ID或類似的東西。

當然,現在任何引用您的Invoice表的表都需要使用(ServerID,InvoiceID)作爲外鍵 - 但是我猜如果您需要在表中的任何地方使用ServerID都不會成爲問題也複製這些表格。

馬克

+0

我不想爲此引入組合鍵。首先,組合鍵是PITA需要處理的,並且他並不認爲他真的有興趣根據附加信息來關聯這些數據。 –

+0

我們大部分的代碼和我們使用的庫都是針對單一主鍵進行優化的。因此,從數據庫的角度來看,複合主鍵是「正確的」答案,但從發展的角度來看並不好。 – AngelBlaZe

+0

只是爲了澄清我們將有一個serverno列以及查詢目的。我們沒有invoiceno(沒有serverno)列,因爲這是我們想要在發票,查找等上打印的東西。 – AngelBlaZe

2

一般來說,沒有任何東西是不是數字使用數值類型。處理具有特殊意義的數字使得您的號碼不再是嚴格的數字。一個字符串通常更適合於這樣的場景,您希望添加一些特定於環境的數據(通常用於複製)。

+0

嗯,我們實際上並不打算使用嵌入的數字,例如。在查詢中。這只是一種分離多個遞增值的方法,類似於更改生成器的步驟或開始。 – AngelBlaZe

+0

但你說得很好。將不得不做一些基準來看看一個整數主鍵是否真的是一個很大的收益。 – AngelBlaZe