2015-07-21 60 views
3

我正在開發一個存儲軟件,其中MySQL和PHP本地數據庫將同步到聯機數據庫。如何在聯機和本地MySQL數據庫同步時創建主鍵

假設我有一個表賣,sell_id是表的主鍵。我通常使用INT和主鍵自動增量。

本地數據庫1賣出表具有2條目(sell_id 1,2)和本地數據庫2賣出表具有2條目(sell_id 1,2)。

如果我將這兩個本地銷售表條目同步/插入到在線銷售表中,它將變爲(sell_id 1,2,3,4)。

由於出售ID變化,它會影響其他表中使用sell_id作爲外鍵的其他表中的條目。

enter image description here

我應該如何計劃建立在這種情況下主鍵。

我打算使用字母數字 id,這對於兩個數據庫都是唯一的。它會創建任何問題或進一步減慢我的數據庫查詢數百萬的sell_id?

enter image description here

是否有任何其他方式來解決這個問題?

+0

使用過程來選擇要從本地數據庫導入的所有內容,然後將ID更改爲新的sell_id並進行正確的插入。或者創建一個觸發器來更改所有的sell_id的 – nada

+0

如果你的主鍵是一個INT或CHAR,那麼不應該有太大的差別,性能方面,儘管有一些帶有'VARCHAR'和'MyISAM'表的弱點,但是什麼也沒有太可怕了。你最大的問題可能是首先產生這個價值。 – CD001

+0

您可以有一個額外的列標識客戶端,並使用作爲主鍵。這樣你就會知道一個給定的元組從哪裏來。但是我不清楚這些元組是否可以引用相同的* object *;在這種情況下,您可能需要與SKU等效的東西。對於購買等,應該工作。對於客戶,您還需要某種雙向同步。 – LSerni

回答

1

這太長了評論。

通常,當您擁有複製系統時,目標是在所有服務器上保持相同的數據。這似乎不是您的業務需求。

相反,您可能會考慮在所有服務器上使用複合主鍵。這會將自動遞增的主鍵與服務器ID結合起來。所有引用外鍵的表都需要包含「服務器」列和「id」。

一般來說,我不是複合主鍵的粉絲。但是,您有一個分佈式數據庫,需要識別數據所在的特定數據庫「分區」。這似乎是複合主鍵的一個很好的用例。

另一種方法 - 如果你願意承擔風險 - 就是在每臺服務器上將自動編號設置爲不同的起始值。對於一臺服務器使用大的整數和大的值,例如1,000,000,000,000,對於下一個等2000,000,000,000。然而,我的首選是將「服務器」明確地表示爲一列。

+0

我喜歡這裏的複合鍵方法;如果/當一個新服務器被添加到「集羣」(不是真的是正確的詞,但我現在想不到一個更好的服務器)時,只需確保它在所有系統中都可以被複制。 – CD001

相關問題