假设我有一个具有以下模型关联的 Rails 3 应用程序:
user
belongs_to :group
item
belongs_to :group
belongs_to :user
如果代码没有仔细编写,这可能会导致数据差异,其中:
项目组
和
项目.用户.组
不再返回同一组,当他们应该。一个项目应该始终只属于一个组。
我的理解是,可能已创建此重复关联以使查询更简单(减少加入的表的数量)。
所以我的问题是,这只是一个彻头彻尾的糟糕做法,还是一个有效权衡的问题,在某些情况下数据和关联重复是可以接受的,因为我们可以用更少的连接使查询更简单。
更新
到目前为止,答案似乎是“权衡”而不是“不良做法/代码气味”。
似乎有多种方法可以处理这个问题,可能结合了约束、优点、缺点、用例等:
1) 如上所述的非规范化重复数据 2) 项目 has_one :group, :through => :user 3) 项目委托 :group :to => :user
我试图了解方法#2 和#3 之间的区别。在控制台中尝试了这两种方法之后,Rails 在调用 item.group 时产生的查询似乎会有所不同。(2) 生成连接组和用户的单个查询。(2) 产生两个查询,首先查找用户,然后根据用户查找组。