Php 投票制度问题

Php 投票制度问题,php,mysql,Php,Mysql,我在PHP中使用+1/-1投票系统时遇到了一些问题,它应该与SO投票系统有点相似。平均而言,每个项目将获得约100到1000张选票,并将被许多人观看 我不知道我是否应该使用: 一个专门用于投票的数据库表,其中包含用户ID和他们的投票。。。将他们的投票存储为布尔值,然后在MySQL中计算投票的“和” “item”表中的文本字段,包含已投票的UID(在序列化数组中),以及包含投票总数的数字字段 “item”表中的数字字段,包含投票总数,然后在文本字段中存储用户是否投票(使用投票id的序列化数组)

我在PHP中使用+1/-1投票系统时遇到了一些问题,它应该与SO投票系统有点相似。平均而言,每个项目将获得约100到1000张选票,并将被许多人观看

我不知道我是否应该使用:

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

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

      如果您需要存储哪个用户对哪个项目投票,我可能会创建另一个表,其中包含
      项目
      用户
      投票
      字段<代码>项目将是项目ID,
      用户
      将是用户ID,
      投票
      将包含
      +
      -
      ,具体取决于投票是赞成票还是反对票


      我猜您只需要在用户登录时访问此表,向他们显示他们对哪些项目进行了投票。

      我将使用第一个选项的一个轻微变体:

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

      将布尔值替换为整数:+1表示赞成票,-1表示反对票

      然后,不要一遍又一遍地计算总和,而是在某个地方保持一个连续的总和;每次投赞成票时,将总数加一,每次投反对票时减去一。您可以使用数据库中的insert触发器来执行此操作,或者在添加新投票时,您可以向数据库发送额外的
      UPDATE thing SET vote\u total=vote\u total+this\u vote

      您可能还希望在投票跟踪表中的thing/userid对上有一个唯一的约束

      跟踪个人投票可以很容易地防止人们投票两次。保持一个运行的总数可以使显示总数变得快捷和容易(这大概是最常见的操作)

      添加一个简单的健全性检查程序,您可以运行它来确保总数与投票数匹配,这也是一个不错的添加


      序列化数组:请不要这样做,这样做会使手动在数据库中查找根以检查和修复问题变得非常困难,序列化数据结构也会使使用外键、检查约束、唯一约束等正确约束数据变得非常困难(在某些情况下不可能)。在数据库中存储序列化的数据结构通常是个坏主意,除非数据库不需要知道关于数据的任何信息,只需要知道如何将数据返回给您。将数组打包到文本列中会导致数据库中出现不一致的数据:不一致的代码很容易修复,而不一致的数据通常是永久性的。

      我建议将单个投票存储在一个表中

      在另一个表中存储汇总信息,如问题/投票ID、计数

      在个人投票表中插入一项

      对于汇总表,您可以执行以下操作:

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

      我只能补充一点,您可以使用cookies作为用户投票的项目的缓存,这样您就不需要在用户将在屏幕上看到项目的每个页面呈现上执行数据库查询。但是,如果使用这种方法,则需要在注册用户的投票之前检查用户是否已投票(这可能是个好主意)。