2017-08-01 39 views
0

試圖讓我的手蒙上MongoDB,來自關係數據庫背景。MongoDB更新範例

我相信MongoDB的一個主要概念是儘可能多地保持數據。

可以想象我創建具有產品和類別的應用程序,我存儲產品是這樣的:

產品集合

{ 
    "_id": "30671", //main item ID 
    "department": "Shoes", 
    "category": "Shoes/Women/Pumps", 
    "brand": "Calvin Klein", 
    "thumbnail": "http://cdn.../pump.jpg", 
    "title": "Evening Platform Pumps", 
    "description": "Perfect for a casual night out or a formal event.", 
    "style": "Designer", 
    … 
} 

分類收集

{ 
    "_id": "12356", 
    "name": "Shoes" 
    … 
} 

如果我更新類別名稱,我是否需要運行一個巨大的更新com是否需要更新所有產品?或者在這種情況下,最好將產品的類別標識存儲爲產品而不是名稱(就像我們在關係數據庫中那樣)?

感謝

+0

有沒有這樣的事情 「的NoSQL」。這只是一個集體名詞。你要麼使用MongoDB,要麼使用Firebase,要麼使用Cassandra。通常在RDBMS領域,所有的事情都會說同一個SQL。與其他人打交道時,**沒有共同語言**。所以你可以停止用「NoSQL」來引用它,因爲它實際上並不意味着什麼。只有期望的目標系統的語法纔是最重要的。 –

+0

下一點。 Whist你**可以**將數據存儲在多個集合中,你應該問的事情是*「我真的需要**嗎?」*。當答案是** NO **時,那麼當你開始查看基於「非關係型」的數據庫解決方案時。當它是** YES **時,關係模型會更好,除非域邏輯的重要部分更適合其他引擎,並且使用不同的引擎是不可能的。所以底線是你的「問題在這裏」太廣泛了。這不是關於**最好的**,而是關於**最適合你的**。 –

+0

@NeilLunn,我用一個簡單的例子(cats/prods)描述了我的問題。同樣的概念很容易適用於其他情況。所以對我來說這不是問題,我希望得到更多MongoDB經驗豐富的人士的意見,在這些情況下,您可以在多個地方獲得相同的信息。我認爲這就是Stackoverflow的意義,分享知識。 – AndreFeijo

回答

1

一般存在的MongoDB沒有「一刀切」的做法就像是在關係數據庫的世界。在關係模式設計中,將Category放在單獨的表中是不容易的。實際上,在標準化過程中這幾乎是一個要求。

在MongoDB中,模式設計幾乎完全取決於您需要什麼和您的用例,而不是任何經驗法則或任何制定的要求。當然,每種選擇都有其優缺點。例如:

  • 如果你在你的使用情況發現,Category變化不大(或全部),那麼你就可以放心地把它Products內部集合。但是,如果您需要重新命名某個類別,那麼您需要更新屬於該類別的所有產品。
  • 如果您發現您的用例在更改類別名稱時需要靈活性,那麼您可能希望將其放入單獨的集合中,並像關係設計中那樣引用它。但是,返回一個產品可能不是性能,因爲現在您需要兩個查詢而不是一個(或查找)。

我注意到您在示例中使用了"category": "Shoes/Women/Pumps"。在MongoDB中,如果你的用例允許的話,你可以把它放到一個數組中。 "category": ["Shoes", "Women", "Pumps"]。這可能使字段更容易索引(再次,取決於您的使用情況)。

簡而言之,MongoDB模式設計中沒有正確或錯誤,但有一點需要注意:通常錯誤的做法是嘗試在MongoDB中模擬關係設計,因爲它違背了穀物。

您還可以找到這些鏈接有用: