2009-05-01 29 views
6

コメントを付けることができるいくつかのオブジェクトを持つPHPアプリケーションを開発中です。各コメントに投票することができ、ユーザーは+1または-1(DiggやRedditなど)を与えることができます。今私はuser_idとその投票情報を持っている 'votes'テーブルを持つことを計画していますが、これはうまくいくようです。コメント投票データベース構造のベストプラクティス

実際には、各オブジェクトには数百のコメントがあり、別々のコメントテーブルに格納されています。私はコメントを読み込んだ後、投票を集計し、ユーザーに対して各投票を個別にチェックして、一度だけ投票できるようにしなければならない。これは機能しますが、実際にはデータベース集約的なようです。コメントだけのための多くのクエリです。

これはDB集中度が低い簡単な方法ですか?現在のデータベース構造は最善の方法ですか?

コメントテーブル:

  • のuser_id
  • のobject_id
  • total_votes

投票テーブル:

は、現在のデータベースの構造についてより明確にするために、

  • comment_id
  • のuser_id
  • 投票

最終目標:

  • は、(ユーザーがMySQLのクエリの少なくとも#で一度だけ各コメントに投票する各オブジェクトを許可します複数コメントあり)

答えて

8

各投票者が一度だけ投票するようにするには、これらのフィールドを使用してVotesテーブルを設計します。— CommentID、UserID、VoteValue。 CommentIDとUserIDをプライマリキーにして、1人のユーザーが1つの投票しか得られないようにします。次に、コメントの投票に質問するには、次のような操作を行います。

SELECT SUM(VoteValue) 
FROM Votes 
WHERE CommentID = ? 

これは役に立ちますか?

+0

実際には、おかげです! 2つの主キーを持っていると思っても、私の頭を越えていませんでした。 – mdolon

0

コメントの総数を保存してみませんか?新しい投票が発生したときにこれを増減します。

次に、1人のユーザーにつき1つの票しか投票できないように、このコメントの投票にユーザーが投票したかどうかを確認する必要があります。

+0

トリックは、ユーザーがその特定のコメントに投票したかどうかを確認する第2の部分です。 – mdolon

0

このオブジェクトの現在のユーザーによるコメントにすべての票を返すSQL結合条件を設定できます。行がない場合は、ユーザーは投票しません。それは、あなたがプログラム内でそれぞれのコメントを一つずつ確認することとはわずかに異なります。

データベース構造に関しては、これらのことを別々に保つことは完全に論理的なようです。 vote {user_id、object_id、object_type、vote_info ...)

あなたはすでにこの処理を行っている可能性があります。申し訳ありませんが、そうした場合は投稿できません。

関連する問題