投票系统问题

时间:2011-04-02 18:25:59

标签: php mysql

我在接近PHP中的+ 1 / -1投票系统时遇到了一些麻烦,它应该模糊地类似于SO投票系统。平均而言,每件物品将获得约100至1,000票,并且会被许多人看到。

我不知道是否应该使用:

  • 一个专门用于投票的数据库表,其中包含用户ID及其投票...将其投票存储为布尔值,然后计算MySQL中投票的“总和”。
  • “item”表中的文本字段,包含已经投票的uid(在序列化数组中),以及包含投票总和的数字字段。
  • “item”表中的一个数字字段,其中包含投票的总和,然后存储用户是否在文本字段中投票(带有投票ID的序列化数组)。
  • 完全不同的东西(请发表更多想法!)

3 个答案:

答案 0 :(得分:4)

我可能会选择上面列出的选项3。通过将总投票数作为项目表中的另一列,您可以获得项目的总投票数,而无需再执行任何SQL查询。

如果您需要存储哪个用户投票选择哪个项目,我可能会创建另一个包含itemuservote字段的表格。 item将是itemID,user将是userID,vote将包含+-,具体取决于是投票还是投票。

我猜你只需要在用户登录时才能访问此表格,向他们展示他们投票的项目。

答案 1 :(得分:1)

我会选择第一个选项的轻微变体:

  

专门用于投票的数据库表,其中包含用户ID及其投票...将其投票存储为布尔值,然后计算MySQL中投票的“总和”。

用整数替换布尔值:+1表示向上投票,-1表示向下投票。

然后,不要一遍又一遍地计算总和,而是在某处保持一个总计;每次进行投票时,在总数中加1,每次投票时减1。您可以使用数据库中的insert-trigger执行此操作,也可以在添加新投票时向数据库发送额外的UPDATE thing SET vote_total = vote_total + this_vote

您可能也希望在投票跟踪表中对事物/用户ID对进行唯一约束。

跟踪个人投票可以让人们轻松投票两次。保持运行总计可以快速轻松地显示总数(并且可能这是最常见的操作)。

添加一个简单的健全检查程序,您可以运行以确保总计与投票相匹配,这也是一个很好的补充。

序列化数组:请不要这样做,这样的事情使得很难手动检查和修复数据库,序列化数据结构也很难(不可能在某些情况下)使用外键正确约束数据,检查约束,唯一约束以及您拥有的内容。将序列化数据结构存储在数据库中通常是一个坏主意,除非数据库不需要知道任何有关数据的信息,除了如何将数据返回给您。将数组打包到文本列中是数据库中数据损坏和不一致的处方:破解的代码很容易修复,破坏的数据通常是永久的。

答案 2 :(得分:1)

我建议将个人投票存放在一个表格中。

在另一个表中存储诸如问题/民意调查ID,统计

之类的摘要信息

请插入个人投票表。

对于摘要表,您可以执行以下操作:

$votedUpOrDown = ($voted = 1) ? 1 : -1;
$query = 'UPDATE summary SET tally = tally + '.$votedUpOrDown.' WHERE pollid = '.$pollId;