2011-12-23 12 views
4

私はSEの投票システムを複製しようとしています。私のウェブサイト上のユーザーは投稿に1回しか投票できないので、ロックされています。私は現在、userspostsという2つのテーブルを持っています。(StackOverflowのような)MySQLデータベースに投票データを格納する最も効率的な方法

ユーザーが投票した投稿の情報はどのように保存する必要がありますか?私はそれに投票したuidのユーザーを格納するpostsに列を持つことを考えていました。もう1つのアイデアは、の列に、投票した投稿のidとなります。

どうすればよいですか?スケーラビリティを考慮し、投票が有効かどうかを簡単に判断したい。

答えて

4

userspostsテーブルからの情報を保存するために、別のテーブルを作成します。このアプローチで

CREATE TABLE votes (
     user_id INT 
    , post_id INT 
    , PRIMARY KEY (user_id, post_id) 
); 

私は格納します投稿の列を有していると考えていましたそれに投票したユーザーのuid。もう1つのアイデアは、ユーザーが投票した投稿のIDを列に表示することです。

あなたが区切られた値(1つのセルに収まるように)、またはJSONなどの値を格納していない限り、あなただけの1のポストのために多くの行になってしまいます。しかし、それはまずは​​悪いアプローチです。

「投票」を決定する関係を含む新しいテーブルを作成することに固執する。テーブルは次のようにチェックするだけの簡単なものです:

SELECT COUNT(t1.post_id) AS vote_count 
FROM votes AS t1 
WHERE 
    t1.user_id = SOME_INTEGER 
    AND t1.post_id = SOME_INTEGER 
+0

これは、 'votes'テーブルに各投稿のエントリがいくつかあることを意味していますか? '29、user1'、' 29、user2'、 '28、user1'、' 29、user3'のように?数字はポスト 'id'のもので残りはユーザー名ですか? – n0pe

+0

ええ、それはうまくいくでしょう - これはあなたにとって有利ではありませんか?もしそうなら、なぜ別のアプローチがあるのか​​、私に教えてもらえますか?私はちょうど例を挙げたことを知っているが、主キーを使って作業することを繰り返すことを望んでいる。 'votes'の列としてあなたの' users'と 'posts'テーブルから取得します。 – Nonym

+0

うん、それは完璧に、おかげで動作します。私はちょうど私が完全に理解したことを確認したい:) – n0pe

4

ベストプラクティスは、stackoverflowのサイズのために、個々の投票を別のテーブルに格納することです。しかし、ポストに直接添付されたフィールドに派生投票数を保持することもできます。データベースのサイズが大きくなるにつれて、投稿を閲覧するたびにすべての投票を集計するのは非常に高価になります。

この派生フィールドを保持することは、このuser/votesテーブルでトリガーを使用することによって比較的簡単です。

+0

私は現在、 'post'テーブル内のフィールドに総投票数を格納しています。ヒントを考えてくれてありがとう、それは間違いなくこの質問につまずく他の誰かを助けるでしょう。 – n0pe

関連する問題