【问题标题】:Comments for many different models: polymorphic or not? (Ruby on Rails)许多不同模型的评论:多态与否? (Ruby on Rails)
【发布时间】:2011-04-05 07:28:13
【问题描述】:

我正在构建一个应用程序,该应用程序允许在 5 个独特模型(帖子、照片、事件等)上使用 cmets,并且还有 2 或 3 个模型正在开发中。就目前而言,每个模型都有一个关联的评论模型(PostComments、PhotoComments、EventComments 等),尽管 cmets 本身在所有模型中通常都是相同的。

我最近发现了多态关联的强大功能,在 Railscast #154 中得到了完美的解释,它本质上将许多模型组合成一个模型,并将许多表组合成一个表。

虽然多态关联会清理代码和冗余,但它们如何影响性能?我对数据库优化了解不多,但是从通用评论表中的 1,000,000 行中查询评论似乎比在特定评论表中的 200,000 行中查询要花费更长的时间。是否值得切换到多态关联(虽然应用程序仍处于相对早期的开发阶段)还是我应该继续为每种类型的评论制作模型/表格?

【问题讨论】:

  • cmets 功能实际上是多态关联的最佳示例。 1000000 行对于具有适当索引和查询的体面的 mysql 服务器来说不算什么。不要尝试解决不存在的问题:)

标签: ruby-on-rails polymorphic-associations


【解决方案1】:

这真的取决于网站的规模。首先,您必须在 2 列上添加索引。

add_index :comments, [:commentable_type, commentable_id]

这将大大提高速度。

如果您将来因为有 1.000.000 个 cmets 而遇到很大的速度问题,您可以随时使用缓存,甚至迁移到多个表。但实际上,您将需要很多 cmets 才能遇到速度问题。只要你索引你的表!无论如何,在 1.000.000 条记录中进行搜索查询也不算多。

我说,做一张桌子!

【讨论】:

  • 谢谢,我正计划正确索引,但忘记在原始问题中提及。
【解决方案2】:

比迈克尔的回答稍微改进:

add_index :comments, [:commentable_id, :commentable_type]

我认为这个答案会更好,因为 :commentable_id 属性会进一步缩小查询范围,这意味着对索引的整体查询速度会快很多。给我关于这个的反馈:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    相关资源
    最近更新 更多