在网站上实施upvotes / downvotes的最佳方式?

时间:2011-10-21 14:04:53

标签: mysql

好吧,所以我打算建立一个具有upvote / downvote功能的网站。在没有深入了解网站其他部分的细节的情况下,用户将能够提交可以投票的内容(在这种意义上类似于reddit - 仅在此意义上)。本网站上唯一的“帐户”将是管理员和版主,这让我想到了主要问题:

如何在没有帐户的情况下,尽可能将每个帖子的每个用户的投票限制为一个?

该网站也将使用Django和MySQL制作,这引出了我的第二个问题:

如何在MySQL数据库中存储投票?我应该在每个帖子的字段中存储整数,还是应该是每行一票的表格?我的猜测绝对是前者,但我以前从未使用过类似的东西,所以我只是想确定一下。

有人能指出我如何实现我想要的功能的大方向吗?我一直在考虑它,我想到了使用会话变量,cookie和/或IP地址的方法。我知道如果没有账户,没有任何解决方案是完美的,但我只想要一些能够阻止人们发送垃圾邮件的东西。我很无能,所以所有的帮助都表示赞赏。

5 个答案:

答案 0 :(得分:8)

很难。

其他大多数网站使用账户进行upvote / downvote-ing使用账户的原因是因为几乎没有其他方法可以保证用户无法在同一件事情上投票两次。

您可以“缩小”此用户之前投票范围的信息是:

  • 他们的IP地址
  • 他们的UA字符串(可用于在第一个之后进一步缩小字段)
  • 您存储在浏览器中的所有Cookie /会话数据

您可以清楚地看到,所有这些信息都可能发生变化,大部分信息都可以由恶意用户随意控制。如果您想保护自己免受恶意用户的侵害,最好的方法是用户帐户。

如果您只想保护自己免受合法用户投票两次,只需使用IP地址 - 他们持久足够,普通用户将无法在短时间内投票两次

对不起,我不能得到更多的帮助,据我所知,这仍然是那些未解决的问题之一。由于数百种不同的原因,很多人希望能够保证访问者与他们以前的访问者相同或不同,但是使用当前的技术是不可能的。

答案 1 :(得分:3)

我强烈建议您使用用户帐户来尽量减少问题。使用IPAddress不是一件容易的事。举个简单的例子,一些公司只向外界提供一个IP地址。在这种情况下,您的社区将无法正确分发,人们可以质疑您的投票系统。但是,如果您决定使用用户帐户系统,则可以执行以下操作:

post_table
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| postId     | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| userId     | int(10) unsigned | NO   | MUL | NULL    |                | 
| postTime   | bigint(20)       | NO   |     | NULL    |                | 
| post       | text             | NO   |     | NULL    |                | 
| upVote     | int(11)          | YES  |     | 0       |                | 
| downVote   | int(11)          | YES  |     | 0       |                | 
+------------+------------------+------+-----+---------+----------------+

user_of_website
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| userId       | int(10) unsigned | NO   | PRI | NULL    | auto_increment | 
| userName     | varchar(50)      | NO   |     | NULL    |                | 
| numPosts     | int(10) unsigned | NO   |     | 0       |                | 
| postsCount   | int(11)          | NO   |     | 0       |                | 
+--------------+------------------+------+-----+---------+----------------+

此外,您可以使用不同的模型,其中只有一个投票栏,而负数则从正数中扣除。

希望这会有所帮助。

答案 2 :(得分:0)

存储一张投票表:

id | post_id | vote_value (+/-1) | ip

发帖时检查一下,检查此ip之前没有发布此问题。不完美,但还不错。

在给定vote_value的{​​{1}}列上汇总此表,以查找帖子的投票。

答案 3 :(得分:0)

简单地说,限制用户多次投票的最佳方法是通过IP跟踪(假设您不想强制用户登录并拥有帐户 .Cookie可以可以轻松清除,或者用户只需更改浏览器即可。

查看使用PHP跟踪IP并将其存储在数据库中。 http://php.net/manual/en/function.getenv.php

答案 4 :(得分:0)

老问题,但我会开枪。

最终,任何尝试针对恶意用户的任何级别的投票合法性的系统都必须利用CAPTCHA(或某些防止机器人等效),但实际的帐户创建不是必需的。一旦用户通过CAPTCHA验证他的人性,就在他的计算机上存储一个cookie,用于编码他的IP地址数据。只要用户维护该cookie,他就可以将其作为密钥进行投票,并且您可以使用密钥(IP地址)作为标识符。如果以某种方式删除cookie,您只需通过CAPTCHA重新验证他并重新获取其IP地址。

当然,恶意用户可以轻易欺骗IP,但是CAPTCHA会阻止他一次做多次,所以它只会像基于帐户的网络上的恶意用户那样具有破坏性。假帐户。