2012-11-10 45 views
2

我使用mongodb和mongoid寶石,我想得到一些建議。嵌入或引用的關係

我有一個應用程序,其中用戶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是一個面向文檔的數據庫,我會如果我在這種情況下使用了嵌入式文檔,那麼在性能或設計中是否有益?

回答

3

在你的情況,我會建議使用引用的數據。因爲我想你需要自己操作每個集合(你需要能夠通過_id編輯/刪除/更新「產品」,並執行其他一些複雜的查詢,當你分開時採集)。

與此同時,我會將的一些完整的嵌入式數據存儲在Users集合中,以加速顯示到訪問者的瀏覽器。比方說,你有一個用戶的頁面,你想要顯示用戶的個人資料和前5名市場和前20名產品。您可以將最新的前5名和前20名嵌入到用戶文檔中,並在有新市場/產品時更新這些嵌入對象。在這種情況下 - 當你顯示用戶的頁面時,你只需要對MongoDB進行一次查詢。所以這可以作爲緩存。如果訪問者需要查看更多產品,他會進入下一頁「產品」並在MongoDB中查詢單獨的「產品」集合。

1

如果您只需要通過父類訪問項目,請使用嵌入式文檔。如果您需要直接查詢或從多個對象查詢,請使用參考。