一种实现快速查询树形结构数据指定节点下级的方法与流程

文档序号:12734018阅读:5022来源:国知局
一种实现快速查询树形结构数据指定节点下级的方法与流程

本发明属于数据处理技术领域,具体涉及一种实现快速查询树形结构数据指定节点下级的方法。



背景技术:

业务系统中,经常会遇到树状结构数据,如组织机构树、产品分类等,这种树形结构数据在数据表中存储时,通常会将每个节点作为一条记录存储,每条记录通常包括节点ID、节点名称、上级节点ID等字段,需要查询某个节点的所有下级节点时,通常会采用递归查询的方式,然而当节点数较多,树层级较深时,递归查询性能会非常的差;采用构建、存储每个节点的所有上级节点ID全路径的方式,虽能够快速查询出指定节点的所有下级节点解决递归查询性能差的问题,但要依赖高级程序来维护路径中的字符串,并且验证字符串的正确性的开销很大,字符串的长度很难确定,无论字符串的长度设为多大,都存在不能够无限扩展的情况。



技术实现要素:

本发明的目的在于,针对上述递归查询性能差,存储路径方式需要高级程序维护字符串及字符串长度难确定的缺陷,提供一种实现快速查询树形结构数据指定节点下级的方法,以解决上述技术问题。

为实现上述目的,本发明给出以下技术方案:

一种实现快速查询树形结构数据指定节点下级的方法, 包括如下步骤:

S1.将树形结构数据以深度优先遍历法中的先序遍历顺序存储到一张关系型数据库表中,数据库表字段包括序列号、节点ID和深度等级,节点ID是主键,每个节点ID取不同的值;

S2.输入指定节点ID,判断出要查询的该指定节点ID的所有下级节点ID,步骤如下:

S21.设定要查询的指定节点ID对应的序列号为N,对应的深度等级为L;

S22.设定要查询的所有下级节点ID对应的序列号范围为N1-N2,沿着序列号N升序的方向在数据库表中查询深度等级,设定为L′;

当L′≤L时,查询停止,L′对应的序列号设定为N′,N<N1,N2< N′;

若查询到结束,L′始终大于L,则数据库表最后一行的序列号设定为N′,N<N1,N2≤ N′;

N1和N2之间的所有序列号对应的节点ID为要查询的节点ID。

进一步地,步骤S1所述的深度优先遍历法是沿着树的深度遍历树的节点,尽可能深的搜索树的分支,每个节点只访问一次;先序遍历顺序是对任一子树,先访问根,其次遍历其左子树,最后遍历其右子树。

进一步地,步骤S1中的关系型数据库表中还包括节点名称、上级节点ID。

进一步地,步骤S1中节点ID值长度相等。

进一步地,增加节点时,在数据库表格中增加对应的行,从增加的节点往下的所有节点对应序列号+1, 增加的节点有下级子节点时, 同时所有子节点的深度等级+1;删除节点时,在数据库表格中删除对应的行,从删除的节点往下的所有节点对应序列号-1,删除的节点有下级子节点时, 同时所有子节点的深度等级-1。

进一步地,变更节点上下级关系时,在数据库表格中按先删除后增加的方式变更序列号和深度等级。

进一步地,步骤S2中指定节点的所有下级节点的查询采用SQL语句。

本发明的有益效果在于:本发明是树形结构数据快速查询某个节点的所有下级节点的一种解决方案,是传统递归查询和路径存储方式的一种有效替代方案,尤其在树节点数较多,层级较深时,优势更加明显,而且解决路径存储方式需要高级程序维护字符串及字符串长度难确定的缺陷,能很好的应用于组织机构树、产品分类树等实际业务场景中。

此外,本发明设计原理可靠,结构简单,具有非常广泛的应用前景。

由此可见,本发明与现有技术相比,具有突出的实质性特点和显著的进步,其实施的有益效果也是显而易见的。

附图说明

图1为实施例1树形结构图;

图2为实施例1树形结构存储到关系型数据库表格中的图;

图3为实施例2增加节点时的树形结构图;

图4为实施例2增加节点时的关系型数据库表格的变化示意图;

图5为实施例3变更节点关系时的树形结构图;

图6为实施例3变更节点关系时的关系型数据库表格的变化示意图。

具体实施方式:

为使得本发明的目的、特征、优点能够更加的明显和易懂,下面将结合本发明具体实施例中的附图,对本发明中的技术方案进行清楚、完整地描述。

本发明提供一种实现快速查询树形结构数据指定节点下级的方法,实施例1如图1和图2所示,包括如下步骤:

S1.将图1所示的树形结构数据以深度优先遍历法中的先序遍历顺序存储到图2所示关系型数据库表中,数据表字段包括序列号、节点ID和深度等级,节点ID是主键,每个节点ID取不同的值; 深度优先遍历法中的先序遍历顺序为从根节点root依次到节点n0001,n0003,n0004,n0002,n0005,n0006;

如要查询n0001的所有下级节点,查询可采用SQL语句,

S2.要查询节点n0001的所有下级节点, 判断出节点n0001的所有下级节点ID, 步骤如下:

S21.查到n0001对应的序列号N为2, 对应的深度等级L为2;

S22.设定要查询的所有下级节点ID对应的序列号范围为N1-N2,沿着序列号2升序的方向在数据库表中查询深度等级,设定为L′;

当L′=2时,查询停止,L′对应的序列号N′=5,2<N1,N2< 5;

2和5之间的所有序列号对节点ID为要查询的节点ID,即序列号3对应的n0003和序列号4对应的n0004为要查询的节点ID。

若要查询n0002的所有下级节点,查询可采用SQL语句,

S2.要查询节点n0002的所有下级节点, 判断出节点n0002的所有下级节点ID, 步骤如下:

S21.查到n0002对应的序列号N为5, 对应的深度等级L为2;

S22.设定要查询的所有下级节点ID对应的序列号范围为N1-N2,沿着序列号5升序的方向在数据库表中查询深度等级,设定为L′;

查询到结束,L′始终大于2,则数据库表最后一行的序列号7设定为N′,5<N1,N2≤ 7;

5和7之间的所有序列号对节点ID为要查询的节点ID,即序列号6对应的n0005和序列号7对应的n0006为要查询的节点ID。

实施例2如图3和图4所示,增加节点n0008,n0008增加的位置在节点n0003和n004之间,在数据库表格中增加对应的行,从增加节点n0008往下的所有节点对应序列号+1。

实施例3如图5和图6所示,变更节点上下级关系时,按先删除后增加的方式变更序列号和深度等级,将n0001的下级节点n0004变更成n0001的上级节点,如图5所示,在数据库表格中按先删除n0001的子节点n0004,再增加n0001的上级节点n0004的方式变更序列号和深度等级,具体如图6所示:

删除节点n0004,n0004删除的位置在节点n0003之后,在数据库表格中删除对应的行,从删除的节点n0004往下的所有节点对应序列号-1;

再增加节点n0004,n0004增加的位置在根节点root和n0001之间,在数据库表格中增加对应的行,从增加的节点n0004往下的所有节点对应序列号+1,增加的节点n0004有下级子节点n0001,n0003, 同时n0001,n0003的深度等级+1。

本发明的实施例是说明性的,而非限定性的,上述实施例只是帮助理解本发明,因此本发明不限于具体实施方式中所述的实施例,凡是由本领域技术人员根据本发明的技术方案得出的其他的具体实施方式,同样属于本发明保护的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1