MongoDB的數據模式是一種靈活模式,其集合並不限制文檔結構。這種靈活性讓對象和數據庫文檔之間的映射變得很容易,即使數據記錄之間有很大的變化,每個文檔也可以很好的映射到各條不同的記錄。但在實際使用中,同一個集合中的文檔往往都有一個比較類似的結構。
描述文檔結構的方式主要有兩種:引用及內嵌。
內嵌
內嵌的方式指的是把相關聯的數據保存在同一個文檔結構之中。MongoDB的文檔結構允許一個字段或者一個數組內的值作為一個嵌套的文檔。如果使用內嵌文檔模型,應用程序只需查詢一次就可以獲得所有需要的信息。
1 { 2 _id:ObjectId("cccc"), 3 name:"wddpct", 4 age:22, 5 location:"wenzhou", 6 addresses:[ 7 {country:"china",city:"wenzhou",street:"chashan road"} 8 {country:"china",city:"wenzhou",street:"north center road"} 9 ] 10 }
一般來說,下述情況建議使用內嵌數據:
1. 數據對象之間有包含關系。
2. 數據對象之間有一對多的關系。
引用
引用方式通過存儲鏈接或者引用信息來實現兩個不同文檔之間的關聯。應用程序可以通過解析這些數據庫引用來訪問相關數據。類似關系型數據庫的關聯查詢。
1 { 2 _id:ObjectId("cccc"), 3 name:"middle1", 4 location:"wenzhou", 5 students:[ 6 ObjectId("xxxx"), 7 ObjectId("yyyy"), 8 …… 9 ] 10 }
一般來說,下述情況下適合使用引用方式:
1. 當內嵌數據會導致很多數據的重復,並且讀性能的優勢又不足於覆蓋數據重復的弊端
2. 需要表達比較復雜的多對多關系的時候
3. 大型層次結果數據集
通用建議
以下給出一張較通用的建議表,僅供參考
| 內嵌 | 引用 |
|---|---|
| 子文檔較小 | 子文檔較大 |
| 數據不會定期更改 | 數據經常改變 |
| 最終數據一致即可 | 中間階段數據也必須一致 |
| 文檔數據小額增加 | 文檔數據大幅增加 |
| 數據通常需要執行二次查詢 | 數據通常不包含在查詢結果中 |
| 快速讀取 | 快速寫入 |
