Embedded or referenced relations

≡放荡痞女 提交于 2019-12-11 03:45:54

问题


I use mongodb and mongoid gem and I'd like to get some advice.

I have an app where User has many Markets and Market has many Products. I need to search for the products, say in a specific price range, in all (or any) the markets which belong to the user.

Which relation fits better for this, embedded or referenced?

I currently use referenced and it looks like so

class User
  has_many :markets
end

class Market
  belongs_to :user
  has_many :products
end

class Product
  belongs_to :calendar
  belongs_to :user
end

And for search, I use this query

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

I'm curious, since mongdb is a document oriented database, would I benefit in a performance or design, if I used embedded documents in this situation?


回答1:


In your case I would advice to use referenced data. Because I suppose that you need to manipulate each of those collections on it's own (you need to be able to edit/delete/update "products" by _id, and do some other complicated queries, which is much easier and effective when you have separate collection).

At the same time I would store some full embedded data in Users collection, just for speed-up display to visitor's browser. Let's say you have a user's page where you want to show user's profile and top-5 markets and top-20 products. You can embed those newest top-5 and top-20 to User's document and update those embedded objects when there are new markets/products. In this case - when you show user's page you need to make just 1 query to MongoDB. So this works as cache. If visitor needs to view more products, he goes to the next page "Products" and query separate "Products" collection in MongoDB.




回答2:


Use embedded documents if you only need to access the item through the parent class. If you need to query it directly or from multiple objects, use a reference.



来源:https://stackoverflow.com/questions/13325346/embedded-or-referenced-relations

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!