0

私は投票する機能 (+1/-1) を備えたアプリを開発しており、このためのシンプルで高速な mysql テーブル構造を持たせようとしています。これまでのところ、私の考えは簡単で、次のようなものにすることでした:

tbl_votes特定のオブジェクトの投票値を格納します。

CREATE TABLE IF NOT EXISTS `tbl_votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `vote` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

tbl_votes_ips IP<=>投票履歴を保存して、特定の IP が 1 回だけ投票できるようにします。

CREATE TABLE IF NOT EXISTS `tbl_votes_ips` (
  `vote` int(11) NOT NULL,
  `ip` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

目的は、新しい値を挿入するときの SQL 呼び出しを減らすことです。目的は、負荷の高い Web サイトで使用することです。そのような機能のベストプラクティスは何ですか?

あなたの経験を共有してください。

PS私はvote-ipペアの一意のキーを作成するという考えを持っているので、選択せずにmysqlの「一意の値ではない」エラーを処理するだけです:

ALTER TABLE `tbl_votes_ips` ADD UNIQUE (
`vote` ,
`ip`
);

ただし、ユーザーが選択を変更している場合は機能しません。とにかく、IP を検索して投票するために追加の呼び出しを行う必要があります。

4

3 に答える 3

2

代替案 A

ユーザー登録とログインが必要です。

代替 B

  • ユニークなクッキーを設定します。後で訪問したときに存在する場合は、それを使用してください。
  • ブラウザのユーザー エージェント + IP アドレスを連結し、そのハッシュを作成します。Cookie が存在しない場合は、そのユーザーが投票したかどうかのプロキシとして、今後のアクセスでそのハッシュを使用します。約85%の信頼性があります。
  • 必要に応じて、ユーザー エージェント + IP 以外の要素を含めることもできますが、それはより複雑になります。詳細については、Panopticlickを参照してください。

代替 C

エバークッキーを使用します。その方法をとる場合は、プライバシー ポリシーで、これを行っていることを非常に明確にしてください。企業は、これらの手法を使用しているが、使用を開示していないことで訴えられています (成功したものもあれば失敗したものもありますが、いずれにしても時間と費用がかかります)。

制限事項

これらの手法はいずれも、回避するのがそれほど難しくないことに注意してください。複数のユーザー登録は、無料の電子メール アカウントだけです。ケーブル ボックスをリサイクルすると、多くの家庭用インターネット接続が新しい IP を取得します。スマートフォンは、通りを 1 マイルほど走るだけで新しい IP を取得します。ユーザーがシステムに複数のブラウザーを持っている場合、Panopticlick でさえ失敗します。

于 2013-03-11T17:44:01.750 に答える
0

ユーザーごとに投票するのはどうですか?ユーザーが電子メールを使用して登録できるようにし、確認メールをユーザーの電子メールに送信して確認できるようにします。そして、ログイン場所に関係なく、同じユーザーがアイテムに複数回投票することを禁止するための一意の識別子を取得しました。

ユーザーのセットが特定の部分に投票できないようにする場合は、ユーザー クラスを作成し、ユーザー テーブルに関連付けて、John と Smith が同じユーザー クラスを持ち、1 回だけ投票できるようにする必要があります。

于 2013-03-11T17:33:52.840 に答える
0

一意のキーを使用します。

PRIMARY KEY (vote, ip)

それから簡単な

INSERT INTO tbl_votes_ips (vote, ip) VALUES ($vote, $ip) 
ON DUPLICATE KEY UPDATE SET vote=VALUES(vote)

これは単一のクエリとして実行でき、mysql はそれが挿入か更新かの決定を処理します。

そして、Eric J が上で述べたように、共通のプロキシ/nat ゲートウェイを共有するユーザーのグループに対して、あなたのシステムは顔をしかめることになります。また、IPv6 のユーザーも処理しません。まだ特に普及しているわけではありませんが、IPv6 のサポートはもはや無視できないところまで来ています。

于 2013-03-11T17:25:39.433 に答える