数据模型设计

高效的数据模型支持我们的应用需求。文档结构的关键考量是决定使用嵌入或者引用。

嵌入数据模型

在MongoDB中,我们可以在一个单一的结构或文档中嵌入相关文档。这些模式一般被称为“反规范化”模型,利用了MongoDB的富文档优势。考虑下面的图表:
嵌入的数据模型允许应用在一个相同的数据库记录中存储相关的信息块。因此,应用可以使用更少的查询和更新来完成常用操作。

一般说来,在以下情况可以使用嵌入文档:

  • 在实体之间有“包含”关系
  • 实体之间有异地多的关系,在这些关系中,“多”或者子文档经常出现在“一”或父文档中

一般说来,嵌入对读操作提供了更佳的性能,以及在一个单一的数据库操作中请求和检索相关数据的能力。嵌入的数据模型使得在一个单一的原子写操作中更新相关数据变成可能。

然而,在一个文档中嵌入相关的数据可能会带来文档在创建之后大小增长的情况。通过使用MMAP1.0存储引擎,文档的增长可能会影响写性能,以及数据分分割。

在3.0.0版本中,MongoDB使用2的指数倍分配大小作为MMAPv1的默认分配策略,以便于满足文档增长,最小化数据分割的可能性。此外,MongoDB中的文档必须小于最大的BSON文档大小。对于大量二进制数据,可以考虑使用GridFS。

在于嵌入文档交互时,使用点操作符来“获取”嵌入文档。

规范化的数据模型

规范化的数据模型描述了文档之间使用引用的关系。
一般说来,在以下情形下使用规范化的数据模型:

  • 当嵌入会带来数据的复制但是不能提供足够的读性能优势超过复制的影响时
  • 表示更加复杂的多对多关系
  • 对大型层次数据集进行建模

引用比嵌入提供了更多的灵活性。然而,客户端的应用必须发送连接的查询来处理引用。也就是说,规范化数据模型可能会向服务器请求更多的轮询。

打赏

mickey

记录生活,写给几十年后的自己。