マルチテナンシー-単一のデータベースと複数のデータベース


20

私たちには多くのクライアントがあり、そのシステムはいくつかの機能を共有していますが、かなりの多様性も持っています。クライアントの数は増え続けています-常に健全なことです!-また、事業間の多様性も増大しています。

現在、単一のASP.Net(Webフォーム)Webサイト(Webプロジェクトとは対照的)があり、各テナントのサブフォルダーとそのテナントの非標準ページがあります。データベースアクセスとビジネスロジックを扱う別のモデルプロジェクトがあります。

(a)クライアントごとに1つのデータベースを持ち、そのクライアントに関連付けられた機能のみを持つ場合、どちらが望ましいか(最も重要なのはなぜか)。または(b)すべてのクライアントが共有する単一のデータベース。1つのクライアントがテーブルのサブセットのみを使用します。

ビジネス内の主な懸念は以上です。

  • 複数の資産のメンテナンス-バックアップ、バージョン管理など
  • 可能な限り再利用を促進する

これらの懸念にどのように対処し、どの解決策が望ましいか、そしてその理由をどのように確認しますか?(同様の質問への回答も編集しています)


これがAzureのようなPaaSクラウド環境に移行する可能性はありますか?その場合は、環境のベストプラクティスも検討する必要があります。前回見たとき、MSはAzure上のマルチテナントソフトウェアに複数のデータベースを推奨しました。
ハーパーシェルビー

質問してくれてありがとう。私は似たようなことを考えてきましたが、あなたほど雄弁に形式を質問することができませんでした。
MathAttack

Ayendeのマルチテナンシーブログシリーズをお読みください。彼は、マルチデータベースとシングルデータベースについて非常に良い点をいくつか述べています。
Sebazzz

回答:


12

10

SQL Serverを使用している場合は、1つのデータベースを使用しますが、スキーマを使用します。すべてのクライアントに一般的なものにdboを使用し、各クライアントのスキーマを作成し、そのクライアントのユーザーのデフォルトスキーマにします。これで、dboスキーマに一般的なオブジェクト(getBudget procなど)を持ち、スキーマ内のクライアント用に同じ名前のカスタマイズされたオブジェクトを持つことができます。


+1これにより、MSDTCを構成し、関連するオーバーヘッドを引き受ける必要がなくなります(2フェーズコミット)
ブライアン

そして、うまくいけば、あなたはCustomField30を通じてCustomField1のような列を有し、かつ/またはその他の予算、BudgetEx、BudgetCustom、BudgetCustomerName、BudgetAnotherCustomerName、のようなテーブルを持っていることのトラップを避ける
jfrankcarr

多数のストアドプロシージャを使用する既存のデータアクセスレイヤーがあります-190テーブル、テーブルあたり5コード生成プロシージャ、およびいくつかのカスタムプロシージャ-中期目標はEntity Frameworkを導入することですが、ストアドプロシージャを複製する必要がある場合各スキーマの手順?
RichardW1001

@ RichardW1001:依存します。spで動的SQLを実行して汎用化することもできますが、もちろん、少なくともある程度似た構造を持つSQLに依存しています。ダイナミックSQLの代替案としては、残念ながらSynonymsがあります。残念ながら、それらはシステム全体であり、トランザクション内に含まれていないため、異なる値の同時使用には適していません。
-jmoreno

複数のスキーマを使用している場合、EF Code Firstを使用すると、システムの稼働後にすべてのスキーマを最新バージョンに移行できますか?
ヤシュビット

4

クライアントのデータベースと機能は異なるため、ある時点でそれらは異なるシステムになることになります。この場合、各クライアントのカスタマイズを維持するコストが単一のメリットを上回るため、個別のシステムをお勧めします。データベースシステム。

単一のデータベースシステムは、異なる顧客間の変更が単なる構成であり、各クライアントの追加機能ではない場合に最適です。


共通の機能を最小限の痛みで管理する方法について、あなたの提案は何ですか?
RichardW1001

1
バージョン管理システムで、コアアプリケーションのヘッドを維持し、顧客ごとにメインブランチを作成し、維持する必要がある新機能のサブブランチを作成します。トランクなどを更新するために、オプションで、支店で顧客の特定の機能を開発することはできますが、それらを必要なときに簡単にそして、スピンアップ、顧客の特定の環境
スティーブンSenkomago Musoke

3

いくつかの懸念がありません。問題は成長とともに発生します。いつかあなたが1台のDBサーバーよりも大きくなると想定できる場合、1つの複雑なデータベースは間違いなく頭痛の種になります。事前にアーキテクチャに投資しない限り。しかし、それはまた高価なステップです)

ですから、忘れないでください、巨大なデータベースよりも数種類のデータベースをスケールアウトするほうが何倍も安く、何倍も簡単です)


スケーリングの容易さを確認するデータはありますか?もしそうなら、それは非常に説得力のあるケースになります。他に不足している懸念について詳しく説明していただけますか?私は可能な限り両側で議論を完全に構築しようとしています。
RichardW1001

1

回答で対処されていない領域の1つは、マルチテナントDBアプリケーションを正しく保護することに関する問題です。マルチテナントアプリは、セキュリティの問題を回避するために非常に慎重に設計する必要があります。ほとんどのデータベースとアプリは、完全ではありませんが一部を提供します-通常、DBスキーマ全体でデータを直接または間接的に推測する方法があります。そして、少なくとも他のテナントへの簡単なサービス拒否攻撃につながる可能性のあるかなりの数の共有リソース(ログやその他のファイル、DBAテーブル、カーソル...)、そして通常はそれ以上です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.