数据库设计 采用左右值编码来存储无限分级树形结构_2 预排序遍历树算法(modified preorder tree traversal algorithm )

本文介绍了在数据库设计中,如何利用预排序遍历树算法(modified preorder tree traversal algorithm)处理无限分级树形结构的更新问题。通过临时表避免了直接更新导致的BUG,详细步骤包括:判断文件夹移动、清空临时表、拷贝数据、删除旧结构、更新节点位置、拷贝回主表及清理临时表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预排序遍历树算法



更新操作:先讲述笔者那时候的思路

笔者最初的方法是:伪删除后伪插入

先更新该节点为整个树以外的节点左右值数据(笔者称之伪删除)

再更新该节点为整个树左右值数据(笔者称之伪插入)

但是很快笔者就发现这样思路是有BUG的。

前一步修改的数据可能会进入下一步的更新条件判断里。


笔者觉得是顺序的问题,换了顺序

先更新该节点为整个树左右值数据

再更新该节点为整个树以外的节点左右值数据

然而还是一样的BUG,前一步修改的数据可能会进入下一步的更新条件判断里。


这个问题就是更新该节点为整个树如何与除此以外的数据分割开?

笔者同事提供的思路是:临时表。

就如 两变量交换,temp= a;a=b;b=temp;思路一样,就是要找一个空的杯子存在临时的数据。

临时表是一种解决的办法:

DROP TABLE IF EXISTS T_DIR_TEMP;
CREATE TABLE T_DIR_TEMP(
ID  VARCHAR(32) NOT NULL UNIQUE,
V_NAME VARCHAR(50) NOT NULL UNIQUE,
V_PID VARCHAR(32),
N_LEFT BIGINT NOT NULL,
N_RIGHT BIGINT NOT NULL
);

0)  先判断文件夹是否有移动,即父目录是否与原先一致

1)清空临时表,确保里面没有数据影响操作。

DELETE FROM T_DIR_TEMP;

2)  获取该结点的左右值

临时变量temp_left=该节点的左值;      

临时变量temp_right=该节点的右值;

临时变量temp_num= temp_right-temp_left+1       

3)  拷贝数据到临时表

INSERT INTO T_DIR_TEMP
  SELECT *
    FROM T_DIR D
    WHERE D.N_LEFT >= temp_left
      AND D.N_RIGHT <= temp_right;

4)删除该节点为根整个树

DELETE FROM T_ARCHIVE_DIRECTORY
WHERE N_LEFT >= temp_left
    AND N_RIGHT <= temp_right;

5)更新临时表数据信息

临时变量temp_p_right =SELECT N_RIGHT FROM T_DIR WHERE ID = pid;

临时变量temp_sub= 新父目录的右值temp_p_right-  该节点的右值temp_right

UPDATE T_ARCHIVE_DIRECTORY_TEMP
   SET N_LEFT = N_LEFT - temp_sub,N_RIGHT = N_RIGHT -temp_sub
  WHERE N_LEFT >= temp_left
   AND N_RIGHT <= temp_right;

6) 拷贝临时表里数据到目录表 

INSERT INTOT_DIR
  SELECT *
    FROM T_DIR_TEMP

7)清空临时表

DELETE FROM T_DIR_TEMP;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值