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

请注意:java

一、因为是经常使用结构,因此也许早已经有相似的解决方法了。数据库

二、本人数据库接触还少,如下表述可能有错误的地方,并且如下方法也没通过实际运行,仅供参考。网络

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


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

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

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

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


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

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

好比树状结构:

    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_?中问号的值。


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


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

相关文章
相关标签/搜索