2011-07-15 11 views
5

私はすべてのテナントデータベースにTenantIDを持つ完全なマルチテナントデータベースを持っています。これはすべてうまくいきますが、テナントデータベースが共有データに「リンク」することができるようにする必要があります。たとえば、ユーザーは独自の「銀行」レコードを作成してアカウントをリンクすることができますが、アカウントをすべてのテナントで共有される「グローバル」銀行レコードにリンクすることもできます。いくつかの共有データを持つマルチテナントデータベース

私は私がこれまでに出ている

方法参照整合性を保つエレガントなソリューションが必要です。すべての共有データは、おそらく "で、各テナントにコピーされます

  1. コピーをシステム "フラグ。共有データの変更には、すべてのテナントに大きな更新が必要です。 おそらく最も簡単な解決策が、私は、データの重複を好きではない
  2. 特別IDの:共有データへのすべてのリンクが特殊なIDの(例えば、負のID番号)を使用します。これらは、テナントIDが関係で使用されないことを示します。 FKを使用してこれを適切に実施することはできません。また、FKをお持ちの場合は、テナント内でIDを再利用することはできません。整合性のために使用できるのはトリガーだけです。
  3. 個別IDの:共有データにリンクできるすべてのテーブルには2つのFKがあります。 1つはテナントIDとローカルデータへのリンクを使用し、もう1つはテナントIDと共有データへのリンクを使用しません。制約は、どちらか一方が使用されることを示し、両方が使用されないことを示します。 これはおそらく最も純粋なアプローチですが、ちょうど...醜いかもしれませんが、他の人ほど醜いとは限りません。

だから、私の質問は2つの部分である:

  • は、私が考慮されていない任意のオプションがありますか?
  • 誰もがこれらのオプションの経験があり、長所/短所に関するフィードバックがありますか?

答えて

3

同僚は、うまくいきました。テナントごとのアクセスについて考えるのではなく、それをグループアクセスと考えてください。テナントは、指定されたグループを含む複数のグループに所属することができます。その場合、データはグループに属し、おそらくテナントの特定のグループ、またはより一般的なグループに属します。

「マイ銀行」はテナントグループに属し、「ローカルバンク」はテナントがアクセスできる地域グループに属し、「グローバルバンク」は「Everyone」グループに属します。

これは完全性、FK'sを保ち、私のシナリオでは必要なものではなく、テナントの階層を持つ可能性を追加します。

0

Citusで、PostgreSQLを使用してマルチテナントデータベースを構築しています。共有情報については、実際にすべてのノードにコピーされる"reference" tablesという名前で保管しています。ただし、2PCを使用してこれを同期させて一貫性を保ち、参照データと非参照データの間にFK関係を作成することもできます。 詳細はhereです。