2012-02-28 8 views
0

ORM Frameworksには一般的かもしれないと思うので、この質問を言語とフレームワークには無関係に投稿しています。ORM:エンティティ上の遅延コレクションをフィルタリングするためのパターン

ユースケース

システムモデル - ビュー - コントローラのWebアプリケーションの実行中である:

私は、次のユースケースのためのデザインパターンがある場合、誰が私を伝えることができればと思いましてORMフレームワークを使用します。

遊びにはPollVoteの2つのエンティティがあります。

一つPollVoteone-to-many関係を持っており、投票はレイジーはをロードされたコレクションです。

システム内の各ユーザーは、一度のみ投票に投票できます。 Viewは、現在のユーザーのみが、まだそれゆえPollを投票しなかったにポーリングするためのコントロールを示すことによって適応するために、それはいいだろうなユーザーエクスペリエンスの便宜上

は(擬似コードで)メソッドを持っています

public boolean hasVoteFor(user) { 
    for each vote 
     if vote.user == user 
      return true 

    return false 
} 

ViewControllerによってPollに渡されると、if poll.hasVoteFor(user)を実行することによって正しいコントロールをレンダリングすることができます。

問題

上記の方法の問題点は、コレクションが遅延ロードされますので、それは非常にメモリ&デシベル集中的になる可能性の上に、反復処理、ということです。

SQL/DQL/SQLを使用すると、明らかにデータベースを使用してユーザーが投票したPollエンティティを直接照会することができますが、そのようなクエリは、Viewがアクセスできないに。

解決方法?

これを解決するためのデザインパターンがあるかどうかは疑問です。

  • ControllerhasVoteFor(poll, user)などの方法がありますでしょうか?これは、ビューが複数のポーリングをレンダリングする場合に問題になります。 (各ポーリングのための多くの基準を持つクエリが速く、むしろそれが与えられていることをView繰り返し処理Poll sと、多くの選択を行うよりもなります。)

  • Controllerは、ユーザーが持っているすべてのPoll Sを照会するためのリポジトリを使用すべき正面に投票し、Poll(またはPollの配列)とともにViewに渡します。この種のものは、PollhasVoteForメソッドを持っています。あなたのオブジェクトだけを考えさせてくれるORMではありませんか? ;)

  • 実際に私が見落としているような他の解決策がありますか?

答えて

1

ORMはデータベースに役立つ単なるツールです。しかし、データベースは、依然として、表示したいデータを効率的に照会するための最良のツールです。また、ORMを使用して、データベースと生成されたクエリを理解し、気にせずに使用することは、災害のためのレシピです。

2つ目の解決策は最初の解決策より優れていますが、論理的で効率的ではありません。

表示するポーリングまたはポーリングを照会し、ユーザーが投票したポーリングを照会してこれらの2つのコレクションをビューに渡す代わりに、コントローラーはPollWithVoteFlagインスタンスのリストを返す照会を実行できます各投票データを含み、投票が投票されたかどうかを示すフラグとともに、ユーザによって投票される。

+0

ORMがどのように機能すべきかに関しては、私にはうれしいですね。私は何かを使っているのではなく、自分のオブジェクトを気にするだけで、パフォーマンスの影響を知ることができました。クエリ言語。フラグが設定されたヘルパーオブジェクトを使用すると、適切な音が鳴り、まとめて保存され、何が起きているのかを把握するために2つのデータコレクションを比較する必要がなくなります。 – Kasheen

関連する問題