2011-07-15 132 views
5

我有一個完整的多租戶數據庫,在所有租用的數據庫上都有TenantID。這一切都運行良好,除了現在我們有要求租用數據庫「鏈接到」共享數據。因此,例如,用戶可以創建自己的「銀行」記錄並將賬戶鏈接到他們,但他們也可以將賬戶鏈接到所有租戶共享的「全球」銀行記錄。帶有一些共享數據的多租戶數據庫

我需要一個優雅的解決方案,保持參照完整性

我來了這麼遠的方式:

  1. 複製:所有共享數據被複制到每個租戶,也許用「系統「標誌。共享數據的更改涉及所有租戶的大量更新。 也許最簡單的解決辦法,但我不喜歡重複數據
  2. 特殊ID的:對共享數據的所有鏈接中使用特殊的ID(例如負的ID號)。這些表明TenantID不在關係中使用。 您不能使用FK來正確執行此操作,並且如果您擁有任何FK,則肯定無法在租戶內重複使用ID。只有觸發器才能用於完整性。
  3. 單獨ID's:所有可鏈接到共享數據的表都有兩個FK;一個使用TenantID並鏈接到本地​​數據,另一個不使用TenantID並鏈接到共享數據。約束表示要使用一個或另一個,而不是兩個。 這可能是最「純」的方法,但它看起來......醜陋,但也許不像其他人那麼醜陋。

所以,我的問題是兩個部分:

  • 有沒有我還沒有考慮任何選項?
  • 有沒有人有這些選項的經驗,並有任何反饋的優點/缺點?

回答

3

一位同事給了我一個很好的見解。而不是像租戶那樣考慮租戶的訪問權限,將其視爲團體訪問權限。租戶可以屬於多個組,包括它自己指定的組。然後數據屬於一個小組,可能是租戶的特定小組,也可能是更普通的小組。

因此,「我的銀行」屬於租戶組,「本地銀行」屬於租戶可以訪問的地區組,「全球銀行」屬於「所有人」組。

這保持了完整性,FK的,並增加了擁有租戶層次的可能性,而不是我在我的場景中需要的東西,但一個很好的小可能性。

0

Citus,我們正在使用PostgreSQL構建一個多租戶數據庫。對於共享信息,我們將其保留在我們所稱的"reference" tables中,這些信息確實在所有節點上覆制。但是,我們使用2PC保持同步和一致,並且還可以在參考數據和非參考數據之間創建FK關係。 你可以找到更多的信息here