そのため、サービスとして実行するマルチテナント システムを構築しています。私たちはゼロから始めています。私たちは DDD に従っています。ドメインには (現時点で) ~20 個のエンティティがあり、後でさらに増える予定です。それは私たちによってホストされ、地理的に冗長であり (SQL クエリを除くすべての n+1 ;-))、柔軟な設計です (まあ、最後は私たち自身の要件であり、ビジネスではありません)。もちろん、必要に応じて簡単に変更できます)。私たちは .NET ベースで、バッキング ストアにリレーショナル データベースを使用します。オープンソースのツールやライブラリを使用することに (まったく) 反対しているわけではありません。
ビジネスに不可欠な機能の 1 つは、特定のエンティティがシステムのテナントによって拡張可能であることです。たとえば、クライアント A はエンティティ Foo に Title および Abstract プロパティを持たせたい場合がありますが、クライアント B はエンティティ Foo に Title Abstract ではなく Publish Date および Directed-By プロパティを持たせたい場合があります。
また、これを必要とするテナントのために複数の言語でデータをサポートする必要がある場合もあります。「静的」文字列と、エンティティにデータとして添付された文字列の両方。
そう。任意の数のフィールド (いくつかの共通のベースラインの上にあり、すべてのテナントが取得するこれらのエンティティに関する特定のものがあります)、クライアントによって定義可能です (データ型も定義できます)。データの翻訳の可能性 (エンティティを複製せずに、英語で 1 つのセットを設定せずに、フランス語で同じセットを設定せずに)。厳密に型指定された検索可能でクエリ可能なバッキング ストレージも (したがって、厳密に型指定され検索可能になる方法がない限り、XML フィールドに余分なものは入れられません)。高性能(ただし、二次的な要件として。機能は、必要に応じてハードウェアを購入するのに十分重要です)。
データ量?現在のシステムでは、「平均的な」クライアントには数百のエンティティがあり、「大きな」クライアントには数千のエンティティがあります。通常、要求はこれらのリストを 10 から 200 程度に絞り込んで表示します。最も一般的にやりたいことは、おそらく半ダースのエンティティ (新しいシステムでは拡張可能である必要があります) です。
その他のポイントは?各エンティティには、それを所有するテナントへの直接リンクがあります。
.NET ランドでこれを行うにはどうすればよいでしょうか。エンティティを IoC コンテナーに入れ、実行時にその場でまとめてグロブ化することが提案されていますが、それをリレーショナル データベースにどのようにマッピングすればよいでしょうか。
また、かなり前に Lucene.NET に関するAyende の投稿を読んだことも覚えていますが、これは良さそうですが、現時点では Lucene.NET や nHibernate を使用した経験はありません。(現在、ORM に Linq2Sql を使用する予定ですが、これをサポートするためにそれを変更する必要がある場合は、率直に言って、私は個人的に喜んでいます)。
Ayende からリンクされているこの Castle dev list スレッドを読みましたが、nHibernate には IUserType と呼ばれるものがあり、これが役立つようです。それを適用して、各テナントに適切な IoC を取得することができるのでしょうか? したがって、拡張可能エンティティごとにテナントごとに 1 つの IUserType を作成し、データ自体を SQL Server (最も可能性の高い RDBMS) 内の XML 列に格納します。
最後に、テナントごとのエンティティごとに DB テーブルを動的に変更することに関する 1 つの提案を読みましたが、これはかなり聞こえます... 正直、大変です! つまり、機能する可能性はありますが、これを行う機能をテナント (技術に精通していない可能性がある) に与えることは、それほど素晴らしいアイデアではないように思えます。管理者の従業員のみに制限できると思います...