在数据库中存储树形结构的数据,这是一个非常普遍的需求,典型的比如论坛系统的版块关系。在传统的关系型数据库中,就已经产生了各种解决方案。
此文以存储树形结构数据为需求,分别描述了利用关系型数据库和文档型数据库作为存储的几种设计模式。
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方案存存储一个大的树形文档,再将每一个结点的其他信息单独存储。
- 优点:操作方便,结构上的操作可以直接操作大的树形文档,数据上的操作也只需要操作单条数据
- 缺点:对所有结点的修改都集中到这一个文档中,并发操作受限
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
升级到SQL Server 2016 你需要知道的那些事儿
升级到SQL Server 2016之前,应该检查硬件和软件要求和支持的升级路径,以帮助确保您的数据库部署的顺利进行。
-
SQL Server 2016关系型数据库概览
微软公司的SQL Server 2016提供了新的存储格式,实现了行级数据安全和Transact-SQL针对内存优化表的改进。
-
TT百科:SQL(结构化查询语言)
一般来说,SQL-on-Hadoop仍是一项新兴技术,但随着各个公司寻求获得拥有大数据应用程序编程SQL技能的开发和分析人员,它们正逐渐成为Hadoop部署的固定组件。
-
SQL Server 与 MySQL:关系型数据库领域的“绝代双骄”
SQL服务器和MySQL是当下市场上两个最流行的关系数据库管理系统。虽然它们并没有明显的差距,但在某些情况下,使用微软的RDBMS可能是比使用甲骨文的MySQL更好的选择。