データベース設計の問題について考えています。どんな助けも大歓迎です。
20個のテーブルを持つアプリケーションを設計しています(新機能の開発中に最大で約30個まで増加する可能性があります)
技術スタック
MVC4、.NET 4.X、Entity Framework 5、SQL Server 2012、ASP.NETメンバーシップフレームワーク
ユーザー数
私たちは、平均20人のユーザーを持つ約1000人のクライアントに対応する予定です。
質問
テーブルが論理的にパーティション分割されるようにデータベースとアプリケーションを設計する必要があります。つまり、すべてのクライアントがパーティションGUIDを持つ同じテーブルを使用してデータを分離します。
OR
新機能の起動とバグ修正中に困難であることが判明する可能性のある複数のデータベースを探します。しかし、潜在的にスケーリングが可能ですか?
警告:テーブルの1つには、ファイルを保存するバイナリ列があります(レコードごとに最大5MB)
これに加えて、メンバーシップフレームワークテーブルを考慮する必要があります。このテーブルは、別のカスタムテーブルに拡張し、ユーザーをパーティションGUIDに論理的にマッピングします。
別々のデータベースを使用したいと思うでしょう:
AND CustomerID = @CustomerID
を含まないクエリが1つだけ抜けたとき。ヒント:スクリプト化された権限ツールまたはスキーマを使用するか、WHERE CustomerID = SomeUserReturningFunction()
を含むビューですべてのテーブルをラップするか、これらの組み合わせを使用します。WHERE CustomerID = @CustomerID
はそれをカットしないため、Customer
の上に抽象化レイヤーが必要です。別々のデータベースを使用して良かったと思います:
単一のデータベースを使用したいと思うでしょう:
理由をもっと挙げたからといって、それが良いというわけではありません。
一部の読者は、 MSDN:Multi-Tenant Data Architecture から値を取得できます。または、おそらく SaaS Tenancy App Design Patterns 。または クラウド向けマルチテナントアプリケーションの開発、第3版
アーキテクチャを「マルチテナント」と呼ぶ場合、Microsoftには here を読む価値のある優れた記事があります。 "isolated" (multiple db)
と"shared" (single db)
の比較を示しています。一般的に、テナント(クライアント)の数が大きい場合は共有が優先されますが、各テナントのサイズが大きい場合は、分離アプローチが推奨されます。
ただし、これらの考慮事項は経験豊富な開発者のみが計算できます。
それでもisolated (multiple db)
アーキテクチャを使用できたとしても、まだ 同じインスタンスで実行されている場合はパフォーマンスに直接メリットはありません です。また、shared (single db)
アーキテクチャを使用する場合は、int
の代わりにguid
を使用することを検討してください。使用する必要がある場合は、sequential guid
を使用してください。