【问题标题】:Voting system - How to store all votes in MySQL and how to properly tally the results投票系统 - 如何在 MySQL 中存储所有投票以及如何正确计算结果
【发布时间】:2009-06-12 23:05:27
【问题描述】:

我正在开发一个系统,允许用户使用 Yes / No / Maybe 问题集对不同的主题进行投票。

每个问题的权重为 2(是)/ 0(否)/ 1(可能)注意(用户将多次投票,金额可能很大)

我的计划是将答案存储在 mysql 数据库中。

  1. 我是否单独存储每张选票? (身份证/投票/)

  2. 统计投票结果的正确查询是什么?

  3. 存储和检索结果的最有效方法是什么?我应该有一个存储投票分数的表吗?

【问题讨论】:

  • 我认为这是stackoverflow.com/questions/809916/… 和其他问题的重复。
  • 要获得更准确的答案,您需要提供更多详细信息。每个用户只能投票一次吗?您是否需要知道每个问题有多少是、否和可能的答案(例如在民意调查中)?
  • 用户实际上有可能获得无限投票。每次他们都会对一个独特的实例进行投票。

标签: php mysql


【解决方案1】:

您需要执行 #1 的主要原因是确保没有重复投票(例如,使用此记录存储每次投票的 IP 地址)。

如果您希望获得出色的性能,您可以按照 digg.com(根据讲座)对此类性质的某些事情进行处理。他们将所有投票存储在具有 IP 的 memcached 节点中,以防止在约 24 小时内到期的重复。然后他们有一个守护进程/cron 作业来统计投票并将它们以聚合格式存储在持久化/数据库层。

【讨论】:

  • 这是我想我会遵循的方法。出于性能考虑,我需要能够快速拉票,然后在晚上进行大量统计以提供快速的投票搜索结果。
【解决方案2】:

我不会将加权值存储在数据库中,而是将数据库用作 3 种不同类型投票的计数系统。您可以拥有 1 个包含 3 个字段的表格

字段:Yes、No、Maybe、所有整数。最初从 0 开始字段值。每次投票时,增加相应的字段值。

之后,在您的代码中进行加权数学运算。就像将数字相乘一样简单,例如在“是”字段中说 2 以获得加权结果。

这当然是在投票总数很重要的情况下,并且您不关心单独存储每个选民的偏好。

为了确保唯一性,我会让用户先注册,这样您就可以将用户标记为已经投票给该特定投票,这样他们就不能再次投票。不过,他们总是可以再次注册。不幸的是,很难解决这个问题,因为他们可以简单地使用另一台计算机、代理服务器,或者很多人拥有动态 IP,这只需重新启动调制解调器即可再次投票,即使您确实存储了 IP 以限制这种情况。

【讨论】:

    【解决方案3】:

    需要考虑的一点:单独存储每张选票可以更轻松地限制 IP 投票。

    【讨论】:

      【解决方案4】:

      我认为您只需要存储每个单独的投票以用​​于审计或记录目的。

      我猜你可以在一行中完成所有问题,每个问题。

      所以:

      Voteid Questionid VoteTally

      然后您可以在投票上运行更新。是时加2,可能时加1,否时什么也不做。

      您是否要使用状态栏将结果显示给用户?如果是这样,那么是的,您需要存储信息。

      【讨论】:

      • 将所有类型汇总到一个字段中的问题会导致无法确定有多少“是”票和多少“可能”票。因为在这种特殊情况下,2 个“可能”看起来就像 1 个“是”投票。
      • 我将把它展示给用户。但是这些人每次都可能对不同的项目进行投票。所以我不能只是增加计数。
      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多