2012-10-17 46 views
1

我認爲有&產物像數據庫MongoDB中的商店和產品如數據庫的最佳結構是什麼?

第一

ShopSchema = new Schema({ 
    product_ids:[Schema.Types.ObjectId], 
    }) 

    ProductSchema = new Schema({ 
    product_name:String, 
    }) 

第二

ShopSchema = new Schema({ 

    }) 

    ProductSchema = new Schema({ 
    shop_id:Schema.Types.ObjectId, 
    product_name:String, 
    }) 

第一溶液有一個乾淨的產品集合與兩種類型店鋪的結構的第二,產品集合中的每個文檔都有一個shop_id字段(類型是浪費空間i想想),但通過第一個結構獲得所有產品可能會很痛苦,而第二個則相當容易。

所以我想知道哪一個是最好的。或者你有更好的解決方案嗎?

回答

1

問自己以下的問題:你應該能賣同樣的產品在多個商店?

如果答案是否定的,那麼你可以考慮shop_id是商店,你們給應該是一個有效的解決方案的第二個選項的屬性。

如果答案是肯定的,那麼你需要能夠將產品映射到多個商店。如果您使用第二種設計,則需要多次複製一個產品對象,每個商店出售一次,這相當於您可以調用的新模式,例如ProductInShop

注意,你仍然有兩個非常有效的選項如何建模。您可以1)將product_ids財產添加到ShopSchema或2)將shop_ids財產添加到ProductSchema

我猜測,通過節省空間,你也意味着標準化數據。與關係數據庫不同,在文檔數據庫中,您通常傾向於避免規範化,而是儘可能地去規範化。例如:在關係數據庫中,您通常會將其添加爲列表shop_idproduct_id的新表格。在像MongoDB這樣的文檔數據庫中,您通常應該儘可能將其嵌入到單個文檔中以避免「文檔連接」。

也只是關於貓鼬的一個筆記。如果您想利用Mongoose的populate優勢,請另外提供對收集名稱的明確引用。例如:

var ShopSchema = new Schema({ 
    product_ids: [{ type: Schema.Types.ObjectId, ref: 'Product' }] 
}); 

以這種方式,您可以使用貓鼬來例如「找到所有商店和所有在每個商店出售的產品」:

Shop.find().populate('product_ids').exec(function (err, shops) { 
    // ... 
}); 
+0

thanx男人它真的有很大的幫助。我想我應該記住這一點「在像MongoDB這樣的文檔數據庫中,您通常應該儘可能地將其嵌入到單個文檔中以避免」​​文檔連接「。」 – paynestrike

1

對於大多數使用情況,第二個版本效率更高。非規範化是帶有NoSQL持久性解決方案的遊戲的名稱。目標是儘可能少地查詢儘可能多的數據。通常情況下,這需要複製數據並處理重複數據更改時不得不更新大量文檔的潛在問題。

例如,你可能甚至有店鋪的名字添加到產品文檔,如果你希望顯示在網頁上的信息,因爲如果你沒有,你還是會最終不得不查詢店鋪收藏。考慮到商店名稱不會改變,應該相對來說比較頭痛,但是在設計模式時需要考慮到這些因素。從你的用例開始,在設計一個工具的時候按照你的方式工作。

相關問題