2017-04-04 84 views
1

我已經使用了MongoDB一段時間,但我只用它做CRUD操作時,其他人已經完成了設計模式的基本任務。所以,基本上這是我第一次設計一個模式,我需要一些建議。 我將從用戶處收集的數據是他們的常規信息,他們的健康相關信息以及他們的保險相關信息。單個用戶不會有多個與健康和保險相關的信息,因此它是簡單的一對一關係。但這些健康和保險相關信息將會有很多領域。所以我的問題是。它的好處是有一個單獨的收集健康和保險相關的信息:MongoDB Schema設計建議

 var userSchema = { 
       name : String, 
       age : Number, 
    health_details : [{ type: Schema.Types.ObjectId, ref: 'Health' }],//reference to healthSchema 
insurance_details : [{ type: Schema.Types.ObjectId, ref: 'Insurance' }] //reference to insuranceSchema  
    } 

,或者有大量的字段作爲一個單一的集合:

 var userSchema = { 
       name : String, 
       age : Number, 
      disease_name : String, // and many other fields related to health 
      insurance_company_name : String //and many other fields related to insurance 
    } 

回答

1

一般來說,一些因素你而建模1對1可以考慮,1對多的和多到多的數據中的NoSql是:

1.數據複製

您是否期望數據重複?這也不是像愛好「園藝」這樣的一種單詞,許多用戶都可以擁有,而且可能不需要「愛好」收藏,但像作者和書籍一樣。這種情況可以保證重複。

作者可以寫很多書。你甚至不應該在兩本書中嵌入作者。作者信息發生變化時很難維護。使用1對多。可以參考兩個文件中的任何一個。由於「有很多」(作者中的bookIds數組)或「屬於」(每本書中的authorId)。

如果是健康和保險,由於預計不會發生數據重複,單個文檔是更好的選擇。

2.讀/寫偏好

什麼是讀取的預期頻率和數據(不集合)的寫?例如,您查詢用戶,他的健康和保險記錄的頻率要比更新頻率高得多(並且如果1和3沒有太大問題),那麼應該優先將這些數據包含在單個文檔中,並從中查詢,而不是從三個不同的來源。

另外,一個文檔是Mongodb保證原子性的東西,如果你想同時更新用戶,健康和保險(比如在一個API中),這將是一個額外的好處。

3.文檔

的大小試想一下:有多少用戶可以喜歡的訊息,並且用戶可以像許多職位(許多到多)。因爲你需要確保沒有用戶喜歡一個帖子兩次,用戶ID必須存儲在某個地方。三個選項:

  • 保持用戶ID後文檔中數組
  • 保持後的ID陣列用戶文檔中
  • 創建包含(解決方案的ID許多到多隻,類似的其他文檔到SQL)

如果一篇文章被超過一百萬用戶喜歡,文章文檔將溢出與用戶引用。同樣,用戶可以在短時間內喜歡成千上萬的帖子,所以第二個選項也不可行。這給我們留下了第三種選擇,這對於這種情況來說是最好的選擇。

但是一篇文章可以有很多評論,評論只屬於一篇文章(一對多)。現在,你幾乎沒有期望的評論超過幾百個。幾乎沒有。因此,在後期保留一系列commentIds(或嵌入的評論本身)是一種實用的解決方案。

就你而言,我不相信一個沒有保留大量引用的文檔可以增長到足以達到16 MB(Mongo文檔大小限制)。因此,您可以安全地將健康和保險數據存儲在用戶文檔中。但他們應該有自己的鍵:

var userSchema = { 
      name : String, 
      age : Number, 
      health : { 
      disease_name : String, 
      //more health information 
      }, 
      insurance :{ 
      company_name : String, 
      //further insurance data 
      } 
} 

這就是你應該考慮如何設計你的模式在我看來。我建議閱讀這些Couchbase非常有用的數據建模指南:Document design considerations,modeling documents for retrievalmodeling relationships。雖然與Couchbase相關,但這些規則同樣適用於mongodb模式設計,因爲它們都是NoSql和麪向文檔的數據庫。