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查询,它将在一个查询中为您提供预期的结果。 如果您查询的速度很慢,您可能需要在表上添加一些索引。
- 如何在ruby的OptionParser中使用变量参数
- 如何在终端ruby应用程序中执行文本框?
- 使用Ruby Test Unit在一个脚本中并行运行多个测试
- Rails:如何连接到旧的PostgreSQL(你的PostgreSQL版本(70417)太旧了,请升级!)
- Rails 5 – 国家gem – 旗帜
- DelayedJob:如何解决“作业无法加载”的问题?
- Shoes.rb可以创建自包含的应用程序吗?
- 为什么“instance.send(:initialize,* args,** kwargs,&block)”只能从Class#new中失败?
- OpenSSL :: SSL :: SSLError:hostname与服务器证书不匹配