【推荐】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_?中问号的值。
同样新增和删除也只要通过几条条语句分别操作两个表就能完成。
这种方式的缺点是如果树状层级每增加一层,就需要在第二表中新增一列,这需要额外的权限。
来源:oschina
链接:https://my.oschina.net/u/1382972/blog/225211