1. 程式人生 > >資料庫設計 採用左右值編碼來儲存無限分級樹形結構_2 預排序遍歷樹演算法(modified preorder tree traversal algorithm )

資料庫設計 採用左右值編碼來儲存無限分級樹形結構_2 預排序遍歷樹演算法(modified preorder tree traversal algorithm )

預排序遍歷樹演算法


更新操作:先講述筆者那時候的思路

筆者最初的方法是:偽刪除後偽插入

先更新該節點為整個樹以外的節點左右值資料(筆者稱之偽刪除)

再更新該節點為整個樹左右值資料(筆者稱之偽插入)

但是很快筆者就發現這樣思路是有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;