0

私はSpringとHibernateを使用して、人、グループ、投稿、添付ファイル、コメントなどのかなり複雑なドメインモデルをmysqlデータベースにマッピングするWebアプリケーションを作成しています。この質問は、コメントのクエリを最適化しようとすることから生じますが、サイトの他の側面にも当てはまります。

問題を単純化するために、コメントは投稿と多対1の関係にあり、投稿はグループと多対1の関係にあります。各グループにはベースURL({/ group_slug})があり、各投稿には、そのURLの後にスラッシュと投稿ID(/ {group_slug} / {post_slug})を付けてアクセスできます。投稿には親への参照があり、一時的な方法でURLを計算します。この方法では、親にURLを要求し、その末尾にスラグを追加します。コメントにURLが必要な場合は、親(投稿)に問い合わせます。親(投稿)は、グループにクエリを実行してURLを作成します。次のパフォーマンスの問題を除いて、問題なく動作します。

ホームページでは、各ユーザーグループからの最近のコメントをすべて1つのリストに表示したいと思います。各コメントの下には、コメントが書かれた投稿へのリンクが必要です。これが比較的迅速なクエリであることが重要ですが、現在のモデルでは、これを効率的に行う方法を理解できません。私の現在のHibernateクエリ(jpql)は次のようになります。各グループについて、ユーザーは次のメンバーです。

select c from Comment c where c.target.group.id = :groupId and c.dateCreated > :date

ただし、ターゲットアイテムの各URLを取得するには(コメントからターゲットへ、次にターゲットからグループへの1つ:多くの関係を熱心にロードするために休止状態になるため)、ターゲットとグループの両方をデータベースからもロードする必要があります。コメントごとに。

このクエリを整理するためのより良い方法、またはドメインモデルを再設計して、毎回それほど多くのデータをロードする必要がないようにする方法はありますか?そうでない場合、データベースを非正規化し、新しいコメントが作成されるたびにコメントの親のURLをデータベースに保存することの短所は何ですか?どのエンティティもURLを頻繁に変更することはありませんが、投稿のスラッグが変更される可能性があります。スラッグの変更に関連するすべてのコメントをループしてURLを更新することで、この状況に対処できますが、それでもベストプラクティスに反しているようです。

4

1 に答える 1

0

SELECT N + 1が発生しないように、クエリにロードすることを熱望することができます

select c from Comment c join fetch c.target t join fetch t.group g where g.id = :groupId and c.dateCreated > :date
于 2012-08-20T04:15:41.623 に答える