複数のネストされたアソシエイトを持つデータベースがあります。基本的に、構造は次のとおりです。
Order -> OrderItem -> OrderItemPlaylist -> OrderPlaylistItem -> Track -> Artist
特定の日付に販売されたすべての注文に基づいてレポートを生成する必要があります。必要な情報を生成するには、言及されたすべての関連付けをトラバースする必要があります。
すべてのテーブルを一緒に結合しようとすると、6 つのテーブルを結合することになることを考えると、多くの冗長データを含む非常に大きなデカルト結合になるため、やり過ぎです。以下のコード:
q.Left.JoinQueryOver<OrderItem>(order => order.OrderItems)
.Left.JoinQueryOver<OrderItemPlaylist>(orderItem => orderItem.Playlist)
.Left.JoinQueryOver<OrderItemPlaylistItem>(orderItemPlaylist => orderItemPlaylist.PlaylistItems)
.Left.JoinQueryOver<Track>(orderItemPlaylistItem => orderItemPlaylistItem.Track)
.Left.JoinQueryOver<Artist>(track => track.Artist)
上記は機能しますが、それぞれにいくつかの注文アイテムがあり、それぞれが複数のトラックで構成されるプレイリストを含む少数の注文でも、結果は数千のレコードに爆発し、追加の注文ごとに指数関数的に増加します。
最善かつ最も効率的なアプローチは何でしょうか? 私は現在、データベースクエリの数を大幅に削減するバッチロードを有効にしようとしましたが、それでも私には良いアプローチとは思えませんが、「簡単な回避策」のようです。
膨大な量のデータがあるため、すべてのデータを 1 回の SQL クエリでロードする必要はありません。アソシエーションごとに 1 つの SQL クエリがあれば完璧だと思います。理想的には、最初にすべての注文を取得し、次にその注文のすべての注文アイテムを取得して関連するコレクションにロードし、次に各注文アイテムのプレイリストをロードする、というようになります。
.RootCriteria
また、 Criteria API にアクセスして使用できるため、特に QueryOver である必要はありません。
どんな助けでも大歓迎です!