投票系统与异构对象

时间:2013-09-16 20:30:23

标签: mysql sql database

简单来说,如何使用投票的异构对象设计投票系统。

例如我可以有文章,电影,帖子,评论等,我希望所有这些都是“可投票的”。

问题是如何设计数据库以将性能和可伸缩性保持在合理的水平?

一些信息/要求:

  • 只有注册用户才能投票
  • 每次投票都存储在数据库中以用于以后的统计目的(使用聚合计数器直播+有时验证它们)
  • 我将来会添加其他可投票的对象。
  • 仅限一位用户的投票可以为每个对象投票一次。
  • 不会有多个对象类别的累积排名。
  • 我需要在显示对象时几乎总是显示投票数,但保持聚合值始终是最新的并不是最重要的,因此缓存可能会在这里完成它的工作。只有在某些情况下,我才会希望保持最新状态。

我的想法:

对于包含可投票对象的每个表,添加一列voteable_id,该列在所有可投票对象中都是唯一的。这里的问题是保持这种独特性。我正在研究MySQL,其中不能像在PostgreSQL中那样简单的序列。

我还可以将voteable_id保存在一个单独的表中,这意味着在对象表中我将是简单的外键。然后我还可以添加一些列,让我在投票方面配置该对象,如“阻止投票”或保留聚合计数器。

你怎么看?可以吗?请记住,这只是功能之一,因此无法占用所有资源。 ; - )

也许还有其他想法,甚至是更好的经过验证的解决方案?

1 个答案:

答案 0 :(得分:1)

您还可以使用Ruby on Rails使用的多态引用。

您的投票表可以包含2列外键 - votable_idvotable_typevotable_id是投票项目的关键,voteable_type是项目所在表格的指示符 - RoR使用字符串,但您也可以使用ENUM或简单编码类型整数。

如果在这两列上创建一个双列索引(voteable_type开始索引中的第一列),您可以使用所需的任何可选表格进行快速连接。