有效的数据模型是为应用服务的,设计构架的关键问题是文档模型适合使用嵌入式模型(embed)还是使用引用模型(references)。
嵌入式数据模型(Embedded Data Models)
在MongoDB中,你可能将相关数据嵌入到一个单一结构或文档,这些模式通常被称为“非正规”模型,但是它充分利用了MongoDB富文档模型的有点。
嵌入式数据模型允许应用程序存储相关的信息在一条数据库记录中,这样应用程序可能需要更少的查询和更新来完成常规的操作。
一般来说,嵌入式数据模型适用于以下场景:
(1)拥有包含实体之间的关系
(2)实体之间拥有一对多的关系,在这些关系中,“many”或子文档总是出现在或人为是“one”或富文档的上下文。
通常情况下,嵌入数据的方式在读操作上提供了更好的性能,能够在单次数据操作中请求和检索相关的数据。嵌入式数据模型使MongoDB能够在一次原子写操作中更新相关的数据。
然后,嵌入相关的数据,可能导致文档创建后文档增长太大的问题。文档增长会影响数据的写性能并导致数据分片。而且,MongoDB中文档的大小必须小于BSON格式规定的文档最大容量(最大的BSON文档大小是16MB)。对于大部分二进制数据,需要参考GridFS。
与嵌入式文档进行交互,使用“.”符号进入嵌入文档。
规范化数据模型(Normalized Data Models,References)
规范化数据模型描述了文档引用之间的关系。
一般来说,规范化数据模型适用于以下场景:
(1)当嵌入式数据模型会导致数据重复并且提供的读性能的优势不会重复的影响。
(2)呈现许多复杂的多对多关系。
(3)对大型分层数据集进行建模
引用(References)模式比嵌入模式提供更好的灵活性,但是客户端应用程序必须解决引用的后续查询问题。换句话说,规范化数据模型需要更多轮的请求服务器。