树状结构在关系型数据库中一种存储方式

夙愿已清 提交于 2019-12-23 13:39:01

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

请注意:

1、由于是常用结构,所以也许早已经有类似的解决方法了。

2、本人数据库接触还少,以下表述可能有错误的地方,而且以下方法也没经过实际运行,仅供参考。

3、本文是为了回答提问版中的一个问题:http://www.oschina.net/question/268888_152060


树状结构是比较普遍使用的数据结构,比如公司部门组成。更典型的应该是传销成员的结构,每名会员发展下线,下线再发展下线。。。

由于关系型数据库的本质是表格结构,与树状结构相差较大,树状结构如何在关系型数据库中保存,且能快速查询、修改节点、统计一个节点有多少个子节点,与在内存中保存树状结构比起来比较纠结。

内存中可以用地址引用加递归来实现,CPU执行速度也很快,所以Z增删改查起来速度基本还可以接受。

但关系型数据库,SQL递归比较纠结,如果把程序写到数据库的存储过程中还好,如果通过网络连接进行SQL递归查询,速度估计难以接受。


我想到的方法是建两张表,第一张表中有id和level两个字段,分别表示节点的id,和该节点在树状结构的层级

第二张表中建level_1、level_2、level_3等字段,树状结构每多一层,则多加一列,每列保存相应层级的数据。

比如树状结构:

    a
 b     c
d e   f g

则两个表的结构如下:

表1

   id       level    
a 1
b 2
c 2
d 3
e 3
f 3
g 3

表2

  level_1     level_2      level_3       ...   
a


a b

a c

a b d
a b e
a c f
a c g

这时查询节点a有多少子节点时,就可以使用如下语句进行:

SELECT level FROM 表1 WHERE id='a'


然后比如获得的结果为1,那再进行以下查询

SELECT count(*) AS N FROM 表1 WHERE level_1='a'

那就可以获得a的子节点数为N-1,也就是6。这条语句需要程序在运行时生成,动态修改level_?中问号的值。


同样新增和删除也只要通过几条条语句分别操作两个表就能完成。


这种方式的缺点是如果树状层级每增加一层,就需要在第二表中新增一列,这需要额外的权限。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!