要点
- 多くのB2Bプロダクトは、共有データベースと行レベルの分離から始めるべき。
- コンプライアンスや規模が求めるテナントだけを、専用スキーマやデータベースに移す。
- テナントのコンテキストは、アプリのコードだけでなくデータ層で強制する。
- テナントごとのエクスポートとバックアップを最初から設計する。
テナンシーは、SaaSプロダクトで後から変えるのが最も難しい判断のひとつです。代表的な3つのモデルの実践的な比較と、選択を左右すべきシグナルを紹介します。
代表的な3つのモデル
マルチテナントのシステムは、通常次の3つのいずれかを使い、それぞれ分離の強さと運用コストのバランスが異なります。
- 共有データベース・共有テーブル:すべての行にテナントIDを持たせる。運用コストが最も低く、デプロイも簡単だが、既定では分離が最も弱い。
- 共有データベース・テナントごとのスキーマ:データベース内でテーブルをテナントごとに複製する。分離は強まるが、マイグレーションが複雑になる。
- テナントごとのデータベース:分離が最も強く、テナント単位のバックアップも容易だが、運用コストが最も高い。
妥当な初期選択
初期のB2Bプロダクトの多くは、すべての行にテナントIDを持つ共有テーブルから始めるのが正解です。インフラが単純に保たれ、課金、分析、サポートなどテナントをまたぐ処理も簡単です。
リスクはフィルターの付け忘れによるデータ漏えいです。これはコードだけでなくデータベースで防ぎます。例えばPostgreSQLの行レベルセキュリティポリシーを使えば、開発者が忘れても、すべてのクエリを現在のテナントに限定できます。
より強い分離が必要になるシグナル
より強い分離は特定の条件が現れたときに価値が出ます。すべてのテナントに適用する必要はほとんどありません。
- 大企業の顧客が契約で専用ストレージを求めている。
- 規制で特定地域へのデータ保管が求められる。
- ひとつのテナントのデータ量が他のテナントの性能に影響している。
- 顧客が独立したバックアップとリストアを必要としている。
ハイブリッドを前提に計画する
長期的に最も現実的な設計は、複数のモデルを扱えるものです。ほとんどのテナントはインフラを共有し、少数の大規模または規制対象のテナントだけが専用データベースを持ちます。これは、テナントの解決が一か所、通常はリクエストを適切な接続に振り分けるルーティング層で行われている場合にのみ可能です。
最初は常に同じデータベースを返すとしても、このルーティング層を早めに作っておきましょう。今は小さなコストで、後に大きな節約になります。
運用面で重要な細部
テナンシーはスキーマだけの問題ではありません。レート制限、バックグラウンドジョブ、ファイルの保存パス、キャッシュ、ログのすべてにテナントのコンテキストが必要です。データのエクスポートやアカウント削除など顧客向けの機能も同様で、大企業の購買担当者は調達時に必ず確認します。
参考になりましたか?次の記事をメールで受け取れます。

