マルチテナントのビジネスアプリケーションを分割する(または分割しない)ための設計上の考慮事項について、ご意見をお寄せください。すべてのデータテーブルは、次のような複合キーを使用します。
CREATE TABLE SomeTable(
TenantId SMALLINT NOT NULL,
ID INT NOT NULL,
SomeData ...,
CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED (TenantID, ID)
)
ほとんどすべての読み取りは、特定のテナントにキー付けされます。書き込みはtenantIDによってランダムに行われますが、3〜5日間配置されたデータはその後は変更されない傾向があります。
パーティションを設定しない場合は、(tenantID、id)または(id、tenantid)の方が適しています。読み取りはすべてテナントIDで行われ、書き込みはテナントIDでランダムであり、メンテナンスプランを実行するのに十分なダウンタイムが毎晩あると想定します。
(tenantID、id)は、各テナントのデータのローカリティを作成するため、より良い順序です。
各tenantIDに個別のパーティションを作成することの長所と短所は何ですか?
メリット:パーティション操作を使用して、単一のテナントを操作できます。たとえば、SWITCH、TRUNCATE、REBUILDなどです。
短所:メンテナンス、および新しいテナントを追加するためのパーティション分割のコスト。
しかし参照してください:
TenantIDが最初のキーである場合、パーティションはページの断片化を減らしますか?
いいえ。各テナントの行は、インデックス内で論理的およびほとんど物理的に隣接しています。基本的に、テナントごとに1つまたはいくつかのフラグメントがあります。したがって、パーティショニングにより断片化が軽減されますが、パーティショニングがなければ問題にはなりません。
パーティションがプライマリファイルにある場合、引数は変更されますか?
いいえ、それは別です。それらを分離する正当な理由がない限り、すべてのパーティションは単一のファイルグループに移動する必要があります。いくつかの特別なテナント用に個別のファイルグループを作成することもできますが、お勧めしません。
パーティションが10または1000ある場合、引数は変更されますか?
いいえ、ただし、パーティションに関するメインテナンスの問題が悪化します。
答えはSQL 2016とSQL Azureのどちらを使用しているかによって異なりますか?
番号。
ただし、後退して、テナントデータを保持する複数のフェデレーションデータベースを計画する必要があります。マルチテナントデータベースの設計を引き続き使用できますが、最終的にはマルチテナントデータベースとシングルテナントデータベースが混在することになります。データベースでテナントを分離することには、多くの重要な利点があります。