我使用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是一个面向文档的数据库,如果我在这种情况下使用嵌入式文档,我会在性能或设计方面受益吗?
答案 0 :(得分:3)
在您的情况下,我建议使用引用的数据。因为我认为你需要自己操作每个集合(你需要能够通过_id编辑/删除/更新“产品”,并做一些其他复杂的查询,当你有单独的时候这会更容易和有效采集)。
同时我会将一些完整的嵌入数据存储在Users集合中,只是为了加速显示访问者的浏览器。假设您有一个用户页面,您想要显示用户的个人资料和前五大市场以及前20个产品。您可以将最新的前5名和前20名嵌入到用户的文档中,并在有新的市场/产品时更新这些嵌入的对象。在这种情况下 - 当您显示用户的页面时,您只需要向MongoDB进行一次查询。所以这就像缓存一样。如果访问者需要查看更多产品,他会转到下一页“产品”并在MongoDB中查询单独的“产品”集合。
答案 1 :(得分:1)
如果您只需要通过父类访问该项,请使用嵌入式文档。如果需要直接查询或从多个对象查询,请使用引用。