0

問題:

5人のクライアントがいるとしましょう。現時点では、各クライアントは独自のデータベースのコピーを持っています。これは、何百万もの行があり、あるクライアントのデータベースの負荷によって別のクライアントのデータベースのパフォーマンスが妨げられることを望まないためです。

次の理由により、これは最適な設計ではありません。

  • クライアントごとに個別の接続を管理するのは柔軟ではありません。
  • 変更を複数のデータベースに伝播する必要がある。
  • 新しいクライアントごとに新しいデータベースを作成する必要があります。

質問:

このすべてのデータを 1 つのデータベースに含めて、複数のデータベースを持つ場合と同様に機能するように、クライアント データ間に何らかの形で物理的な分離を行うことは可能ですか?

この分離は、テーブル (またはスキーマ) レベルではなく、行レベルで行われます。たとえば、Employeeクライアントごとに個別のテーブル ( Employee_ClientAEmployee_ClientB、 などEmployee_ClientC) を作成するのではなく、外部キーEmployeeを持つテーブルを作成します。ClientIDこれは、テーブル内のデータを物理的に分離する必要があることを意味します。

4

2 に答える 2

3

パフォーマンスが主な関心事である場合は、パーティション テーブル機能を使用して、個別のクライアントのデータを個別のファイル グループに配置できます。

各クライアントによる他のクライアントのデータの可視性を制限する場合は、「SQL Server での行レベルのアクセス許可の付与」で概説されているオプションを検討してください。

于 2013-02-08T09:43:18.727 に答える
1

あなたの質問は、マルチテナント データベース アーキテクチャに関するものです。マルチテナント タグを追加しました。変更を加える前に、それをクリックして、他のマルチテナントに関する質問と回答をいくつか読んでおくことをお勧めします。 This SO answerは、トレードオフのほとんどを要約し、Microsoft の記事へのリンクを提供します。

このすべてのデータを 1 つのデータベースに含めて、複数のデータベースを持つ場合と同様に機能するように、クライアント データ間に何らかの形で物理的な分離を行うことは可能ですか?

いいえ、そうではありません。物理的な分離とは、各クライアントが独自のデータベースまたは独自のスキーマを持つ必要があることを意味します。

むしろ、ClientID 外部キーを持つ Employee テーブルです。これは、テーブル内のデータを物理的に分離する必要があることを意味します。

すべてのクライアント間でテーブルを共有し、各クライアントの行を client_id で分離することは、物理的な分離ではありません。それが論理的分離です。特定のクライアントの行を選択するには、WHERE 句で client_id を使用する必要があります。

各テーブルには元のテーブルの 5 倍の行数が含まれ、すべてのクエリで WHERE 句に「client_id」を含める必要があるため、同じハードウェアでは同様のパフォーマンスは得られません。少数のクライアントと少数の行で同様のパフォーマンスが得られる場合がありますが、データベースが大きくなるにつれて、違いがより明確になります。

于 2013-02-09T11:57:18.823 に答える