數據層次的概念:
數據層次是表達數據的一種重要關系,在數據庫的設計中,如:組織結構分解、工作任務分解、行政區劃的分解等都是層次關系數據的典型實例。
表達層次關系的數據一般需要實現如下屬性:
1.層次的最大級聯層次數。如:中國->湖南省->長沙市->雨花區,就是4層。
2.能反映同一層次之間的順序關系。如:長沙市 必須在 衡陽市的前面,(因為其是省會)。
3.能獲取任意層次的父節點級子節點(子節點集)。
4.直接獲取任意層次的數據。比如:第三層 市級別的數據。
5.能方便構造層次關系表達樹。
6.層次結構及排序方式的改變不影響其其他數據的內部邏輯關系。
一般有三種方式來表現層次關系的數據:
1.建立多個數據庫表:
如: COUNTRY: ID(主鍵) COUNTRY_NAME
PROVINCE: ID(主鍵) COUNTRY_ID(外鍵),PROVINCE_NAME
CITY: ID(主鍵), PROVINCE_ID(外鍵),CITY_NAME
此種方式比較簡單,但設計的靈活性不夠,數據處理起來比較麻煩。
2.采用表的自關聯外鍵引用
如: DISTRICT_INFO: ID(主鍵),PARENT_ID,(外鍵)DISTRICT_INFO
通過外鍵(PARENT_ID)的自身引用主鍵(ID)來確立層次關系。
優點:無限級別的層次關系,擴充性強。對于Oracle數據庫來說,能簡單通過 Start With,,,Connect By--語句來實現數據的查詢。
缺點:不能明確看出層次關系,無法實現排序。
3.采用編碼方式來實現層次
DISTRICT: ID,CODE,NAME 其中CODE的特點是上級編碼是下級編碼的前綴
優點:通過編碼的內容能夠很容易回去數據的層次關系。
缺點:使用Like方法或函數查詢來實現子集的查找,效率較低,能實現層次關系的級數有限(受CODE的字段長度影響)。
優化方案:
集合2,3的優點,采用固定編碼級次的長度的方法來設計表。
DISTRICT:ID,CODE,PARENT_ID,NAME
其中ID為主鍵,CODE:規定為4位一級。表現的數據如下:
ID,CODE PARENT_ID, NAME
1 0001 中國
2 00010001 1 湖南
3 000100010001 2 衡陽
4 000100010002 2 長沙
5 0001000100020001 4 雨花
|
從數據中可以看出,PARENT_ID可以直觀表達層次的上下級關系
而編碼CODE可以直觀表達層次關系與同一層次的順序關系。
如果要將長沙排在衡陽的前面,需要對調其編碼即可,而外部的引用關系由于通過ID實現,不會受其影響。
獲取節點的父級別節點:
Select * From DISTRICT Where ID=(Select PARENT_ID From DISTRICT Where ID=2)
獲取節點的子級別節點列表:
Select * From DISTRICT Where PARENT_ID=2
獲取所有的子節點信息:
Select level, * From DISTRICT d Start With PARENT_ID=2 Connect By d.PARENT_ID=Prior t.ID
或 --排序模式
Select * From DISTRICT d Where d.CODE Like '00010001%' Order By CODE
獲取某一層次(N)的節點信息(實現排序,層次碼長度固定的意義):
Select * From DISTRICT Where LENGTH(CODE)=4*N And CODE Like '0001%' Order By CODE......