嵌入或引用的关系

我使用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是一个面向文档的数据库,如果我在这种情况下使用嵌入式文档,我会在性能或设计方面受益吗?

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

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

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