2017-02-28 7 views
3

私はESの旅を開始し、伝統的なサポートテーブルをイベントログに保存する必要があるかどうか、これらの表には典型的にCRUDページがあります。言い換えれば、同じアプリケーションで2つのアプローチ、つまりサポートテーブル用とトランザクションデータ用の2つのアプローチを持つのは一般的でしょうか。イベントソーシングでのCRUDの "テーブル"への対応

サポートテーブルは、会計アプリケーションの「アカウント」、ERPアプリケーションの「製品タイプ」または実際の「製品」テーブル(ERPアプリケーションを作成していない - これはタイプの例です)のようになります。テーブルについて話している)。

私たちがイベントログにCRUDタイプのデータを保存する場合は、我々が持っているかもしれないイベントは:

  • が(削除としてマークだけでしょう)
  • ProductDeletedをProductUpdated ProductCreated

次に、(ProductUpdatedイベントで)何が変更されたのかを調べ、変更を保存して再生して、製品の最新のイメージを取得しようとしますか?

ほとんどの場合、私はCRUDテーブル(伝統的なものか、イベントログに保存するもの)にどのようなアプローチをとっていますか?追加情報は素晴らしいでしょう!

+1

「サポートテーブル」とはどういう意味ですか? –

+0

さて、もう一度お試しください。 Stackoverflowアプリケーションを検討してください。彼らはタグを持っています。これらのタグはどこかのテーブルに格納され、アプリケーションを「サポート」し、正規のリレーショナル・タイプの方法でテーブル・データを提供します(従来のアプローチに従う場合)。すべての質問にタグとその説明を格納するのではなく、Stackoverflowはタグテーブルを持っている可能性があり、質問はタグに単にIDを格納するだけです。それがなくても問題は存在する可能性がありますが、それをサポートしており、タグ属性(タグの説明など)によってさらに定義される追加の属性を提供します。 –

+0

私は今あなたの質問を理解すると思います。 –

答えて

1

ProductCreatedなどのイベントやその他のデータストアなど、イベントログを使用して純粋に開始するとします。アプリケーションが起動するたびに、すべてのイベントをログに記録して現在の状態を構築する必要があります。今

、アプリ(たとえばproductsテーブル)の現在の状態を保存するために、伝統的なSQLテーブルを作成するとしその状態(たとえばlast_event表)に到達するために処理された最後のイベントのID 。アプリが起動するたびに、のIDがIDよりも高いイベントを再生し、新しい状態を構築するイベントを処理する必要があります。

あなたのアプリは、これらの2つの状態を同期させた状態で維持するように注意する必要があります。並行処理が必要な場合は、SQLテーブルでのみアトミック操作を実行するように注意する必要がありますが、それはトランザクションではかなり簡単です。

+0

お寄せいただきありがとうございます。あなたのコメントでは、アプリケーションはすべてのイベントを再生する必要がありますが、私はちょっと困惑しています。例えば、ユーザーが製品を見ることを要求した場合、アプリケーションは最終状態を得るために再生しなければならないが、それは製品が必要なときだけである。同期を保つことに関しては、読んだり簡単に照会されたビューを維持するのが一般的なパターンだと私は信じています。ある種の信頼性の高いメッセージブローカーでは、これは問題ではありませんか? –

+0

@OutfastSource私は、あなたのアプリケーションがシャットダウンして再起動するとどうなるかについて話しています。最新の状態をどこかに保持しない限り、イベントログ全体を再生して再度構築する必要があります。しかし、それがその状態を持続した場合、持続状態がイベントログと一貫していることを保証する必要があります。 – Yawar

1

サポートテーブルは、イベントストリームの読み取りモデル/投影です。一般的に、必要な場合に備えてサポートモデルを作成することはありません。 read-modelは、UIのどこかで使用する場合にのみ作成します。

とにかく、Event sourcingの背後にある重要な利点の1つは、クエリにjoinを使用する必要がないということです。つまり、必要なすべてのデータ(完全な非正規化)を含むread-modelごとにtableを作成します。あなたはそのテーブルをクエリに対して超最適化した状態に保ちます。

+0

私が見てきたことは、あなたも含めて、これらのサポートテーブルを第二種市民として扱っているようだということです。あなたが言うように、なぜ彼らはイベントストリームの一部ではありませんか?会計システムのアカウントのような重要なビジネスデータとみなされます。それらは、トランザクションデータのコンテキストに不可欠です。私は、読み取り専用/投影テーブルを作成することを期待しています。これはイベントログの単なる表現であり、イベントログには重要なデータ(アカウントのような)がすべて格納されます。 –

+0

Read-modelsには重要なデータが含まれています。彼らは重要です。しかし、それらは書き込みモデルとは異なります。彼らはさまざまな目的を持っています。彼らは異なって最適化することができます。彼らは異なった扱いを受けるべきです。 –

+0

販売注文(例:書き込みモデルとサポートデータ読み取りモデル)のようなトランザクションデータを呼び出していますか? –

関連する問題