理想樹表結構數據庫存儲方案

實現目標

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...) 的問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章