唯一の問題は、これらの関係を強制するための本当に便利な方法がないことです。トリガーのボートロードを使用するか、マスターテーブルを各インスタンスデータベースに格納し、ビューを使用して、それらすべてをメタデータとしてマスターに公開することができます。
最大のマイナス面は、データを正確に同期化することと関係があると私は思います。少なくとも3つのシナリオが頭上にあります(これらはすべて、トリガーを使用しても問題になる可能性があります)。
- 不適切に調整されたクロスデータベーストランザクション -たとえば、あるトランザクションが新しい行をマスターに追加し、IDを別のトランザクションに引き渡した後、最初のトランザクションがロールバックします。
- 単一のデータベース障害からの回復 -データベースがクラッシュした場合、他のデータベースでの他の正常なトランザクションが完了する前の時点に復元する必要があります。これは、インスタンスデータベースを以前の時間に戻す必要がある場合、マスターが予期する行が欠落していることを意味します。マスターが元に戻す必要がある場合は、すべてのインスタンスデータベースにマスターに存在しない値が含まれる可能性があります。
- 一般的にバックアップの一貫性 -災害復旧が必要な場合、すべての完全バックアップとログバックアップをトランザクションのある時点まで一貫性を保つのに苦労します。ファイルシステムのスナップショットはこれには役立ちません。また、可用性グループでさえ、単一の可用性グループ内のデータベースのデータベース間のトランザクションの一貫性は保証されません。災害が発生し、データベースを新しいシステムに復元する必要がある場合、トランザクションの一貫性を確保する方法はありません。
そうは言っても、私はこれまでも、そしてこれからも、テナントを独自のデータベースに分離するファンであり、中央データベースに関連するリスクがあることを認めていますが、それは必要です。
(余談ですが、マスター/インスタンス以外のデータベースの名前を使用する必要master
があります。SQLServerでは間違いなく明確な意味があり、上記の自分の単語を読んでも曖昧になる可能性があります。前と同じですinstance
。以前の人生ではマルチを実行しました-テナントシステムと呼ばれ、中央データベースControl
とテナントデータベースを呼び出しましたTenants
。