8

私は投票サイトに取り組んでいますが、投票をどのように処理すればよいのか疑問に思っています。

たとえば、SO で質問 (または回答) に投票すると、投票が保存され、ページに戻るたびに、上/下ボタンが色付けされているため、この質問に既に投票したことがわかります。

どうやってそれをしますか?つまり、いくつかのアイデアがありますが、データベースに大きな負荷がかからないかどうか疑問に思っています.

ここに私の考えがあります:

  • 投票されたものがキャストされているかどうかをすべての質問に対してチェックするヘルパーを作成します

    これは、クエリの数がページに表示されるアイテムの数 (通常は ~20) に依存することを意味します。

  • アイテムをループして ID を取得し、ページごとに、投票がキャストされたか NULL かを返すクエリを記述します

    ページ上の項目の数は 1 つのクエリだけで問題にならないため問題ないように見えますが、一部の MVC/ドメイン モデルの設計が壊れている可能性があります。

  • ユーザー ログイン (または匿名ユーザーが作成されたゲスト) がすべての投票を取得すると、セッションに保存されます。新しい投票がキャストされた場合は、それをセッションに追加するだけです。

    最初のものを除いてクエリはまったく必要ないため、見栄えが良いですが、これと、投じられた投票の数 (おそらく各ユーザーの束) に応じて、各ユーザーのセッションのサイズが増加し、認証が行われる可能性があります。スロー。

ごきげんよう?他のアイデアはありますか?

4

3 に答える 3

1

例:投票とそれをキャストしたユーザーを保存するテーブルがあると仮定しましょう。

user_votes以下のようなテーブル構造で投票が行われたときに、投票を保持すると仮定しましょう。

id of type int autoincrement
user_id type int, Foreign key representing users table
question_id type of int, Foreign key representing questions table

ユーザーがログインすると、質問のフェッチを行うときに、user_votesテーブル内の user_id との左結合を行います。

何かのようなもの

SELECT q.id, q.question, uv.id 
   FROM questions AS q 
   LEFT JOIN user_votes AS uv ON 
      uv.question_id = q.id AND 
      uv.user_id = <logged_in_user_id> 
   WHERE <Your criteria>

ビューから、ID が存在するかどうかを確認できます。そうである場合はマークが投票され、そうでない場合は投票されません。

質問テーブルとすべてのフィールドを変更する必要がある場合があります。questions質問をテーブルに保存し、ユーザーをテーブルに保存すると仮定していますuser。すべてが主キーを持っていますid

ありがとう

于 2011-08-15T07:39:35.503 に答える
0

これまでに提供された情報に基づいて、私は 2 番目のアプローチを採用します。ページ上のすべてのアイテムの ID を取得し、単一のクエリを実行して、そのアイテム ID のリストに対するすべてのユーザーの投票を取得します。次に、ユーザーのアイテム投票のコレクションをビューに渡します。これにより、ユーザーがそのアイテムに投票したときにアイテムを別の方法でレンダリングできます。

他の2つのアプローチは、私があなたを正しく理解していれば、効率が悪い傾向があるようです. ビュー ヘルパーを使用してアイテムごとに個別のクエリを開始し、ユーザーが投票したかどうかを確認すると、多くの不要なクエリが発生する可能性があります。また、ログイン時にすべてのユーザーの投票履歴をプリロードすると、不必要なオーバーヘッドが追加され、常に必要とされないデータが取得され、セッション中にデータを最新の状態に保つという負担が追加されるようです。

于 2012-05-04T01:58:10.900 に答える