集約ルートと、ナビゲーション プロパティを使用して子オブジェクトをトラバースすることについて議論しています。
シナリオ 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以上のクエリが送信される可能性があります.
マイク