質問

コメント可能なオブジェクトがいくつかある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 ...)

すでにこれを行っている可能性がありますが、申し訳ありませんが、そうであれば投稿から解釈できませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top