在社交新闻网站上处理上/下投票

时间:2011-02-21 21:20:38

标签: php mysql database database-design

我正在尝试从头开始制作类似reddit的Web应用程序。 我不知道如何存储上下投票。

我正在考虑创建一个名为'user_votes'的表 字段'id','user_id','voted_link_id','up_or_down'

因此,每次用户投票时,基本上都会为“谁投票什么”添加一行。

我正在插入新行而不是仅添加1,因为用户个人资料页面必须显示用户投票的链接列表。所以我需要跟踪每一张选票。但我觉得它没有效率。

我不太熟悉严重依赖数据库的Web应用程序。 请指导我。

P.S。 应该将哪些列编入索引?

3 个答案:

答案 0 :(得分:3)

其实你想要两个。

您必须拥有包含Article_ID,User_ID,+ 1或-1的表格。这正是您所说的理由。您需要将用户的投票显示为正在运行的帐户。你也会帮我们确保它的独特性。

你现在必须考虑频率。文章将比投票更频繁地被查看。因此,您必须在Vote表上执行大量SUM,这会导致生成完全相同的值。

相反,你应该在Article表上保留两个计数器:总共upvotes和总共downvotes。原因之二是,由于两个值在同一行上,因此总和是无关紧要的。其次,您可能希望实现一些可以像SO那样公开这些值的东西。 (直到你得到这么多分数(约1500)才能看到它。)

您可能希望显示文章列表以及每个文章的总分数...您不希望在投票表中查找很长的文章列表。您也可能希望允许人们对文章设置限制,“只显示超过+10”。同样,每当有人打开他们的主页时,你都不想总结投票表。

答案 1 :(得分:1)

首先,你很喜欢挑战!

其次,我建议不要优化应用程序,直到你可以证明你需要,尤其是。在数据库设计中。这是一个很好的平衡,但从广义上讲,我首先要采用“纯粹的”关系设计,并且只在你真正需要的时候引入重复的数据。

所以,我首先记录每次投票,然后计算总得分。这样,您不需要处理当“计算得分”与投票不同步时发生的情况(例如,因为申请在写投票和更新总票数之间失败)。

一旦您使用该设计,就可以找到一种测试性能的方法,包括大量数据和大量访问者。 DBMonster和Apache JMeter可能是这里使用的工具。

当您遇到性能问题时,首先尝试通过查询优化和索引来解决它们 - 使用Stack Exchange来充分利用它!另请参阅应用程序级缓存。

当你真的,真的无法从应用程序中挤出任何更多的性能时,我会开始按照Stephanie建议的方式预先计算得分。

答案 2 :(得分:-1)

如果您希望能够跟踪所有选票的去向并确保没有人可以在同一篇文章上多次投票,这可能是最好的设计。正确索引,即使有几百万行的表也没什么。虽然您希望在应用程序中使用缓存来提高性能。