我应该对has_many has_many进行非规范化吗?

时间:2010-04-22 14:41:04

标签: ruby-on-rails denormalization

我有这个:

class User < ActiveRecord::Base
  has_many :serials
  has_many :sites, :through => :series
end

class Serial < ActiveRecord::Base
  belongs_to :user
  belongs_to :site
  has_many :episodes
end

class Site < ActiveRecord::Base
  has_many :serials
  has_many :users, :through => :serials
end

class Episode < ActiveRecord::Base
  belongs_to :serial
end

我想对User.serials.episodes做一些操作,但我知道这意味着各种巧妙的技巧。理论上我可以将所有剧集数据放入连续剧(非规范化),然后在需要时将其分组。

如果我有很多需要查询的剧集,这会是个坏主意吗?

感谢

2 个答案:

答案 0 :(得分:0)

这实际上取决于您在此应用程序中需要的规模。如果该应用程序不需要服务吨和吨的人,那么去吧。如果您从活动记录关联中获得了很多好处,那么请继续使用它们。随着您的应用程序扩展,您可能会发现自己使用更直接的方法替换关联使用的特定实例来处理您的流量负载。

答案 1 :(得分:0)

我不打扰非规范化。

如果您需要查看计数,可以查看关系上的counter_cache以保存查询。

外键上有适当的索引吗?如果是这样,从一个额外的连接中提取数据应该不是那么重要,但是您可能需要下拉到SQL以在一个查询中获得所有结果而无需迭代.serials:

User.serials.collect { |s| s.episodes }.uniq  # ack! this could be bad