冗余列优化是数据库优化的常见方法。一些情况,由于一个字段在其他表里,在查询的时候就需要做 JOIN 查询。比如:查询积分大于 100 的用户的帖子,状态是 active 的用户的文章等。
优化这样的查询的办法之一就是使用冗余列,上面的例子把用户积分冗余到帖子表里,把用户状态冗余到文章表里。这样只需要简单的查询就可以了。
但是冗余列会带来数据的不一致性。这就需要额外的维护成本。比如,用户状态的变化要同步到文章表。 还有就是每次创建文章都需要手动设置用户状态。
redundant_column 就是解决上面问题的插件。
class User < ActiveRecord::Base has_many :topics, :redundant_column => {:status => :user_status} end
class Topic < ActiveRecord::Base belongs_to :user, :redundant_column => {:user_status => :status} end
user = User.create(:name => "Hooopo", :status => "active")
topic = Topic.create(:user => user, :title => "this is title")
assert_equal topic.user_status, user.status
user.status = "disable" user.save
topic.reload
assert_equal topic.user_status, user.status