ORM Frameworksには一般的かもしれないと思うので、この質問を言語とフレームワークには無関係に投稿しています。ORM:エンティティ上の遅延コレクションをフィルタリングするためのパターン
ユースケース
システムモデル - ビュー - コントローラのWebアプリケーションの実行中である:
私は、次のユースケースのためのデザインパターンがある場合、誰が私を伝えることができればと思いましてORMフレームワークを使用します。
遊びにはPoll
とVote
の2つのエンティティがあります。
一つPoll
Vote
とone-to-many
関係を持っており、投票はレイジーはをロードされたコレクションです。
システム内の各ユーザーは、一度のみ投票に投票できます。 View
は、現在のユーザーのみが、まだそれゆえPoll
を投票しなかったにポーリングするためのコントロールを示すことによって適応するために、それはいいだろうなユーザーエクスペリエンスの便宜上
は(擬似コードで)メソッドを持っています
public boolean hasVoteFor(user) {
for each vote
if vote.user == user
return true
return false
}
View
がController
によってPoll
に渡されると、if poll.hasVoteFor(user)
を実行することによって正しいコントロールをレンダリングすることができます。
問題
上記の方法の問題点は、コレクションが遅延ロードされますので、それは非常にメモリ&デシベル集中的になる可能性の上に、反復処理、ということです。
SQL/DQL/SQLを使用すると、明らかにデータベースを使用してユーザーが投票したPoll
エンティティを直接照会することができますが、そのようなクエリは、View
がアクセスできないに。
解決方法?
これを解決するためのデザインパターンがあるかどうかは疑問です。
は
Controller
はhasVoteFor(poll, user)
などの方法がありますでしょうか?これは、ビューが複数のポーリングをレンダリングする場合に問題になります。 (各ポーリングのための多くの基準を持つクエリが速く、むしろそれが与えられていることをView
繰り返し処理Poll
sと、多くの選択を行うよりもなります。)Controller
は、ユーザーが持っているすべてのPoll
Sを照会するためのリポジトリを使用すべき正面に投票し、Poll
(またはPoll
の配列)とともにView
に渡します。この種のものは、Poll
のhasVoteFor
メソッドを持っています。あなたのオブジェクトだけを考えさせてくれるORMではありませんか? ;)実際に私が見落としているような他の解決策がありますか?
ORMがどのように機能すべきかに関しては、私にはうれしいですね。私は何かを使っているのではなく、自分のオブジェクトを気にするだけで、パフォーマンスの影響を知ることができました。クエリ言語。フラグが設定されたヘルパーオブジェクトを使用すると、適切な音が鳴り、まとめて保存され、何が起きているのかを把握するために2つのデータコレクションを比較する必要がなくなります。 – Kasheen