1

こんにちは、私のウェブサイトには投票システムがありますが、ユーザーからの複数投票を無効にしたいと考えています。ユーザーが投票すると、再度投票することはできません。これが私が持っている解決策の1つですが、良くありません。

users テーブルに列を作成しました。users_avotedここに、彼/彼女が投票した記事の ID を保存します。

1|2|5|6 

これから、ユーザーがすでに投票したかどうかを確認できます。しかし、問題は記事がたくさんあるのでVARCHAR(255)、それらの ID をすべて保存するには十分ではありません。他の解決策はありますか?

ありがとう

4

3 に答える 3

5

そのように非正規化しないでください。UserID と ArticleID の複合キーを持つ 2 列のテーブル userVotes を作成します。

サンプルデータ:

  userid  | articleid
   1          1
   1          2
   1          67
   2          1

これは次のようなものよりも優れています

  userID    | articleID
    1         1,2,67

それはあなたが提案しているように見えます。クエリのたびに体操をしたくない場合を除き、これを行わずに正規化しておいてください。詳しく説明すると、特定のクエリを「チート」するために、提案したことを実装すると、RDBMS を使用する目的が無効になります。

于 2013-02-26T17:39:07.223 に答える
0

たとえば、id、username、voteid、voteのようにレイアウトされたテーブルに投票を保存します。

次に、ユーザーが投票したら、そのテーブルで一致する行を確認します。

例えば:

if ($username == $dbusername && $voteid == $dbvoteid){
     $disallowed = true;
}
于 2013-02-26T17:40:45.817 に答える
0

代わりに、次のようなテーブルを作成できます。

users_avoted {
    article_id,
    user_id,
    answer_id
}

article_id と user_id から一意のインデックスを作成します。そのために入力できるレコードは 1 つだけです。

たとえば、ユーザーが記事 2 でオプション 5 を選択し、ユーザー 1 であるとします。

ここで、テーブルに挿入しようとすると:

INSERT INTO users_avoted VALUES (2, 1, 5)

ユーザーが既に投票しているため、できません。


このアプローチの利点は、最初に投票したかどうかを確認する必要がないことです。

于 2013-02-26T17:39:28.273 に答える