在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各种解决方案。

此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型数据库作为存储的几种设计模式。

A.关系型数据库设计模式1

id name parent_id
1 A NULL
2 B 1
3 C 1
4 D 2

上图表示了传统的设计方法之一,就是将树形结构的每一个结点作为关系型数据库中的一行进行存储,每一个结点保存一个其父结点的指针。

  • 优点:结构简单易懂,插入修改操作都很简单
  • 缺点:如果要获取某个结点的所有子结点,将是一件很恶心的事

B.关系型数据库设计模式2

id name parent_id left right
1 A NULL 1 8
2 B 1 2 5
3 C 1 6 7
4 D 2 3 4

上图在模式1的基础上多了两列,left和right,相当于btree中的左右分支,分别存储了左右分支结点的最大值和最小值。

  • 优点:要查找一个结点的子结点很容易,只需要做一个范围查询就行了(比如B节点的子结点,只需要查询 id >=2 && id<=5)
  • 缺点:由于树结构存在在这里面了,所以添加或修改已存在结点将可能产生连锁反应,操作过于复杂

C.文档型数据库设计模式1

{"name": "A","children": [{"name": "B", "children": [{"name": "D"}]},{"name": "C"}]
}

将整个树结构存成一个文档,文档结构既树型结构,简明易懂。

  • 优点:简明易懂
  • 缺点:文档会越来越大,对所有结点的修改都集中到这一个文档中,并发操作受限

D.文档型数据库设计模式2

{"_id": "A", "children": ["B", "C"]}
{"_id": "B", "children": ["D"]}
{"_id": "C"}
{"_id": "D"}

将每个结点的所有子结点存起来

  • 优点:结构简单,查找子结点方便
  • 缺点:查找父结点会比较麻烦

E.文档型数据库设计模式3

{"leaf": "A","children": [{"leaf": "B", "children": [{"leaf": "D"}] },{"leaf": "C"}]
}
{"_id": "A", ...}
{"_id": "B", ...}
{"_id": "C", ...}
{"_id": "D", ...}

充分利用文档型存储schema-less的优点,先利用上面C方案存存储一个大的树形文档,再将每一个结点的其他信息单独存储。

  • 优点:操作方便,结构上的操作可以直接操作大的树形文档,数据上的操作也只需要操作单条数据
  • 缺点:对所有结点的修改都集中到这一个文档中,并发操作受限

英文原文链接:Modeling a Tree in a Document Database

[ mongoDB ] - 文档型数据库设计模式-如何存储树形数据 [转]相关推荐

  1. 文档型数据库设计模式-如何存储树形数据

    在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系.在传统的关系型数据库中,就已经产生了各种解决方案. 此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型 ...

  2. mongodb单表最大记录数_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...

    ​一.MongoDB简介以及使用场景 MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富, ...

  3. spring cloud alibaba微服务原理与实战_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...

    ​一.MongoDB简介以及使用场景 MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富, ...

  4. 悉数11种主流NoSQL文档型数据库

    悉数11种主流NoSQL文档型数据库 文档型数据库是NoSQL中非常重要的一个分支,它主要用来存储.索引并管理面向文档的数据或者类似的半结构化数据.顾名思义,文档型数据库(面向文档数据库)的关键核心概 ...

  5. 关系型数据库到文档型数据库的跨越

    1. 简介 在文档型NoSQL数据库出现之前,许多开发者一直绞尽脑汁思考,希望能想出更好的处理关系型数据库技术的方法,如今他们可能要跳出那种思维而另辟蹊径.本文将介绍关系型数据库和分布式文档型数据库的 ...

  6. 文档型数据库列一般都是弱项

    文档型数据库一般都是以行为基础得,添加更新删除等操作,因为文档型数据的一般存储结构都是键值对.所以对列的概念很弱,比如有一些文档数据库,是无法对单列操作的,有时候想修改一列的值,只能所有数据全部重新添 ...

  7. 非关系型数据库 之 文档型数据库 MongoDB 的使用(Python3)

    文章目录 1.MongoDB 简介 1.1.简述 1.2.应用场景 1.3.优点 1.4.缺点 2.CentOS 操作 MongoDB 2.1.安装启动 2.1.1.下载安装 2.1.2.后台启动 2 ...

  8. 文档型数据库mongodb介绍2-副本集

    一. 副本集介绍 之前的文章介绍了 mongodb主从 mongodb提供了另外一种 基于副本集的集群 该方式 是一主一从的升级版  一主多从, 仍然是主节点负责写入 从节点定时同步主节点数据 使用该 ...

  9. MongoDB小型文档型数据库使用

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中 ...

  10. 文档型非关系数据库MongoDB经验总结

    文档型非关系数据库MongoDB 数据库基础概念 数据:能够输入到计算机中并被识别处理的信息集合 数据结构:研究一个数据集合中,数据元素关系 数据库:按照数据结构,存储管理数据的仓库.数据仓库是在数据 ...

最新文章

  1. LeetCode 206 Reverse Linked List--反转链表--迭代与递归解法--递归使用一个临时变量,迭代使用3个
  2. Unidesk, Citrix 桌面虚拟化方案之新神器
  3. 【Intellij Idea】设置JDK
  4. C++ 学习之旅(11)——类和结构中的static
  5. 具有Couchbase,Java EE和WildFly的CRUD Java应用程序
  6. JobDataMap传递参数_02
  7. 虚拟服务器关机返回用户信息,在Linux服务器关机前向用户显示一条自定义消息...
  8. 验证内容是否为空的多种办法 1210 c#
  9. Python代码转换为exe可执行程序详解
  10. python的实例类方法、修饰器类方法、修饰器保护方法、修饰器静态方法中私有属性的区别和自定义property的读写方法
  11. 觉得自己目前还很菜。
  12. Kafka日志刷新策略
  13. 整理与随笔——抽象代数 第一章 群 1.1-1.2 代数体系、半群与群
  14. 软件测试视频课网盘,软件测试工程师必学视频教学全套五合一
  15. Ubuntu 安装 bashtop 资源监视器
  16. 计算机专业建设会议纪要,智能控制教研室会议纪要6号
  17. Java输入小数和整数求COSx_嗖嗖移动大厅 源代码 Java初级小项目
  18. 解决:java.sql.SQLException: Access denied for user ‘‘@‘localhost‘ (using password: YES)
  19. 固态硬盘运行服务器,固态硬盘(SSD)在服务器中的工作原理是什么
  20. ▲ Android 签到打卡效果

热门文章

  1. 私有5g网络_面向企业的私有5G网络
  2. java 易错题_java错题集(1-3)
  3. python爬虫案例_Python“豆瓣电影TOP250爬虫案例”详解
  4. frdora10_a8_linux,硬盘安装fedora10
  5. 中位数±四分位数表达_Python数据分析:强大字符串处理工具,正则表达式
  6. L3-001 凑零钱 (30 分)—团体程序设计天梯赛
  7. ruby,gem,rails之间的关系
  8. MySQL MGR实现分析 - 成员管理与故障恢复实现
  9. 虚拟机vmware vmnet8 未识别(转)
  10. Android获取状态栏和标题栏的高度