2012-09-13 46 views
0

我剛開始使用MongoDB,我很困惑用list屬性來構建對象模型。 我有一個與關注者和關注對象相關的用戶模型,它們是用戶標識列表。 所以我可以考慮一些對象模型結構來表示關係。帶有列表屬性的MongoDB對象模型設計

  1. 嵌入式文檔。關注者和關注被嵌入到用戶模型中。通過這種方式,每個請求中的許多Web框架中都會生成一個「current_user」對象,並且由於我們很少在大多數請求中使用這些屬性,所以它是串行化/反序列化Follower和Follow列表屬性的額外開銷。當「current_user」生成時,我們可以排除這些屬性。但是,我們需要在完成任何更新之前再次獲取完整的「current_user」對象。

  2. 在用戶模型中使用參考屬性。我們可以自己擁有關注者和關注對象模型,而不是嵌入對象,但保存對用戶對象的引用。

  3. 在關注者和以下模型中使用參考屬性。我們可以將用戶ID保存在Follower和以下屬性中以供稍後查詢。

可能有其他一些方法可以做到這一點,更易於使用或更好的性能。而我的問題是:
什麼建議的方式來設計與相關列表屬性的模型?

回答

1

對於來自SQL世界的人們(比如我自己)來說,瞭解MongoDB最難的事情之一就是模式設計的新風格。在SQL世界中,一切都進入第三範式。人們開始認爲有一個正確的方式來設計他們的模式,因爲通常有一個。

在MongoDB的世界裏,沒有一個最好的模式設計。更準確地說,在MongoDB模式設計中,取決於應用程序將如何訪問數據。

這裏有你需要以設計MongoDB的一個很好的模式來回答的關鍵問題:

  • 多少數據你有嗎?
  • 你最常見的操作是什麼?你會主要插入新的數據,更新現有的數據還是做查詢?
  • 什麼是您最常見的查詢?
  • 你最常見的更新是什麼?
  • 你期望每秒有多少次I/O操作?

下面是如果您考慮一對多對象關係時可能會出現這些問題。

在SQL中,您只需使用主鍵/外鍵關係創建一對主/明細表。在MongoDB中,您有多種選擇:可以嵌入數據,可以創建鏈接關係,可以複製和非規範化數據,也可以使用混合方法。

正確的方法將取決於有關您的應用程序的用例的很多細節。

以下是關於MongoDB模式設計的一些很好的一般參考資料。

MongoDB的介紹:

這裏有幾個關於MongoDB的架構設計,我認爲你會發現有用的書籍:

下面是一些示例架構設計: