我应该如何设计一个民意调查式的投票系统?

How should I design a poll-style voting sytem?

出于一些不重要的原因,我开始考虑创建一个简单的、未经身份验证的投票的最佳方法。民意调查将针对类别列表中的首选类别(例如核仁巧克力饼、冰淇淋和蛋糕中最喜欢的甜点),并且不需要用户登录。作为服务器端编程经验最少的人,我有两个基本思想。这两种想法都让客户向 /some/url/vote 发出 POST 请求,正文类似于 { vote: "brownies" }。区别在于服务器如何处理它。

  1. 在服务器上,为每个类别存储一个理货。每次它收到来自 /some/url/vote 的请求时,就向该类别添加一票。内部可能看起来像:{ "brownieVotes": 1, "iceCreamVotes": 16 }
  2. 在服务器上,为连接到它的每个用户存储投票(可能必须使用 ip 地址或某种类型的唯一令牌来跟踪用户)。每次收到来自 /some/url/vote 的请求时,它都会记录用户的投票。内部可能看起来像(例如使用 ip 地址){ "1.1.1.1": "brownies", "1.1.1.2", "ice cream" }.

第一个想法实现起来很简单,但是用户可以多次投票并且不能更改他们的投票。如果这是为了比甜点更重要的东西,有人可以用投票淹没服务器。

第二个想法比第一个更安全,因为用户不能轻易投票多次,但我想如果将大量投票存储到 .json 文件(或类似文件)中可能会导致文件出现问题read/write 次。

这些想法都不是特别好,那么专业人士如何在尽可能少的情况下处理它?

第二个想法肯定比第一个好。然而,它仍然不理想,因为例如网络管理员通常可以访问数百甚至数千个 IPv4 地址。对于 IPv6,这个问题更加严重,因为私人也经常可以访问许多这样的地址。

因此,您必须额外检查投票来自哪些IP地址范围(可以手动或自动检查),并且如果您从某个IP地址范围注册了过多的投票,则不会计算来自这些地址的选票。

The second idea is safer than the first because users cannot vote multiple times as easily, but I imagine that with a large poll storing many votes into a .json file (or similar) could cause problems with file read/write times.

你是对的,这可能是大量选票的问题。一个天真的实现会简单地搜索整个文件,每次收到新的投票,以确定该用户是否已经投票。这相当于O(n)time complexity,效率很低。如果您只有少量选票,那么这种幼稚的实现可能只会被接受。

更好的实现是使用时间复杂度为 O(log n) 的数据结构进行搜索和插入操作,例如 red-black tree or a B-tree。这样的实现将能够以可接受的搜索和插入时间处理非常大量的选票。

如果您使用的是带有自己的数据库系统的网络服务器(例如 MySQL or PostgreSQL),那么您也可以使用它,因为它们使用如上所述的最佳数据结构。