Reddit 风格的投票系统,如何避免重复投票?

Reddit-style voting system, how do I avoid duplicate votes?

我有一个存储 post 的 table。每个 post 都有一个 id、title、content 和 score。目前,你可以喜欢一个post,如果你不喜欢它,它的分数会增加和减少。

现在我不明白的是:如何避免用户多次投票?他们当然可以刷新并再次投票。我看过一些存储cookies等的文章,但是你不能禁用cookies或者清除它们然后重新投票吗?

我在想你必须存储投票的人,或者更确切地说,存储投票的人的 ID。但是,我似乎无法想象我将如何去做?我会将选民的 ID 存储在他们正在投票的 post 中,还是其他地方?

您将需要一个额外的 table posts_vote 之类的东西。将字段 user_id 和 post_id 放入其中。如果用户投票 post,则您将两个 ID 都插入此 table。如果用户投反对票,找到记录并删除它。

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

投票记录(选项 1)

  • voter_id
  • post_id
  • 操作 (upvote/downvote)
  • created_at

投票历史(选项 2)

  • voter_id
  • post_id
  • 分(这个字段可以得到负数表示反对)
  • created_at

因此,当您拥有该特定记录时,您可以检查用户之前是否投票给 post 并决定 increment/decrement 实际 post table 中的分数].

以后投票历史table会增长,会给你带来性能问题,你可以用redis/memcached/etc同步历史记录。并使用这些存储技术更快地进行检查。

另外,使用 cookie 可以帮助您在根本不访问服务器的情况下禁用投票,并且会减少对您的网络服务器的请求数量。 您可以将投票的 post id 存储在 cookie 中并使用 javascript 检查它们,如果用户已经投票给 post,则不要执行请求。

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

  1. Cookie 和 javascript
  2. 服务器端持久化数据

如果第一个失败(用户可以通过更改浏览器或清除 cookie 来绕过它),它会回退到第二个并且您不允许在服务器端进行投票。

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

视觉上: