文档数据库通过在单个文档中存储嵌套结构来处理层级数据。与将数据拆分到各个表中的关系数据库不同,MongoDB 或 Couchbase 等文档数据库使用 JSON 或 BSON 等格式直接嵌入相关数据。例如,产品目录可能包含一个文档,其 category
字段包含子类别,每个子类别都有自己的属性。 这样就避免了复杂的连接或外键的需要,因为所有相关数据都驻留在单个文档中。 文档数据库的无模式特性使开发人员能够灵活地对层级结构进行建模,适应更改而无需严格的预先定义。
在文档数据库中查询层级数据依赖于基于路径的语法和专用运算符。例如,MongoDB 使用点表示法(例如,category.subcategory.name
)来访问嵌套字段。文档中的数组也可以表示层级结构,例如带有嵌套评论和回复的博客文章。可以在嵌套字段上创建索引以提高查询性能——例如,索引 user.address.city
字段以进行快速的基于位置的搜索。某些数据库支持用于遍历树的递归查询,但这因实现而异。例如,MongoDB 的 $graphLookup
可以遍历跨文档存储的层级关系,但单个文档中的深度嵌套可能需要应用程序端逻辑。
当层级结构变得过于复杂或深度嵌套时,就会出现挑战。大型或频繁更新的层级结构会导致文档膨胀,从而影响读取/写入性能。例如,一个具有数千名员工的深度嵌套的组织结构图可能会限制文档大小或减慢更新速度。为了缓解这种情况,开发人员通常会平衡嵌入和引用——将顶层数据存储在一个文档中,并链接到相关文档以获取更深的层次。例如,电子商务产品可能会嵌入其基本属性,但引用单独的文档以获取详细的供应商或库存数据。嵌入和引用之间的选择取决于访问模式:对于相关数据的频繁读取,使用嵌入;对于易失性或大型子层级,使用引用。