掌桥专利:专业的专利平台
掌桥专利
首页

一种新型树状数据的编码方法

文献发布时间:2023-06-19 19:00:17


一种新型树状数据的编码方法

技术领域

本发明属于计算机应用技术领域,尤其是涉及一种新型树状数据的编码方法。

背景技术

数据库设计树状结构时,都是通过节点记录直接父节点的方法,最终形成树状数据结构。基于这种树状数据结构,在数据库的各项操作过程中,都存在会比较麻烦而且效率非常低的情况。如:要检索或统计某一节点下的所有子节点,有以下几种方法:

第一种方法:先通过 parent_id 查询出所有子节点,然后依次查询子节点下所有下级节点。依次循环。

第二种方法是:通过定义存储过程,利用游标的下移查找所有节点。

第三种方法是:在标准的树形数据结构表的基础上增加一个 path 字段,该 path字段记录每个节点的路径。当执行数据查询时,根据所要查询的节点的 path 字段来匹配节点,查到该节点下所有节点。参见CN103853773A-一种Mysql数据库下树形数据结构的检索方法。

第四种方法是:在标准的树形数据结构表的基础上增加一个parents_ids字段,存储包括所有父节点的信息,每一父节点的信息通过特殊字符区分。参见CN104063413A-一种Mysql数据库树状结构及其快速检索方法。

以上几种做法均有缺陷,第 1 种方法不能够一次性取出目标数据,需要多次访问数据库,效率极低;第 2 种方法可读性差、难以维护、可移植能力差。第3种和第4种方法大大提高了检索效率,但是没有解决树形结构数据调整父节点后,其级联子节点的path和parents_ids的变化问题,并且由此问题还会影响级联查询和统计结果的正确性。

发明内容

针对上述问题,本发明提出了一种新型树状数据的编码方法,便于在对数据库进行节点新增、父节点修改、节点删除、子节点的查询和统计等操作时,提高数据库的操作效率。

为实现上述目的,本发明公开了一种新型树状数据的编码方法,包括:

设置树状数据的数据存储结构,包括字段:当前节点id、名称、节点层级、父节点id、编码和修改前的节点层级;

设置树状数据中位于第一层级的节点的所述编码为固定编码0,所述层级为1;

树状数据中,从第二层级开始,节点的层级=父节点层级+1,所述编码包括相拼接的编码前缀和临时编码,所述编码前缀为父节点编码,所述临时编码为从0001开始生成的一个四位数;

若拼接编码前缀和临时编码得到的编码不存在于现有编码列表中,则可作为该节点的编码;

将该节点的编码存入该节点的编码字段。

作为本发明的进一步改进,若拼接编码前缀和临时编码得到的编码存在于现有编码列表中,则将所述临时编码递增加1,得到新的临时编码;

拼接编码前缀和新的临时编码,再次判断是否存在于现有编码列表中,直至得到一个现有编码列表中不存在的编码,作为该节点的编码。

作为本发明的进一步改进,树状数据中新增节点时,新增节点的编码和层级生成过程包括:

查询已有的编码列表;

在所述编码列表中根据新增节点的父节点id查询父节点的编码和层级;

从0001开始生成一个四位数作为临时编码,拼接父节点的编码和临时编码得到完整编码;

判断该完整编码是否存在于现有编码列表中,若不存在,则将该完整编码作为该新增节点的编码;

若存在,则循环执行将临时编码递增加1、与父节点编码拼接得到完整编码、判断完整编码是否存在于现有编码列表,直至拼接得到的完整编码不存在于现有编码列表中,将得到的完整编码作为该新增节点的编码;

将父节点的层级加1得到该新增节点的层级。

作为本发明的进一步改进,在树状数据中对节点的父节点进行修改时,节点的编码和层级修改包括步骤:

查询已有的编码列表;

根据节点修改后的父节点id查询该父节点的编码和层级;

从0001开始生成一个四位数作为临时编码,拼接该父节点的编码和临时编码得到完整编码;

判断该完整编码是否存在于现有编码列表中,若不存在,则将该完整编码作为该节点的编码;

若存在,则循环执行将临时编码递增加1、与父节点编码拼接得到完整编码、判断完整编码是否存在于现有编码列表,直至拼接得到的完整编码不存在于现有编码列表中,将得到的完整编码作为该新增节点的编码;

将节点原来的层级赋予所述修改前的节点层级这一字段;

将父节点的层级加1得到节点现在的层级。

作为本发明的进一步改进,在树状数据中对节点的父节点进行修改后,还需修改节点的所有级联子节点的层级,包括步骤:

设置d_value=修改前的节点层级-层级;

计算节点的d_value值,若d_value=0,则节点在父节点修改前后的层级一致,节点的所有级联子节点的层级无需修改;

若d_value¹0,则节点在父节点修改前后的层级发生变化,对节点的所有级联子节点的层级均需进行修改,包括将各级联子节点原来的层级赋予所述修改前的节点层级这一字段,各级联子节点的层级=修改前的节点层级-d_value。

作为本发明的进一步改进,在树状数据中对节点的父节点进行修改后,还需修改节点的所有级联子节点的编码,包括步骤:

根据修改父节点前节点的编码作为前缀获取节点的所有级联子节点,形成级联子节点列表;

将修改父节点后得到的节点的编码作为新前缀;

根据节点的所述修改前的节点层级计算级联子节点的编码需截掉的位数;

遍历所述级联子节点列表,根据需截掉的位数对各级联子节点由级联子节点的编码前端对编码进行截断;

将级联子节点的编码阶段后的剩余部分与所述新前缀进行拼接,得到级联子节点的新的编码。

作为本发明的进一步改进,根据节点的所述修改前的节点层级计算级联子节点的编码需截掉的位数,包括:

节点的所述修改前的节点层级为n,则级联子节点的编码需截掉的位数计算公式为:

x=1+(n-1)*4;

其中,

1表示第一层级的固定编码0所占的位数;

n-1表示去除第一层级外的剩余层级数;

4表示去除第一层级外每层级增加的编码位数。

作为本发明的进一步改进,在树状数据中删除任一节点时,还需删除该节点的所有级联子节点,包括步骤:

在已有编码列表中以该节点的编码为前缀查询该节点的所有级联子节点,形成级联子节点的id列表;

遍历级联子节点的id列表,逐个删除该节点的级联子节点。

作为本发明的进一步改进,可通过节点的编码查询节点的所有级联子节点和指定层级的级联子节点;

查询节点的所有级联子节点,包括:

在已有编码列表中,以该节点的编码为前缀查询该节点的所有级联子节点,形成所有级联子节点数据列表;

查询节点的指定层级的级联子节点,包括:

在已有编码列表中,查询以该节点的编码为前缀且层级等于指定层级的级联子节点,形成指定层级级联子节点数据列表。

作为本发明的进一步改进,可通过节点的编码统计节点的所有级联子节点的数量及指定层级的级联子节点的数量,包括:

统计节点的所有级联子节点的数量,包括:

在已有编码列表中,以该节点的编码为前缀查询该节点的所有级联子节点,统计所有级联子节点的数量;

统计节点的指定层级的级联子节点的数量,包括:

在已有编码列表中,查询以该节点的编码为前缀且层级等于指定层级的级联子节点,统计指定层级的级联子节点的数量。

与现有技术相比,本发明的有益效果为:

本发明提供了一种树状数据的编码方法,通过设置节点的编码与父节点编码的关系,设置节点层级与父节点层级的关系,可动态生成树状数据中节点的编码及层级,也便于通过该编码对数据库中树状数据的各项操作,提高操作效率。

本发明的编码方法支持修改父级节点,对本节点及本节点的级联子节点根据指定的父节点重新编码,实现修改父节点后数据级联查询和分层级统计的正确性,便于进行级联删除、检索和统计,增强 sql 语句的可读性、维护性、可移植能力。

本发明在修改当前节点的父节点时,可动态调整当前节点和级联子节点的编码和层级,在新增节点时,可动态生成新增节点的编码和层级,在删除节点时,可动态删除该节点及该节点的所有级联子节点,各操作均动态完成,操作可靠且效率高。

本发明在对某节点下的所有级联子节点进行检索或统计时,可也动态完成,且可直接查询或统计节点下指定层级的级联子节点,操作简单、准确性到、操作效率高。

附图说明

图1为本发明一种实施例公开的新型树状数据的编码方法流程图;

图2为本发明一种实施例公开的基于新型树状数据的编码方法在新增节点时,生成新增节点编码和层级的流程图;

图3为本发明一种实施例公开的基于新型树状数据的编码方法在修改节点的父节点时,生成节点的编码和层级的流程图;

图4为本发明一种实施例公开的基于新型树状数据的编码方法在修改节点的父节点时,修改节点的级联子节点的编码和层级的流程图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。

下面结合附图对本发明做进一步的详细描述:

如图1所示,本发明公开的一种新型树状数据的编码方法,包括:

S1、设置树状数据的数据存储结构,包括字段:当前节点id、名称、节点层级、父节点id、编码和修改前的节点层级;

其中,数据存储结构如表1所示:

表1

具体的,

id字段存储当前节点的id;

parent_id字段存储当前节点的父节点的id;

level字段存储当前节点的层级,等于父节点的层级加1;

his_level存储当前节点修改父节点前的层级;

code存储当前节点的编码;

name存储节点名称。

S2、设置树状数据中位于第一层级的节点的编码为固定编码0,层级为1,即:level=1;

S3、树状数据中,从第二层级开始,节点的层级=父节点层级+1,编码包括相拼接的编码前缀和临时编码,编码前缀为父节点编码,临时编码为从0001开始生成的一个四位数;

S4、若拼接编码前缀和临时编码得到的编码不存在于现有编码列表中,则可作为该节点的编码;

其中,

拼接编码前缀和临时编码得到的编码时,编码前缀和临时编码直接首尾拼接即可,即:

code=编码前缀+临时编码;

进一步的,

若拼接编码前缀和临时编码得到的编码存在于现有编码列表中,则将临时编码递增加1,得到新的临时编码;

拼接编码前缀和新的临时编码,再次判断是否存在于现有编码列表中,直至得到一个现有编码列表中不存在的编码,作为该节点的编码。

S5、将该节点的编码存入该节点的编码字段。

应用本发明的树状数据编码方法的数据库,在对数据库进行各项操作时,操作简单快捷、可靠,具体包括:

(1)如图2所示,树状数据中新增节点时,新增节点的编码和层级生成过程包括:

查询已有的编码列表;

在编码列表中根据新增节点的父节点id查询父节点的编码和层级;

从0001开始生成一个四位数作为临时编码,拼接父节点的编码和临时编码得到完整编码;

判断该完整编码是否存在于现有编码列表中,若不存在,则将该完整编码作为该新增节点的编码;

若存在,则循环执行将临时编码递增加1、与父节点编码拼接得到完整编码、判断完整编码是否存在于现有编码列表,直至拼接得到的完整编码不存在于现有编码列表中,将得到的完整编码作为该新增节点的编码;

将父节点的层级加1得到该新增节点的层级;

最后,令新增节点的修改前的节点层级等于新增节点的层级,即:his_level=level。

(2)在树状数据中对节点的父节点进行修改时,包括三步:

第一步,如图3所示,修改节点的编码和层级,其中,节点的level和his_level满足关系:his_level=当前节点的level、level=父节点level+1,节点的编码和层级修改包括步骤:

查询已有的编码列表;

根据节点修改后的父节点id查询该父节点的编码和层级;

从0001开始生成一个四位数作为临时编码,拼接该父节点的编码和临时编码得到完整编码;

判断该完整编码是否存在于现有编码列表中,若不存在,则将该完整编码作为该节点的编码;

若存在,则循环执行将临时编码递增加1、与父节点编码拼接得到完整编码、判断完整编码是否存在于现有编码列表,直至拼接得到的完整编码不存在于现有编码列表中,将得到的完整编码作为该新增节点的编码;

将节点原来的层级赋予修改前的节点层级这一字段;

将父节点的层级加1得到节点现在的层级。

第二步,如图4所示,在树状数据中对节点的父节点进行修改后,还需修改节点的所有级联子节点的层级,包括步骤:

设置d_value=修改前的节点层级-层级;

计算节点的d_value值,若d_value=0,则节点在父节点修改前后的层级一致,节点的所有级联子节点的层级无需修改;

若d_value¹0,则节点在父节点修改前后的层级发生变化,对节点的所有级联子节点的层级均需进行修改,包括:

1)将各级联子节点原来的层级赋予修改前的节点层级这一字段,即:his_level=level

2)各级联子节点的层级=修改前的节点层级-d_value,即:level=his_level-d_value。

