嵌入或引用的关系

时间:2012-11-10 19:29:19

标签: ruby-on-rails mongodb mongoid

我使用mongodb和mongoid gem,我想得到一些建议。

我有一个用户has many市场和市场has many产品的应用。 我需要在属于用户的所有(或任何)市场中搜索特定价格范围内的产品。

哪种关系更适合这种,嵌入或引用?

我目前使用引用,它看起来像是

class User
  has_many :markets
end

class Market
  belongs_to :user
  has_many :products
end

class Product
  belongs_to :calendar
  belongs_to :user
end

对于搜索,我使用此查询

Product.where(user_id: current_user.id).
  in(market_id: marked_ids).
  where(:price.gte => price)

我很好奇,因为mongdb是一个面向文档的数据库,如果我在这种情况下使用嵌入式文档,我会在性能或设计方面受益吗?

2 个答案:

答案 0 :(得分:3)

在您的情况下,我建议使用引用的数据。因为我认为你需要自己操作每个集合(你需要能够通过_id编辑/删除/更新“产品”,并做一些其他复杂的查询,当你有单独的时候这会更容易和有效采集)。

同时我会将一些完整的嵌入数据存储在Users集合中,只是为了加速显示访问者的浏览器。假设您有一个用户页面,您想要显示用户的个人资料和前五大市场以及前20个产品。您可以将最新的前5名和前20名嵌入到用户的文档中,并在有新的市场/产品时更新这些嵌入的对象。在这种情况下 - 当您显示用户的页面时,您只需要向MongoDB进行一次查询。所以这就像缓存一样。如果访问者需要查看更多产品,他会转到下一页“产品”并在MongoDB中查询单独的“产品”集合。

答案 1 :(得分:1)

如果您只需要通过父类访问该项,请使用嵌入式文档。如果需要直接查询或从多个对象查询,请使用引用。