Sql-Server
在不同的數據庫之間建立關係是不好的做法嗎?
我正在與具有多個數據庫的客戶合作。有幾個
master
級別數據庫與instance
級別數據庫(特定於應用程序的數據庫)有關係。從instance
to的關係master
是整數值,表示master
. 中的視圖和儲存過程instances
被設置為master
通過這些儲存的鍵載入數據。顯然,沒有真正的參照完整性,但這是不好的做法,還是數據應該駐留在數據庫的只讀表中
instance
?
唯一的問題是沒有真正方便的方法來強制執行這些關係。您可以使用大量觸發器,或者將主表儲存在每個實例數據庫中,然後將所有這些表作為元數據簡單地公開給主表,也許使用視圖。
我認為,最大的缺點與保持數據的準確性和同步性有關,至少在我想不到的三種情況下(即使您使用觸發器,所有這些仍然可能是一個問題):
- 跨數據庫事務協調不當- 例如,一個事務將新行添加到主控,將身份移交給另一個事務,然後第一個事務回滾。
- 從單個數據庫故障中恢復- 數據庫崩潰,您必須恢復到一個時間點,該時間點可能在其他數據庫中的其他成功事務完成之前。這可能意味著如果實例數據庫必須恢復到更早的時間,它會失去 master 期望的行;如果 master 必須還原,則所有實例數據庫都可能具有 master 中不存在的值。
- 一般的備份一致性——如果您需要災難恢復,您將很難將所有完整備份和日誌備份在事務上保持一致到某個時間點。文件系統快照對此沒有幫助,甚至可用性組也不保證單個可用性組中數據庫的跨數據庫事務一致性。如果您遇到災難並且需要將數據庫恢復到新系統,則無法確保它們在事務上是一致的。
話雖如此,我一直並且永遠都喜歡將租戶分離到他們自己的數據庫中,我承認中央數據庫存在風險 - 但這是必要的。
(順便說一句,您應該為您的數據庫使用主/實例以外的名稱。
master
在 SQL Server 中肯定有明確的含義,即使閱讀我自己的話上面它們也可能是模棱兩可的。對於. 也是如此instance
。在前世,我執行了一個 multi -租戶系統,我們稱之為中央數據庫Control
和租戶數據庫,嗯,Tenants
。)