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

请注意:

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

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

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


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

191923_u27B_1382972.png

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

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

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


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

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

比如树状结构:

    a
 b     c
d e   f g

则两个表的结构如下:

表1

   id      level    
a1
b2
c2
d3
e3
f3
g3

表2

  level_1    level_2     level_3      ...   
a


ab

ac

abd
abe
acf
acg

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

SELECT level FROM 表1 WHERE id='a'


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

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

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


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


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


转载于:https://my.oschina.net/u/1382972/blog/225211

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值