0

集約ルートと、ナビゲーション プロパティを使用して子オブジェクトをトラバースすることについて議論しています。

シナリオ 1:

  • Customer は集約ルートです
  • アドレスはエンティティです
  • 連絡先はエンティティです

顧客は複数の住所を持つことができ、住所は複数の連絡先を持つことができます。顧客 ID を使用して以下の顧客リポジトリにクエリを実行し、顧客オブジェクトを返します。

Dim customer as Customer = _customerRepository.GetById(request.Id)

顧客の住所にアクセスする必要がある場合は、以下のように顧客オブジェクト内の住所をトラバースします。

Dim address as Address = customer.RetrieveAddress(request.AddressId)

このアプローチは、x 個の子オブジェクトに対して実行されます。私が示した例は単純なものですが、何百万ものレコードを含む DB テーブルに関して、集約ルート オブジェクトが照会されて返された後、複数の子オブジェクトをトラバースするときに他の人がどのようにパフォーマンスの問題に対処したのでしょうか?

シナリオ 2:

上記の例と同じですが、顧客リポジトリを照会して顧客オブジェクトを返す代わりに、代わりに子オブジェクトを返します。

Dim address as Address = _customerRepository.GetAddressById(request.AddressId)

住所オブジェクトを照会したので、顧客オブジェクトをたどってそこに到達する必要はありません。カスタマー リポジトリを使用してアドレス テーブルを直接クエリし、アドレス オブジェクトを返しましたが、DDD に従っている場合、これは許可されますか? それとも、顧客リポジトリにクエリを実行し、集約ルートである顧客オブジェクトを返し、子オブジェクトをトラバースするシナリオ 1 を使用する必要がありますか?

私が尋ねる理由は、DB ダイアグラムには集計ルートからトラバースするテーブルがいくつかあり、時間の経過とともに何百万ものレコードが含まれる可能性があり、パフォーマンスが低下する可能性があるためです。

他の人がどのようにしてパフォーマンスを低下させることなくDDDを完全に適用したのか疑問に思っています.EFをナビゲーションプロパティで使用するとすぐに、子オブジェクトごとにクエリが送信され、forループにある場合は100以上のクエリが送信される可能性があります.

マイク

4

2 に答える 2

1

集計はトリッキーなビジネスであり、集計の境界を決定するには多くのことを考慮する必要があります。あなたの質問を読んで、DBエンティティの関係ではなく、動作に基づいて集計を設計しているとは確信が持てません。Eben が言うように、後者のアプローチではあまり効果が得られず、集計はおそらく非常に大きくなります (子エンティティの数に関して)。

このトピックに関して私が読んだ中で最も洞察に満ちたものの 1 つは、Vaughn Vernon による「Effective Aggregate Design 」です。私は間違いなくそれを読むことをお勧めします。彼が話している重要なことの 1 つは、集合体をできるだけ小さくしようとすることです。これは当然、パフォーマンスに役立ちます。

エンティティについては、シナリオ 2 で行ったことは行いません。これは、集計ルートを使用しないとエンティティの状態を変更できないためです。これにより、不変条件が維持されます。そうは言っても、あなたの例では、値オブジェクトである可能性が高いアドレスオブジェクトを使用しているため、パフォーマンス上の理由から別のアドレスストアを用意しても問題ありません。

DDD を始めるときは、設計の選択については依然として実用的である必要があることを思い出すことが重要だと思います。DDD がすべての問題を解決してくれるわけではありません。ほとんどの場合、設計の選択はパフォーマンスなどとのトレードオフです。

于 2012-05-15T08:48:10.810 に答える
1

ER図を使用して集計を決定することはできません:)

所有権は、必ずしも集計を推論するとは限りません。あなたは単に関係トラバーサルについて言及しています。集約ルートはトリッキーなビジネスです。これについては、私のサイトhttp://www.ebenroux.co.zaで少しブログを書いています。特にこれを参照してください。

天然と合成の骨材

集約には明確な境界があり、その境界がどこにあるかを判断するには、特定のドメインの知識が必要です。その後は、単に所有権または弱い参照になります。

于 2012-05-14T15:04:36.013 に答える