資料庫設計 採用左右值編碼來儲存無限分級樹形結構_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;