0

假设我有一个具有以下模型关联的 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) 产生两个查询,首先查找用户,然后根据用户查找组。

4

1 回答 1

1

我认为这是一个有效权衡的问题。严格来说,在完全规范化的数据库中,您的 items 表不会有 group 列,而是始终通过 users 表来查找 group。这具有最少的重复量,因此具有最高的数据完整性,但代价是每次您要查找项目的组时都进行额外的连接。我假设一个用户也只属于一个组。如果用户可以属于许多组,那么我认为您必须拥有该 items.group_id 列才能知道项目属于哪些组。

如果你想在查找时获得更快的查询性能,你可以像你一样保持额外的关联,并添加一个额外的 before_* 钩子以确保 item.group_id = item.user.group_id,如果他们不这样做,则会引发验证错误不匹配。这会使验证/插入稍微慢一些,但会最大化您的数据完整性,并且在从数据库读取时仍然可以让您获得稍微更好的性能。

于 2013-09-20T18:46:53.950 回答