第三步、如图4所示,在树状数据中对节点的父节点进行修改后,还需修改节点的所有级联子节点的编码,包括步骤:

根据修改父节点前节点的编码作为前缀获取节点的所有级联子节点,形成级联子节点列表;

将修改父节点后得到的节点的编码作为新前缀;

根据节点的修改前的节点层级计算级联子节点的编码需截掉的位数;

遍历级联子节点列表,根据需截掉的位数对各级联子节点由级联子节点的编码前端对编码进行截断;

将级联子节点的编码阶段后的剩余部分与新前缀进行拼接,得到级联子节点的新的编码。

其中,

根据节点的修改前的节点层级计算级联子节点的编码需截掉的位数,包括:

设节点的修改前的节点层级为n,则级联子节点的编码需截掉的位数计算公式为:

x=1+(n-1)*4;

其中,

1表示第一层级的固定编码0所占的位数;

n-1表示去除第一层级外的剩余层级数;

4表示去除第一层级外每层级增加的编码位数。

(3)在树状数据中删除任一节点时,还需删除该节点的所有级联子节点,包括步骤:

在已有编码列表中以该节点的编码为前缀查询该节点的所有级联子节点,形成级联子节点的id列表;

遍历级联子节点的id列表,逐个删除该节点的级联子节点。

(4)可通过节点的编码查询节点的所有级联子节点和指定层级的级联子节点;

查询节点的所有级联子节点,包括:

在已有编码列表中,以该节点的编码为前缀查询该节点的所有级联子节点,形成所有级联子节点数据列表;

查询节点的指定层级的级联子节点,包括:

在已有编码列表中,查询以该节点的编码为前缀且层级等于指定层级的级联子节点,形成指定层级级联子节点数据列表。

(5)可通过节点的编码统计节点的所有级联子节点的数量及指定层级的级联子节点的数量,包括:

统计节点的所有级联子节点的数量,包括:

在已有编码列表中,以该节点的编码为前缀查询该节点的所有级联子节点,统计所有级联子节点的数量;

统计节点的指定层级的级联子节点的数量,包括:

在已有编码列表中,查询以该节点的编码为前缀且层级等于指定层级的级联子节点,统计指定层级的级联子节点的数量。

实施例:

以在树状数据中新增节点为例,指定新增节点的父节点id为16,新增节点的编码和层级生成过程包括:

步骤1、查询已有的编码列表;

步骤2、在编码列表中根据新增节点的父节点id(16)查询得到父节点的编码为00015,层级为2;

步骤3、从0001开始生成一个四位数作为临时编码,得到临时编码0036,拼接父节点的编码和临时编码得到完整编码,完整编码为000150036;

步骤4、判断该完整编码是否存在于现有编码列表中,结果为存在;

步骤5、将临时编码递增加1,得到临时编码0037,与父节点编码拼接得到完整编码为000150037,

步骤6、判断新得到的完整编码是否存在于现有编码列表,结果为不存在,将得到的新的完整编码000150037作为该新增节点的编码;

步骤7、将父节点的层级加1得到该新增节点的层级,即新增节点的层级:level=2+1=3;

步骤8、令新增节点的修改前的节点层级等于新增节点的层级,即:his_level=level=3。

本发明的优点:

本发明提供了一种树状数据的编码方法,通过设置节点的编码与父节点编码的关系,设置节点层级与父节点层级的关系,可动态生成树状数据中节点的编码及层级,也便于通过该编码对数据库中树状数据的各项操作,提高操作效率。

本发明的编码方法支持修改父级节点,对本节点及本节点的级联子节点根据指定的父节点重新编码,实现修改父节点后数据级联查询和分层级统计的正确性,便于进行级联删除、检索和统计,增强 sql 语句的可读性、维护性、可移植能力。

本发明在修改当前节点的父节点时,可动态调整当前节点和级联子节点的编码和层级,在新增节点时,可动态生成新增节点的编码和层级,在删除节点时,可动态删除该节点及该节点的所有级联子节点,各操作均动态完成,操作可靠且效率高。

本发明在对某节点下的所有级联子节点进行检索或统计时,可也动态完成,且可直接查询或统计节点下指定层级的级联子节点,操作简单、准确性到、操作效率高。

以上仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

技术分类

06120115759566