4

SEの投票システムを複製しようとしています。私のWebサイトのユーザーは、投稿に1回だけ投票できるはずです。その後、それらはロックインされます。現在、2つのテーブルがusersありpostsます。

ユーザーが投票した投稿に関する情報をどのように保存する必要がありますか?投票したユーザーpostsのsを格納する列を作成することを考えていました。uid別のアイデアには、彼/彼女が投票した投稿のsをusers含む列があります。id

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

4

2 に答える 2

4

スタックオーバーフローのサイズのベストプラクティスは、個々の投票を別のテーブルに保存することです。ただし、投稿に直接添付されたフィールドに得られた投票数も保持します。データベースのサイズが大きくなると、投稿を表示するたびにすべての投票を合計するのに非常に費用がかかります。

この派生フィールドを維持することは、このユーザー/投票テーブルのトリガーを使用することで比較的簡単です。

于 2011-12-23T02:57:37.557 に答える
4

usersおよびpostsテーブルからの情報を格納するための別のテーブルを作成します。

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

このアプローチでは:

投票したユーザーのuidを保存する列を投稿に含めることを考えていました。別のアイデアでは、ユーザーが投票した投稿の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
于 2011-12-23T03:04:34.983 に答える