我正在建立具有投票能力的应用程序(+ 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只能投票一次:
CREATE TABLE IF NOT EXISTS `tbl_votes_ips` (
`vote` int(11) NOT NULL,
`ip` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
目的是在插入新值时减少SQL调用。目的是在高负荷的网站上使用。这些功能的最佳实践是什么?
请分享您的经验。
P.S。我想为vote-ip对创建唯一键,所以我不选择而只是处理mysql“not unique value”错误:
ALTER TABLE `tbl_votes_ips` ADD UNIQUE (
`vote` ,
`ip`
);
但是当用户改变它的选择时,这种情况不适用。所以无论如何我需要额外打电话来搜索IP和投票。
答案 0 :(得分:2)
备选方案A
要求用户注册并登录。
备选方案B
替代C
使用Evercookie。如果你走这条路,在你的隐私政策中要非常清楚你正在这样做。公司已经被起诉(一些成功,一些不成功,但无论哪种方式花费他们的时间和金钱)通过使用但不披露使用这些技术。
<强>限制强>
请记住,任何这些技巧都不是 某人难以解决的问题。多个用户注册只是一个免费的电子邮件帐户。如果您回收有线电视盒,许多家庭互联网连接会获得新IP。智能手机通过沿着街道行驶一英里左右获得新IP。如果用户的系统上有多个浏览器,即使Panopticlick也会失败。
答案 1 :(得分: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支持的程度。
答案 2 :(得分:0)
每位用户投票怎么样?为用户提供使用电子邮件注册的功能,并确保将确认电子邮件发送到他们的电子邮件中,以便他们进行验证。然后,您获得了唯一的标识符,不允许同一个用户多次投票,无论他们从哪里登录。
如果您希望不允许一组用户投票某个部分,那么您需要创建一个用户类并与users表相关联,以便John和Smith拥有相同的用户类并且只允许投票一次。 / p>