【问题标题】:Rails, data structure and performanceRails,数据结构和性能
【发布时间】:2011-09-20 09:29:26
【问题描述】:

假设我有一个带有 3 个表格的 rails 应用程序,一个用于问题,一个用于选项(此问题的可能答案),一个用于投票。

目前,在请求给定问题的统计信息时,我必须对每个选项进行 SQL 查询,该查询将在“投票”表(大约 150 万个条目)中查找并计算该选项被选中的次数.速度很慢,需要 4/5 秒。

我正在考虑直接在问题表中添加一列,该列将存储统计信息并在每次有人投票时更新它们。这是好习惯吗?因为它对于投票表中已经存在的信息似乎是多余的,所以加载起来会更快。 或者也许我应该创建另一个表格来保存每个问题的这些统计信息? 谢谢你的建议!

【问题讨论】:

    标签: ruby-on-rails ruby database count


    【解决方案1】:

    Rails 提供了一个名为 counter_cache 的功能,它将为您服务

    将 counter_cache 选项添加到投票模型

       class Vote < AR::Base
           belongs_to :question, :counter_cache => true
       end
    

    以及接下来的迁移

    add_column :questions, :votes_count, :integer, :default => 0  
    

    这应该为投票表中的每条新记录增加问题表中的 votes_count 字段

    欲了解更多信息:RailsCast

    【讨论】:

    • 我认为Vote belongs_to :option 不是:question,但是是的,这基本上是他应该使用的。
    【解决方案2】:

    这是一个明智的决定,ActiveRecord:CounterCache 就是为此目的而做出的。

    另外,还有一个Railscast for that

    【讨论】:

    【解决方案3】:

    您可能可以使用 GROUP BY 执行“聪明”的 SQL 查询,这将在一次查询中为您提供预期的结果。如果您的查询速度很慢,您可能需要在表上添加一些索引。

    【讨论】:

    • 是的,我也想过这样做,但即使有一个“聪明”的组,它仍然有点慢,我会尝试上面的 counter_cache 解决方案
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多