第一章: 在RDB中的樹結構資料

來源:互聯網
上載者:User

標籤:編程   功能   gps   海量資料   news   pre   表達   模型   smart   

第一章: 在RDB中的樹結構資料

在本章中,我將寫一個基本的知識來理解這個問題

一  模型的作用

RBD處理樹模型的作用總結為兩點:

1  在RDB表中儲存樹的資料

2  效率的查詢節點的相關節點

1  在RDB表中儲存樹的資料

我們可以定義的標準,該模型是否具有儲存層次資料的功能

可以由儲存的所有節點再現原有的階層

如果不能通過儲存的資料再現原有的樹結構,就不能說這個模型實現了樹。

2  效率的查詢節點的相關節點

通常,我們將資料儲存到資料庫中進行搜尋,資料中儲存了分層資料,可能會查詢任何節點的關係資料(如子樹、父節點、子節點,祖先節點,子孫節點等)。這是一個樹模型的重要作用。

如下[A], [B], [C]等表示節點。

                [A]               |           +---+---+           |       |          [B]     [C]           |       |         +-+-+   +-+-+         |   |   |   |        [D] [E] [F] [G]                     |                   +-+-+                   |   |                  [H] [I]
當我們查詢[C]的子樹時,通過跟蹤向下延伸的分支來擷取所有的節點。
           [C]           |         +-+-+         |   |        [F] [G]             |           +-+-+           |   |          [H] [I]
跟蹤向下延伸的分支是很有規律性的,因此很多人認為如果將分層資料儲存在資料庫中,我們將很容易地尋找到任何節點的相關節點。
樹形結構資料會像一下的資料集合被頻繁的搜尋。

節點

關係

節點集合

[B] 父節點 [A]
[B] 子節點 [D] [E]
[H] 祖宗節點 [A] [C] [G]
[C] 子孫節點 [F] [G] [H] [I]
[C] 部分木 [C] [F] [G] [H] [I]
有效一詞在這裡是非常重要的,不然也沒有必要設計查詢。這裡做查詢時首先要得到所有節點,然後通過查詢條件過濾。然而,在一個百萬級資料的表中,我們擷取全部節點時需要大量的執行時間和記憶體,每次得到所有的節點是不現實的。如果表中有大量的百萬級相關聯的節點,這個系統的設計在速度將很難上達到指標。 二  執行個體

通過執行個體,說明如何利用查詢尋找層次資料中的相關節點。

尋找祖先節點使用網上的"breadcrumbs list"。
1  祖先節點尋找的執行個體
        [Top Page]            |--[Products]            |     |--[Smart Phone Apps]            |     +--[Desktop Apps]            |--[News]            |     |--[2015/10]            |     |--[2015/09]            |     |--[2015/08]            |     +--[2015/07]            +--[About Us]                  |--[Corporate Philosophy]                  |--[Access]                  +--[Contact Us]
當我們查詢[Corporate Philosophy]的節點,通過跟蹤向上延伸在其頂端的節點如下。
Top Page > About Us > Corporate Philosophy
所有的過度的頁面都會被認為是樹結構,首頁為根節點。當能夠找到Corporate Philosophy的祖先節點就可以再現breadcrumbs list
2  子孫節點尋找的執行個體

論壇有回複注釋的功能,以此為樹,當將所有注釋視為節點時,所儲存的資料具有階層。查詢論壇中的評論時,我們會使用尋找子樹節點。

        [2015/03/31]            |--[Let‘s Party tonight! (John)]            |     |--[I will join! (Mike)]            |     |     +--[Thanks! (John)]            |     |--[Can not join tonight. (Anne)]            |     |     +--[When OK? (John)]            |     +--[OK, but 2 hours only. (Tom)]            |           |--[Me too. (Eucen)]            |           +--[I see! (John)]            +--[I losted my smart phone. (Bill)]                  |--[When? (Diana)]                  |     +--[Yesterday. (Bill)]                  +--[Did you check GPS? (Fred)]                        +--[Yet (Bill)]
 
如上,在2015年3月31日有兩個線程,當只顯示Let‘s Party tonight! (John)時就需要查詢評論John的所有子樹。在這種情況下,由於論壇海量資料節點的純在效率問題,不能使用尋找所有節點的方法。
 
三  關聯式模式的問題點

再次重申下RBD處理樹模型的作用。

1  在RDB表中儲存樹的資料

2  效率的查詢節點的相關節點

很難寫出一個高效的查詢原因有一下幾點。

1  要想搜尋,首先要儲存每個節點的所有祖先節點

2  節點關係資料量相對深度呈指數倍增長

3  層次的深度不取決於資料的內容

4  在資料庫中對層次資料賦予索引是困難的。因為樹結構具有二維擴散,但指數是一維結構

5  等等

如果從指定節點找到一組子孫節點,可以通過跟蹤分支方向來確定,這是一個簡單的事。然而SQL是說明性編程(declarative programming),因此不能為每個節點確定關係,比如在單獨的進程中使用命令式編程。

在聲明式編程,我們如何能夠表達在搜尋查詢子樹和祖先節點的關係?

世界各地的資料庫工程師都在挑戰這個問題,RDB中的分層資料的問題點關鍵就在於“如何有效查詢節點相關的任何節點”。

 

四  列的追加

為瞭解決儲存層次樹資料,工程師們已經研發了四種模型來解決這個問題。

鄰接表模型(adjacency list model)

路徑枚舉模型(path enumeration model)

嵌套集合模型(nested set model)

關閉表模型(closure table model)

無論在哪一種模型中,無非都是在RDB中添加一些列來儲存分層資料。所添加的列按照其作用可以分為兩類。

1  階層列

2  效率搜尋列

1  階層列

需要儲存層次資料在RDB表中。也在查詢中被用作為一個檢索條件的列。

2  效率搜尋列

第一章: 在RDB中的樹結構資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.