高級Oracle DBA,善長Linux系統維運以及Oracle數據庫管理,開發,調優. 具有多年PL/SQL開發經驗.
分类: Oracle
2007-04-21 09:14:45
如何在數據庫中存儲邏輯樹
-------------------------------------------------
樹形結構是計算機數據結構中是最常見的結構之一.
在生活中也會常常遇到.如工廠的物料清單,產品組成,
部門組織都是樹形結構.
可用圖表dbtree.jpg來表示其中的內在關聯關係.
如何用計算機的數據結構來表示現實生活中的內容呢?
在常用的計算機語言如C可將其轉化為二叉樹,再用前後指針來
訪問.或可利用List或OOP語言的對象來訪問.
那麼在關系型數據庫中該如何表示樹型結構?
答案其實很簡單.假設二維表表結構如下
TableA:
FieldName
Type
ID Integer
PARENTID Integer
DISPLAYText Varchar(20)
VALUE1
Varchar(20)
.... ....
分析如下:
ID :整數型,用來當做主Key確定資料唯一性.
PARENTID
:整數型,用來表示它的父結點是哪一個
根結點可將它存為Null或0
.
也可不存根記錄,PARENTID為0的資料指向不存在的虛擬根.即假設PARENTID為0的資料
是該樹的第一層子樹.
問:如何得到某節點的父親?
答: 訪問PARENTID欄位.
問:如何得到某節點(12)的所有兒子?
答: SELECT * FROM TABLE1 WHERE PARENTID=12
問: 你這樣表示,一個Table只能存一棵樹,我有多個產品該如何表示產品組成?
答: 可以新增加一個欄位PRODUCTID
為主Key來區分產品.
SELECT * FROM TABLE1 WHERE PRODUCTID='PROD01'
PROD01為產品號.
問:是否會發生A-->B-->C-->D-->A的情況?
答:的確有可能發生,程序員寫代碼時需要注意.
尤其是更新PARENTID時.
問:使用這種方式比主從檔表示有什麼好處?
答: 好處有三.
1. 可以表示多層,關係很清晰
2.
可以很方便的修改邏輯結構,由一子樹掛到另一子樹.
3. 存儲訪問方便,只需訪問單一Table .
Write :阿飛
Date : 2006/01/02