-2

简而言之,如何设计一个具有被投票的异构对象的投票系统。

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

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

一些信息/要求:

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

我的想法:

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

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

你怎么看?它可以工作吗?请记住,这只是其中一项功能,因此不能占用所有资源。;-)

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

4

1 回答 1

1

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

您的投票表可以有一个 2 列外键 -votable_idvotable_type. votable_id是投票项目的键,是voteable_type项目所在表的指示符 - RoR 使用字符串,但您也可以使用 ENUM 或简单整数对类型进行编码。

如果您在这两列上创建一个两列索引(voteable_type从索引中的第一列开始),您可以与您想要的任何可投票表进行快速连接。

于 2013-09-16T21:42:22.247 回答