Chinaunix首页 | 论坛 | 博客
  • 博客访问: 411064
  • 博文数量: 66
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 922
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-16 10:37
个人简介

高級Oracle DBA,善長Linux系統維運以及Oracle數據庫管理,開發,調優. 具有多年PL/SQL開發經驗.

文章分类

全部博文(66)

文章存档

2015年(9)

2014年(4)

2013年(5)

2010年(1)

2009年(3)

2008年(6)

2007年(30)

2006年(8)

我的朋友

分类: 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

阅读(1934) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~