RDBMS (SQL Server など) を使用してイベント ソーシング データを格納する場合、スキーマはどのようになりますか?
いくつかのバリエーションが抽象的な意味で語られているのを見たことがありますが、具体的なものは何もありません.
たとえば、「製品」エンティティがあり、その製品への変更は、価格、コスト、および説明の形式で行われるとします。次のことを行うかどうかについて混乱しています。
- 製品のすべてのフィールドを含む「ProductEvent」テーブルを用意します。各変更は、そのテーブルの新しいレコードを意味し、必要に応じて「誰が、何を、どこで、なぜ、いつ、どのように」(WWWWWWH) を加えます。コスト、価格、または説明が変更されると、製品を表すためにまったく新しい行が追加されます。
- 製品のコスト、価格、および説明を、外部キー関係を使用して製品テーブルに結合された個別のテーブルに格納します。これらのプロパティが変更された場合は、必要に応じて WWWWH を使用して新しい行を書き込みます。
- WWWWWH と、イベントを表すシリアル化されたオブジェクトを "ProductEvent" テーブルに格納します。つまり、特定の製品のアプリケーション状態を再構築するには、アプリケーション コードでイベント自体をロードし、シリアル化解除して再生する必要があります。 .
特に、上記のオプション 2 が心配です。極端に言えば、製品テーブルはプロパティごとにほぼ 1 つのテーブルになり、特定の製品のアプリケーション状態をロードするには、各製品イベント テーブルからその製品のすべてのイベントをロードする必要があります。このテーブルの爆発は、私には悪いにおいがします。
「場合による」と確信しており、単一の「正解」はありませんが、何が受け入れられ、何がまったく受け入れられないかを感じようとしています。また、NoSQL がここで役立つことも認識しています。ここでは、イベントを集約ルートに対して保存できます。つまり、オブジェクトを再構築するためのイベントを取得するためのデータベースへの単一の要求のみを意味しますが、NoSQL データベースを使用していませんその瞬間、私は代替案を探しています。