コメント投票データベース構造のベストプラクティス
質問
コメント可能なオブジェクトがいくつかあるPHPアプリを開発しています。各コメントに投票することができ、ユーザーは+1または-1(DiggやRedditなど)を与えることができます。現在、user_idと投票情報を保持する「votes」テーブルを作成することを計画していますが、これはうまくいくようです。
問題は、各オブジェクトには数百のコメントがあり、それらが個別のコメントテーブルに保存されていることです。コメントを読み込んだ後、投票を集計し、ユーザーに対して各投票を個別にチェックして、ユーザーが一度だけ投票できることを確認する必要があります。これは機能しますが、本当にデータベース集中型のようです-コメントだけのクエリがたくさん。
これを行うより簡単な方法で、DBにそれほど負荷がかかりませんか?現在のデータベース構造が最善の方法ですか?
現在のデータベース構造を明確にする:
コメントテーブル:
- user_id
- object_id
- total_votes
投票表:
- comment_id
- user_id
- 投票
目標の終了:
- MySQLクエリの数が最も少ない各コメントに対してユーザーが1回だけ投票できるようにします(各オブジェクトに複数のコメントがあります)
解決
各投票者が1回だけ投票するようにするには、これらのフィールド— CommentID、UserID、VoteValueを使用して投票表を設計します。 CommentIDとUserIDを主キーにします。これにより、1人のユーザーが1つの投票のみを取得できるようになります。次に、コメントの投票を照会するには、次のようにします。
SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?
それは役立ちますか?
他のヒント
コメントごとに合計投票数を保存しませんか?新しい投票が行われたときに、これをインクリメント/デクリメントします。
次に、ユーザーがこのコメントに対して特別に投票したかどうかを確認して、ユーザーごとにコメントごとに1つの投票のみを許可する必要があります。
行を取得しない場合、ユーザーが投票していない場合、このオブジェクトに対して現在のユーザーが行ったコメントに対するすべての投票を返すSQL結合条件を設定できます。これは、プログラムで各コメントを1つずつ確認する場合とは少し異なります。
データベース構造に関する限り、これらを別々に保つことは完全に論理的です。 vote {user_id、object_id、object_type、vote_info ...)
すでにこれを行っている可能性がありますが、申し訳ありませんが、そうであれば投稿から解釈できませんでした。