2

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

4

2 回答 2

3

在您的情况下,我建议使用参考数据。因为我认为您需要自己操作这些集合中的每一个(您需要能够通过 _id 编辑/删除/更新“产品”,并执行一些其他复杂的查询,当您有单独的收藏)。

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

于 2012-11-16T05:14:21.903 回答
1

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

于 2012-11-16T00:30:40.577 回答