實現目標
1,任何上級查到所有下級,包括下級的下級
2,任何下級查到所有上級,包括上級的上級
3,查詢下級或者上級,可以過濾類型
4,可以局部,快速精確的更改父子關係,包括增加,修改,刪除操作.
5,找到節點後web自動展開父級樹
6,關聯數據庫查詢方便
7,比採用左右節點等各種節點ID方式要實用, 因爲本文方法在增加節點/刪除節點時, 隻影響父子關係, 不影響其它值.
8, 此樹永遠都不需要重新生成, 只需要隨意增/刪節點, 當然前提是你的邏輯代碼沒有bug, 所有實體發生變化時都同步到樹.
理想樹的表結構(TREE_TABLE)
字段名 |
描述 |
數據類型 |
鍵 |
空 |
備註 |
TREE_ID |
樹節點流水號 |
NUMBER(10) |
Y |
N |
唯一流水編號,僅用於方便定位,更新,刪除 注意: 不要用節點流水號來做父子關係, 因爲每次生成新樹時流水號都不同, 導致業務處理非常麻煩; |
DESCRB |
樹節點描述 |
VARCHAR(64) |
|
N |
|
OBJ_ID |
實體對象id |
NUMBER(10) |
Y2 |
N |
系統對象ID |
PAR_ID |
父級對象ID |
NUMBER(10) |
Y2 |
N |
系統對象ID, 根據節點的父級爲-1 |
OBJ_TYPE |
實體對象類型 |
NUMBER(6) |
|
N |
|
PAR_TYPE |
父級對象類型 |
NUMBER(6) |
|
N |
|
CHILD_SN |
子對象序號 |
NUMBER(6) |
|
N |
每個父對象的子對象序號, 從0開始,生成之後不允許改變,用於簡化的全路經 |
OBJ_ATTR1 |
實體對象屬性1 |
NUMBER(6) |
|
複製對象屬性值常用於過濾,查詢 |
|
OBJ_ATTR2 |
實體對象屬性2 |
NUMBER(6) |
|
複製對象屬性值常用於過濾,查詢 |
|
OBJ_ATTR3 |
實體對象屬性3 |
NUMBER(6) |
|
複製對象屬性值常用於過濾,查詢 |
|
PATH_ID |
樹節點全路經ID |
VARCHAR(160) |
Y3 |
N |
設計最多12級 格式: 父級[PATH_ID].[OBJ_ID]. 12650.12651.12652.12653.12664. 12655.12656.12657.12658.12659. |
PATH_SN |
樹節點全路經序號 |
VARCHAR(160) |
Y4 |
N |
設計最多12級,簡化的全路經 格式: 父級[PATH_SN].[CHILD_SN]. 1.2.3.10.22.101.10123.77.2.99. |
TV_UPDATE |
記錄更新時間 |
NUMBER(13) |
|
N |
時間毫秒值 |
最常用方式說明:
1,任何上級查到所有下級,包括下級的下級
SELECT * FROM TREE_TABLE WHERE PATH_SN LIKE '1.2.%'
說明: PATH_SN 長度比較短, 消耗時間比用 PATH_ID短, 效率上比較高.
2,任何下級查到所有上級,包括上級的上級
代碼可以從[PATH_ID]字段可以解釋出所有父對象ID; 或者SQL:
SELECT * FROM TREE_TABLE WHERE PATH_ID LIKE '%.12659.' AND OBJ_TYPE IN (1001,1002)
查父節點時不能用PATH_SN 因爲可能其它節點會重複, 所以用 PATH_ID,
說明: PATH_ID 長度比較長, 消耗時間比用 PATH_SN長.
3,查詢下級,可以過濾類型
SELECT * FROM TREE_TABLE WHERE PATH_SN LIKE '1.2.%' AND OBJ_TYPE IN (3001,3002)
4,可以局部,快速精確的更改父子關係,包括增加,修改,刪除操作.
增加子節點: 只要生成CHILD_SN/PATH_ID/PATH_SN 等字段就可以完成增加操作
修改本節點: 只要同步OBJ_ATTR1, OBJ_ATTR2, OBJ_ATTR3 其它都不要變化
更改父節點: 需要把子節點的全路經修改掉, 查出所有子節點,然後替換好[PATH_ID],[PATH_SN]子段,最後根據TREE_ID 更新數據庫.
SELECT * FROM TREE_TABLE WHERE PATH_ID LIKE '12650.12651.%'
UPDATE TREE_TABLE SET PATH_ID =?,PATH_SN =?,TV_UPDATE=? WHERE TREE_ID=?
刪除本節點: 1,刪除本節點,2刪除所有子節點
5,找到節點後web自動展開父級樹
代碼從[PATH_ID]字段可以解釋出所有父對象ID,然後按順序展開
6, 普通的樹表會失去很多關係數據庫的功能, 關聯查詢非常不方便, 此樹可以關聯查詢,
TREE_TABLE 可以方便的與其它表關聯查詢, 非常方便, 解決了用 IN (ID...) 的問題