まず、私は DDD の初心者であり、「青本」を読む必要があることを認めます。
「Match」タイプの AggregateRoot を持つシステムを構築しています。各試合は「投票」のコレクションを持つことができ、ユーザーが試合に賛成票または反対票を投じると増加する読み取り専用の「VoteCount」プロパティもあります。
多くのユーザーが同時に試合に投票する可能性があるため、投票は試合に追加/削除する必要があり、VoteCount は書き込みロックを含む 1 つのアトミック操作としてインクリメント/デクリメントする必要があります (ロックは DB によって処理されます)。(他のプロセス/コンポーネントから効率的にクエリを実行するには、データベース内の静的な値として VoteCount が必要です。)
厳密な DDD に準拠している場合、この操作を次のようにコーディングするように思えます。
アプリケーション サービスは、投票要求オブジェクトを受け取ります。サービスは、Match リポジトリから Match オブジェクトを取得します。サービスは、Match オブジェクトに対して何らかのメソッドを呼び出して、Vote をコレクションに追加し、VoteCount を更新します。その後、リポジトリはその Match インスタンスを DB に保持します。ただし、このアプローチは、次の 2 つの主な理由から、私のアプリケーションでは実行できません。
バックエンドで MongoDB を使用していますが、この読み取り/書き込み操作をトランザクションにラップして、Match データとそれに関連する Vote および VoteCount のダーティ リードを防ぐことができません。
非常に非効率です。Vote を追加して VoteCount をインクリメントするためだけに、オブジェクト グラフ全体を引き戻しています。これは、リレーショナル データベースよりもドキュメント データベースの方が効率的ですが、まだ不要な読み取り操作を行っています。
問題 1 と 2 は、単一の Vote オブジェクトをリポジトリに送信し、Mongo に対して 1 つのアトミックな更新ステートメントを実行する場合には問題になりません。
この場合、投票は「集計」と見なされ、独自のリポジトリと集計ステータスに値するでしょうか?