聊聊樹狀結構如何在資料庫中儲存

來源:互聯網
上載者:User

昨天有人在QQ小組問起,無限分層的樹狀結構,資料量比較大,在一萬條以上,如何設計資料庫的結構。其實這是個老生常談的問題,一般的做法是有一個 pid欄位,為了提高效率,還會有個FullPath欄位。(一些人還設定一個層級欄位,但我不知道這個欄位有何作用),FullPath欄位可以用 id-id-id….這種方式拼字串儲存,這樣可以方便地用 like 語句進行查詢某個節點及其子節點。

曾經看到過另外一種儲存方式,利用了一般樹結構可以轉換二叉樹的這一做法,用二叉樹進行儲存,在資料量大的情況下,儲存讀效率比上述的常見方案更優些,所以特寫此文簡單介紹一番。

說明了這種方案

,在每個節點上,有left ,right兩個欄位,我們看到,圖上從根節點順著子節點開始畫一條線,每深入一層left加一,到底後,right=left+1,然後順著節點回溯,right逐級加一,一直回到根節點。

如果要查詢某個節點及其子節點,比如 fruit 節點 ,條件為 where left between 2 and 11

要查某個節點的full path ,比如 banana,條件為 where left<8 and right >9

如果要插入某個節點,比如red yellow直接插入一個節點,則update left =left+2 where left>=7 ,update right=right+2 where right>7,然後 新節點的left rigt分別是 7,8。 刪除節點類似。

這種方式,因為id都是int型資料,加上索引後,讀的效率較高。而fullPath欄位的方案查詢時候用的是字串操作like,效率較低。

在記憶體中,如果要還原樹狀結構,即在每個節點上增加pid屬性和children屬性,則稍微麻煩些,可以如下操作:

OK,大致的方案就介紹到這裡

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.