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. 大型层次结果数据集
通用建议
以下给出一张较通用的建议表,仅供参考
内嵌 | 引用 |
---|---|
子文档较小 | 子文档较大 |
数据不会定期更改 | 数据经常改变 |
最终数据一致即可 | 中间阶段数据也必须一致 |
文档数据小额增加 | 文档数据大幅增加 |
数据通常需要执行二次查询 | 数据通常不包含在查询结果中 |
快速读取 | 快速写入 |