树型数据在关系数据库中的存储方式辨析

本文来自李明子csdn博客(http://blog.csdn.net/free1985),商业转载请联系博主获得授权,非商业转载请注明出处!

1 前言

本文成文于2014年2月,背景是TiEAF(基础业务平台)设计之初“模型树”的存储方式选型。笔者在文中对关系数据库中常用的树型结构的存储方式进行了描述和辨析。现将其整理发表以供读者参考。

2 存储方式

树型数据数据在关系数据库中的常用存储方式主要分有双亲表方式、层次表方式、先根遍历树表方式、扩展的线索二叉树表方式等四种。另外,还有双亲与层次表结合方式、带有层号的先根遍历树表、先根遍历层次兄弟树表方式三种变种,前一种是双亲表方式和层次表方式的结合,后两种是先根遍历树表方式的扩展。
下面将简述各种存储方式的数据库表结构及对应算法的利弊。
2.1 双亲表方式
双亲表方式是最为常见的树型数据在关系数据库中的存储方式,使用也最为广泛。该方式主要通过记录节点及该节点的父节点来维护整棵数据树的结构关系,表结构如表2-1所示。

表2-1  双亲表的结构

采用这种方式的优点在于可以方便的对树型结构中的节点进行增加、删除、修改等操作,涉及变动的记录数较少,且数据库存储开销也很小。但它的缺点也是显而易见的。例如,对于无差别子孙集合的获取需要递归;获取节点从根节点起的路径同样需要递归追溯,时间开销较大。
2.2 层次表方式
层次表方式的思路也较为简洁,通过记录节点编号和从根节点起到目标节点的路径来存储树型结构的关系,其中路径由节点编号的序列组成。该方式的表结构如表2-2所示。

表2-2  层次表的结构

表2-2只是层次表的基本结构,因为涉及到路径的编码规则,所以层次表方式在实现时有几种不同的具体形式。比如,在节点较少,编号较短的情况下节点路径可以考虑直接使用无层次差别的节点编号;在节点数较多的时候,可以考虑以层次号为基准对节点进行编号。此时一个节点的唯一编号其实由“层次号”+“该层次上的节点号”组成,需要增加“层次号”字段。当然,即使路径使用无层次差别的统一节点编号,也可以用“层次号”来标识节点深度,以便更快的查询特定深度级别的节点,如根节点。
通过以上描述可以看出,层次表结构方式有着无需递归就可以方便地实现各种常用树型结构查询的优点。但它的缺点同样十分突出。首先,对于更改树型数据层次结构的操作,尤其是更改位于数据树较高层次的节点时会引起大量记录的修改,这个时间开销十分巨大。其次,路径的表达也有一些棘手的问题。路径字段的长度设置限制了树型结构的层次深度;节点的编码方式也可能影响到每个层次上节点的最大数量。
2.3 先根遍历树表方式
先根遍历树表方式的主要思想是通过记录先根遍历中的第一次访问节点时的次序号(以下称左值)与回溯时第二次访问的次序号(以下称右值)来维护树型结构的层次关系。由先根遍历的概念可知,子节点的左值必然大于父节点左值,而右值必然小于父节点的右值。再结合排序操作就可以很容易的在不递归的情况下对树型数据进行各种查询操作。该方式的表结构如表2-3所示。

表2-3  先根遍历树表的结构

2.4 扩展的线索二叉树表方式
扩展的线索二叉树表方式是在双亲表的基础上进行的改进,主要增加了按照深度搜索顺序的节点访问序号。该方式的表结构如表2-4所示。

表2-4  扩展的线索二叉树表方式

该方式可以看做是双亲表方式和先根遍历树表方式的折中方式。
2.5 双亲与层次表结合方式
该方式使用两张表,通过触发器同步来实现双亲表与层次表两种方式的结合,这种混合方式继承了两种方式的优点和缺点。
2.6 带有层号的先根遍历树表方式
带有层号的先根遍历树表在先根遍历树表方式的基础上增加了层号字段Level。该方式的表结构如表2-5所示。

表2-5  带有层号的先根遍历树表的结构

额外记录的层号降低了查询直接(父)子节点的时间复杂度。直观上讲,获取指定节点层次号时,对于有层次号的先根遍历树可以直接从Level字段取值;对于没有层号的先根遍历树需要编写如下查询:

select count(*) + 1 as levelnum from tree t where t.left < (select m.left from tree m where m.name='C') and t.right > (select m.right from tree m where m.name='C')

2.7 先根遍历层次兄弟树表方式
先根遍历层次兄弟树表方式是先根遍历树表方式的扩展,在原有字段基础上增加了节点编号、层次深度与右兄弟节点编号三个字段。该方式的表结构如表2-6所示。

表2-6  先根遍历层次兄弟树表的结构

该方式增加了额外的空间开销来满足有序树获取右兄弟等操作。

3 总结

通过对以上各方式的辨析,我们认为第六种方式,即带有层号的先根遍历树表方式从算法角度考虑最优,能够满足一般业务系统中树型结构数据的访问操作。其时间开销与空间开销都较为出色,当然对于树型结构的修改会引起大量记录的连带修改问题无法回避。第四种方式,即扩展的线索二叉树表方式与第五种方式,即双亲与层次表结合方式这两种折中策略,在无法提供最优解的情况下反而增加了实现难度。而七种方式即先根遍历层次兄弟树表方式除在特定使用环境下并没有比第三种方式提供更多的优势。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值