2015-04-23 172 views
0

我有一张存储帖子的表格。每篇文章都有一个ID,标题,内容和分数。目前,如果你不喜欢它,你可以喜欢一个帖子,它的分数会递增和递减。Reddit式投票系统,我如何避免重复投票?

现在我不明白的事情:我如何避免用户不止一次投票?他们当然可以刷新并再次投票。我读过一些存储cookies等的文章,但不能只是禁用cookie或清除它们并再次投票?

我在想你将不得不存储已投票的人,或者更确切地说,投票人的ID。然而,我似乎无法想象我将如何去做这件事?我会将投票人的ID存储在他们投票的帖子中,还是其他?

+0

检查在数据库中,如果用户已经投票决定该职位。 – Daan

+0

那么这就是我的计划,但如果用户已经投票发帖(这是问题),我将如何存储 –

+0

确定的用户 - 即使是通过电子邮件地址验证的用户 - 如果他们愿意,可以多次投票。你可能需要短信验证,这很难(但并非不可能)解决,但是你可能会吓跑那些不信任你电话号码的真实用户。 – halfer

回答

0

您将需要一个额外的表posts_vote什么的。将字段user_id和post_id放入其中。如果用户投票发布,则在此表格中插入两个ID。如果用户投票,找到记录并将其删除。

+0

取消downvote会要求删除记录,但另一个(真正的downvote)可能需要一个记录。 – halfer

+0

这使得更多的意义,我会给它一个镜头。谢谢! –

+0

@halfer是的,我只是检查用户是否投了票,删除投票记录,如果他们这样做? –

0

您可以将投票记录存储在单独的表中。

投票历史(备选1)

  • voter_id
  • POST_ID
  • 动作(给予好评/ downvote)
  • created_at

投票历史(备选2)

  • voter_id
  • POST_ID
  • 分(本场可以得到downvote负数)
  • created_at

所以,当你有一个特定的记录,你可以检查用户是否已经投票的职位之前并决定增加/减少实际发布表中的点数。

未来的投票历史记录表会增长并且会导致性能问题,您可以使用redis/memcached/etc同步历史记录。并使用这些存储技术更快地进行检查。

此外,使用cookie可以帮助您在不打开服务器的情况下禁用投票,并且可以减少向您的Web服务器发送的请求数量。 您可以将投票的帖子ID存储在cookie中,并使用javascript对其进行检查,如果用户已投票发帖,则不要执行该请求。

所以你可以有两层来检查用户是否投了票。

  1. Cookie和JavaScript
  2. 服务器端持续的数据

如果一个失败数(用户可以通过浏览器改变或清洁饼干绕过这个),它fallsback到第二,而你没有允许在服务器端进行投票。

0

举一个例子: 假设你有表postsvotes。然后你可以有一个posts_votes作为查找表。

视觉: enter image description here