2013-12-16 88 views
0

從MySQL背景來看,我一直在質疑Mongo使用Mongo時的一些設計模式。我一直問自己的一個問題是,我應該在什麼時候創建一個新的集合,並創建一個數組類型的屬性?我現在的情況去如下:創建新集合和數組屬性

  • 我有誰都有至少1收件箱
  • 用戶的集合,每個收件箱中有0個或多個消息
  • 每個消息可以有0個或評論

我當前結構看起來像這樣:

{ 
username:"danramosd", 
inboxes:[ 
    { 
     name:"inbox1", 
     messages:[ 
      { 
       message:"this is my message" 
       comments:[ 
        { 
         comment:"this is a great message" 
        } 
       ] 
      } 
     ] 

    } 
] 
} 

爲了簡單起見,我只列出1個收件箱中,1個消息,並且1共mment。實際上雖然可能還有更多。

的方法,我相信會更好地工作就是用4個集:

  • 用戶 - 商店只是用戶名
  • 收件箱 - 收件箱的名稱,與用戶的UID沿着它屬於
  • 消息 - 消息的內容以及它所屬的收件箱的UID
  • 評論 - 評論的內容及其所屬消息的UID。

那麼哪一個更好?

回答

1

沒有人可以幫你這個問題,因爲它是高度依賴於你的應用程序:

  • 多少收件箱/消息/評論你有平均
  • 你經常寫/修改/刪除這些元素
  • 你經常閱讀
  • 很多其他的事情,我忘了提

當你選擇另一種方法時,你正在做tradeofs。

如果你把所有的東西放在一起(作爲第一種情況在一個集合中),你可以非常容易地爲特定的用戶獲得所有的東西。拆分最可能不需要一次性所有信息的東西,同時使得更新元素的某些部分變得非常困難(嘗試編寫查詢,以添加註釋或刪除第三個註釋) 。即使這很容易 - mongodb does not handle well growing documents,因爲每當您超過padding factor它將文檔移動到另一個位置(這很昂貴)並增加填充因子。另外請記住,這可能會擊中mongodb的limit on the size of the document

在嘗試設計任何存儲模式之前,讀取所有mongodb用例總是一個好主意。毫不奇怪,他們也有一個全面的overview of your case