Rails,数据结构和性能

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

目前,在请求关于给定问题的统计数据时,我必须为每个选项进行SQL查询,该查询将在“投票”表(大约150万个条目)中查找并计算选择此选项的次数。 它很慢,需要4/5秒。

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

Rails提供了一个名为counter_cache的function, 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

这将是一个明智的决定, ActiveRecord:CounterCache就是为了这个目的而制作的。

此外,还有一个Railscast

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