简单来说,如何使用投票的异构对象设计投票系统。
例如我可以有文章,电影,帖子,评论等,我希望所有这些都是“可投票的”。
问题是如何设计数据库以将性能和可伸缩性保持在合理的水平?
一些信息/要求:
我的想法:
对于包含可投票对象的每个表,添加一列voteable_id
,该列在所有可投票对象中都是唯一的。这里的问题是保持这种独特性。我正在研究MySQL,其中不能像在PostgreSQL中那样简单的序列。
我还可以将voteable_id
保存在一个单独的表中,这意味着在对象表中我将是简单的外键。然后我还可以添加一些列,让我在投票方面配置该对象,如“阻止投票”或保留聚合计数器。
也许还有其他想法,甚至是更好的经过验证的解决方案?
答案 0 :(得分:1)
您还可以使用Ruby on Rails使用的多态引用。
您的投票表可以包含2列外键 - votable_id
和votable_type
。 votable_id
是投票项目的关键,voteable_type
是项目所在表格的指示符 - RoR使用字符串,但您也可以使用ENUM或简单编码类型整数。
如果在这两列上创建一个双列索引(voteable_type
开始索引中的第一列),您可以使用所需的任何可选表格进行快速连接。