Ruby on rails 嵌入或引用关系

Ruby on rails 嵌入或引用关系,ruby-on-rails,mongodb,mongoid,Ruby On Rails,Mongodb,Mongoid,我使用mongodb和mongoid gem,我想得到一些建议 我有一个应用程序,用户有很多市场,市场有很多产品。 我需要在属于用户的所有或任何市场中搜索产品,比如特定价格范围内的产品 嵌入或引用哪个关系更适合此关系 我目前使用的是referenced,看起来是这样的 class User has_many :markets end class Market belongs_to :user has_many :products end class Product belon

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

我有一个应用程序,用户有很多市场,市场有很多产品。 我需要在属于用户的所有或任何市场中搜索产品,比如特定价格范围内的产品

嵌入或引用哪个关系更适合此关系

我目前使用的是referenced,看起来是这样的

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编辑/删除/更新产品,并执行一些其他复杂的查询,当您有单独的集合时,这将更加容易和有效


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

在您的情况下,我建议使用参考数据。因为我假设您需要单独操作这些集合中的每一个,所以您需要能够按_id编辑/删除/更新产品,并执行一些其他复杂的查询,当您有单独的集合时,这将更加容易和有效

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