2011-04-02 170 views
3

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

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

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

回答

4

我可能会与你有上面列出的选项3去。通过在项目表中将总票数作为另一列,您可以获得某个项目的总票数,而无需再进行任何SQL查询。

如果您需要存储哪个用户投票选择哪个项目,我可能会创建另一个表格,其字段为item,uservoteitem将作为itemID,user将是用户ID,vote将包含+-,具体取决于它是正反投票。

我猜你只需要在用户登录时访问这个表格,以显示他们投了哪些项目。

+1

我只能补充一点,你可能使用cookies为哪些项目用户已经投票,这样你就不需要执行缓存每个页面上的数据库查询渲染,其中用户将在屏幕上看到一个项目。如果你使用这种方法,你需要检查用户是否在注册他们的投票前进行了投票,但是(无论如何,这可能是个好主意)。 – Finbarr 2011-04-02 23:05:21

1

我会去的第一个选项的轻微变种:

数据库表中的专用投票,其中有用户ID和他们的票...存储他们的投票作为一个布尔值,然后计算出“总和”MySQL中的选票。

用整数替换布尔值:+1表示加1,-1表示减号。

然后,而不是一遍又一遍地计算总和,保持一个运行总量的地方;每次进行加权投票时,每加入一票就加1,减1。您可以在数据库中使用插入触发器来执行此操作,或者在添加新投票时向数据库发送额外的UPDATE thing SET vote_total = vote_total + this_vote

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

跟踪个人投票可以让人们不用投票两次。保持运行总量使总显示快速简单(大概这将是最常见的操作)。

添加一个简单的健全检查器,你可以运行,以确保总数匹配投票将是一个很好的补充。

序列化阵列:请不要那样做,这样的事情让周围的数据库,由专人检查并修复的东西根本是很困难的,序列化的数据结构也变得非常困难(不可能在某些情况下),以用外键正确地限制你的数据,检查约束条件,唯一约束条件和你有什么。将序列化的数据结构存储在数据库中通常是一个坏主意,除非数据库不需要知道有关数据的任何信息,除了如何将数据返还给您。将数组打包到文本列中是数据库中破损和不一致数据的秘诀:破损的代码易于修复,破损的数据通常是永久的。

1

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

在另一个表店一样的问题/轮询ID的摘要信息,理货

做一个插入到个人票表。

对于你能做到这一点的汇总表:

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