Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          層次關系數據庫表的設計

          數據層次的概念:

            數據層次是表達數據的一種重要關系,在數據庫的設計中,如:組織結構分解、工作任務分解、行政區劃的分解等都是層次關系數據的典型實例。

            表達層次關系的數據一般需要實現如下屬性:

            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......

          posted on 2008-08-26 11:29 都市淘沙者 閱讀(4397) 評論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

          主站蜘蛛池模板: 阿合奇县| 连平县| 佛学| 资兴市| 石首市| 潮州市| 北川| 南通市| 炎陵县| 宜兰市| 如东县| 岳池县| 腾冲县| 西和县| 右玉县| 太仓市| 黄浦区| 凌源市| 五台县| 青河县| 青川县| 尤溪县| 云霄县| 嫩江县| 昌吉市| 始兴县| 淮安市| 灵武市| 新宁县| 大田县| 长武县| 浦东新区| 什邡市| 左云县| 新龙县| 玛多县| 宝山区| 湘乡市| 西华县| 永登县| 灵璧县|