2009-05-01 51 views
1

我處於一種情況,我們有一個新版本的軟件即將使用獨立數據庫(模式的重大更改)。新系統和舊系統都將投入生產,並且我們需要確保在兩個數據庫之間生成唯一的ID(我們不希望數據庫A中有一行)需要相當長的一段時間與數據庫B中的行具有相同的ID)。數據庫是Sybase。防止多個數據庫之間的重複鍵

可能的解決方案我已經出來:

  1. 使用支持真正大量的數據類型和分配範圍爲每個,希望他們永遠不會溢出。
  2. 對一個數據庫使用負值,對另一個使用正值。
  3. 添加一個標識數據庫的附加列,並使用該標識和當前標識的組合作爲關鍵字。
  4. 哭。

我還能做什麼?有沒有更優雅的解決方案,對於兩個數據庫一起工作?如果有問題,我相信這兩個數據庫將位於同一臺服務器上。

+0

您是否願意對舊的,新的和/或兩個數據庫的PK進行更改? PK問題涉及多少表? PK可以在不同的數據庫中使用不同的數據類型,還是必須是相同的?建議使用GUID很容易,但是如果您必須對兩個DB進行大規模更改才能完成此操作,那麼它是否是最好的方法? – 2009-05-01 15:08:09

回答

5

我見過這種事發生了幾次。在我參與的那些項目中,我們僅僅爲舊項目分配了足夠大的ID空間(因爲它已經運行了一段時間,並且我們知道它使用了多少個密鑰,我們可以計算出它有多少個密鑰'需要一個指定的'壽命'),並啓動新數據庫的「ID序列」。

如果僅因爲它們都需要更改「傳統」應用程序,這是我認爲沒有必要採取的風險,我會建議不要採用其他任何技巧。

6

在這種情況下,GUID或全局唯一ID可以是方便的主鍵。我相信Sybase支持他們。

編輯:雖然如果您的整個數據庫已經基於整數主鍵,切換到GUID可能不是很實際 - 在這種情況下,正如GWLlosa和其他人所建議的那樣,僅對數據庫之間的整數空間進行分區。

2

用#預先播種您的新數據庫,該數值比您的舊數據庫在合併它們之前所達到的要大。

我已經完成了這項工作,而且記錄數量相當低,所以我開始使用200,000的新數據庫作爲最初的記錄數。那麼當時間到了,我只是將所有的舊記錄遷移到新系統中。

完美解析!

2

GUID是專爲這種情況而設計的。

3

在你的情況下,我會考慮使用uniqueidentifier(GUID)作爲數據類型。當您使用system function newid()創建它們時,它們被認爲是獨一無二的。

CREATE TABLE customer (
    cust_key UNIQUEIDENTIFIER NOT NULL 
      DEFAULT NEWID(), 
    rep_key VARCHAR(5), 
    PRIMARY KEY(cust_key)) 
2

如果您將創建一個類似的數據庫,每一個新項目數量,你可以嘗試甚至IDS在一個數據庫中,奇IDS在其他。