[ mongoDB ] - 文档型数据库设计模式-如何存储树形数据
来源:互联网 发布:笔记本自带看图软件 编辑:程序博客网 时间:2024/05/20 17:23
在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各种解决方案。
此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型数据库作为存储的几种设计模式。
A.关系型数据库设计模式1
idnameparent_id1ANULL2B13C14D2上图表示了传统的设计方法之一,就是将树形结构的每一个结点作为关系型数据库中的一行进行存储,每一个结点保存一个其父结点的指针。
- 优点:结构简单易懂,插入修改操作都很简单
- 缺点:如果要获取某个结点的所有子结点,将是一件很恶心的事
B.关系型数据库设计模式2
idnameparent_idleftright1ANULL182B1253C1674D234上图在模式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
0 0
- [ mongoDB ] - 文档型数据库设计模式-如何存储树形数据
- 文档型数据库设计模式-如何存储树形数据
- 文档型数据库设计模式-如何存储树形数据
- 文档型数据库设计模式-如何存储树形数据
- MongoDB,无模式文档型数据库简介
- mongodb分布式文档存储数据库
- mongodb(分布式文档存储数据库)
- 分布式文档存储数据库 MongoDB
- 分布式文档存储数据库 MongoDB
- 分布式文档存储数据库 MongoDB
- MongoDB如何存储数据
- MongoDB如何存储数据
- 树形结构-树形结构的数据存储与数据库表设计
- 关系型数据库与Key-value型数据库redistribute和文档性数据库Mongodb模式设计对比
- 文档型数据库Mongodb
- mongodb文档型数据库
- [python] mongodb 存储优化 --- 文档设计
- 分布式文档存储数据库 MongoDB 简介
- 常见HTTP状态(304,200等)
- latex 花体T
- mysql事物和存储引擎以及php实现事物
- 关于JSON数据格式返回时间数据格式化问题
- 脱壳一 常见语言和编译器的EP入口地址内类型
- [ mongoDB ] - 文档型数据库设计模式-如何存储树形数据
- tr:hover变色的问题
- matlab double axes, 两个坐标轴 papa的儿子,儿子的papa
- EasyAR尝鲜系列教程之自定义Marker的实现
- HDU——1232 畅通工程
- 关于Java的Classpath详解
- 并查集(转发)
- 默默的一只小透明的编程之路---永远在开始的路上
- unicode-range字体混搭