<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我是FE,也是Fe

    前端來源于不斷的點滴積累。我一直在努力。

    統計

    留言簿(15)

    閱讀排行榜

    評論排行榜

    一種能跨數據庫的樹形數據表格設計

    在數據表的設計中,對于樹形的表格數據,處理起來時比較棘手的,個人經歷過sql server,oracle,mysql,發現對于樹形的表格數據處理都不同。

    通常的屬性表格設計時我們會這樣設計:
    create table demo_tree (
           id 
    int ,
           nodename  
    varchar(50),
           parentid 
    int 
    )
    這樣對于不同的數據庫處理起來方法就各異了。在sql server里面可能需要用函數遞歸,在oracle里面可以使用 connect by  .. start with .. order sibling by ..去達到深度遍歷樹的目的。

    雖然主流的ORM框架能處理數據庫廠商sql語法的差異,但是對于樹形數據還是缺乏統一的支持。所以有人設計了一個這樣的表結構:
    1 create table DEMO_TREE
    2 (  
    3   NODELEVEL  INTEGER not null,
    4   LEVELCODE  VARCHAR2(500not null,
    5   PARENTNODE VARCHAR2(500),
    6   NODENAME   VARCHAR2(200)
    7   /*其他字段略*/
    8 )
    • nodelevel是樹的深度,1,2,3...
    • levelcode這個字段格式是這樣的,我們可以假定每級節點的數量是有上限的,可以根據需要約定比如我們限定每個節點的最多是99999個子節點。這樣。levelcode 的第一個節點可以levelcode編號為"00001",其相鄰節點為"00002",他的第一個子節點為"0000100001",以此類推,可以為每個節點一個唯一編號。
    • parentnode就是父節點的levelcode
    • nodename是節點名稱

    這樣的設計后。我們給出一個實例查詢:

    select t.nodelevel,t.nodename,t.levelcode,t.parentnode From demo_tree t order by t.levelcode

    這樣查詢的結果形如:
    NODELEVEL NODENAME LEVELCODE PARENTNODE
    1 一級測試節點1  00001
    2 二級測試節點1  0000100001 00001
    3 sdfasfasfad  000010000100001 0000100001
    2 二級測試節點2  0000100002 00001
    2 二級測試節點3  0000100003 00001
    2 二級測試節點5  0000100005 00001
    2 asdfgh  0000100007 00001
    1 一級測試節點2  00002
    2 二級測試節點2  0000200001 00002
    3 fasdfasfsaf  000020000100001 0000200001
    2 二級測試gg4  0000200002 00002
    3 dfasfasfas  000020000200001 0000200002
    3 fgh  000020000200001 0000200002
    4 fdsafdas  00002000020000100001 000020000200001
    4 dfasfsafsda  00002000020000100001 000020000200001
    5 fadsfasfsa  0000200002000010000100001 00002000020000100001
    5 fdasfdasfasdf  0000200002000010000100001 00002000020000100001
    3 dsafasfasdf  000020000300001 0000200003
    1 測試深度節點1  10001
    2 測試深度節點10  1000100000 10001
    3 測試深度節點100  100010000000000 1000100000
    4 測試深度節點1000  10001000000000000000 100010000000000
    5 測試深度節點10000  1000100000000000000000000 10001000000000000000
    1 測試深度節點2  10002
    2 測試深度節點20  1000200000 10002
    3 測試深度節點200  100020000000000 1000200000
    4 測試深度節點2000  10002000000000000000 100020000000000
    5 測試深度節點20000  1000200000000000000000000 10002000000000000000
    6 qwerfga  100020000000000000000000000001 1000200000000000000000000
    2 sdfg  1000200001 10002
    3 safsdfsadfaaa  100020000100001 1000200001

    他是樹的深度遍歷結果,這也就是這樣設計的最大的好處。

    對于新增樹節點時需要多做一步就是計算levelcode,比如增加同級節點時需要找到同級節點的最后一個節點。然后將levelcode最后一節+1。對于新增子節點需要找到最大levelcode的子節點然后+1。

    刪除也比較方便,如需要刪除一個節點以及其所有的子節點,可以
    delete from demo_tree where levelcode like '00001%'

    需要獲取樹的廣度遍歷結果可以直接用nodelevel排序。

    這樣的設計帶來的好處是在各種數據庫上都可以用。不會因為數據庫不同獲取樹的遍歷結果需要寫不同的sql。

    當然,問題在于levelcode的計算會導致同級節點的排序不好實現。要獲取遍歷結果,通常是按照levelcode排序,由于計算levelcode是根據新增的先后順序,所以同級排序就留給大家思考了。


    posted on 2010-10-25 11:20 衡鋒 閱讀(2576) 評論(4)  編輯  收藏 所屬分類: Oracle

    評論

    # re: 一種能跨數據庫的樹形數據表格設計 2010-10-25 12:35 vagrant

    with查詢應該都可以搞定了吧  回復  更多評論   

    # re: 一種能跨數據庫的樹形數據表格設計[未登錄] 2010-10-25 15:03 小小

    這個確實可以實現,我們試過,但大數據量下效率實在遠不如oracle connect by,小數據量無所謂;另外這種實現對于樹結點的移動操作實在是噩夢啊。
    五位一個編碼小數據量下浪費,大數據量下還有10萬的約束,雖不大可能超出,但這個約束還是不爽,類似于“潛規則”啊。
    所以我們最終更改了曾經的這種實現,還是充分使用不同的數據庫提供的解決方法更優化,現在的java/c#實現多數據庫對應不同實現代碼還是很簡單的。
      回復  更多評論   

    # re: 一種能跨數據庫的樹形數據表格設計 2010-10-25 17:28 陽衡鋒

    @vagrant
    with語法不是每個數據庫都支持的。

    @未登錄
    這樣的設計主要還是考慮在不同的數據庫都能夠簡單的實現遍歷和級聯刪除。當然任何設計都是有利有弊的。如果產品要求數據庫兼容,必然會有些取舍。  回復  更多評論   

    # re: 一種能跨數據庫的樹形數據表格設計 2010-10-27 15:46 單飛

    一般來說tree model 不會全部構造出來,除非數據量很少。針對海量的深度,要使用動態加載,比如樹的節點被點擊開的時候才取子目錄的數據。Lazy-Load.  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 37pao成人国产永久免费视频| 久久亚洲精品无码av| 99精品免费视频| 国产∨亚洲V天堂无码久久久| 看成年女人免费午夜视频| 国产又大又粗又硬又长免费| 香蕉大伊亚洲人在线观看| 国产情侣激情在线视频免费看| 亚洲男人天堂影院| 999在线视频精品免费播放观看 | 免费人成网站在线观看10分钟| 久久夜色精品国产噜噜噜亚洲AV| 日韩免费无码视频一区二区三区| 亚洲人成网网址在线看| 成年女人男人免费视频播放 | 伊人久久亚洲综合| 国产美女无遮挡免费视频网站| 亚洲福利一区二区三区| 国产香蕉免费精品视频| 亚洲一区二区观看播放| 内射无码专区久久亚洲| aa毛片免费全部播放完整| 亚洲色欲色欲综合网站| 2020久久精品国产免费| 国产精品亚洲专区无码不卡| 亚洲无码精品浪潮| 99re免费99re在线视频手机版| 亚洲一级毛片免费在线观看| 国产无遮挡色视频免费视频| 久青草视频在线观看免费| 亚洲国产亚洲片在线观看播放| 成人永久福利免费观看| 91免费在线视频| 亚洲国产成人综合| 亚洲va中文字幕无码| 性色午夜视频免费男人的天堂 | 一区二区免费国产在线观看| 亚洲AV无码专区电影在线观看| 国产免费看JIZZ视频| ww在线观视频免费观看w| 亚洲黄色在线视频|