樹形結構存儲
㈠ 數據的存儲結構可以用什麼和什麼
數據的存儲結構可以用集合、線性結構、樹形結構和圖形結構,具體如下:
(1)集合:數據結構中的元素之間除了「同屬一個集合」的相互關系外,別無其他關系;
(2)線性結構:數據結構中的元素存在一對一的相互關系;
(3)樹形結構:數據結構中的元素存在一對多的相互關系;
(4)圖形結構:數據結構中的元素存在多對多的相互關系。
常用運算:
(1)檢索。檢索就是在數據結構里查找滿足一定條件的節點。一般是給定一個某欄位的值,找具有該欄位值的節點。
(2)插入。往數據結構中增加新的節點。
(3)刪除。把指定的結點從數據結構中去掉。
(4)更新。改變指定節點的一個或多個欄位的值。
(5)排序。把節點按某種指定的順序重新排列。例如遞增或遞減。
以上內容參考:網路-數據結構
㈡ 樹的存儲表示是什麼
樹的存儲結構根據應用的不同而不同,有的從雙親的角度考慮,引出了雙親表示法,有的從孩子的角度考慮,給出孩子表示法,還有的從孩子和兄弟的角度來討論。這些都是人們在大量的應用中所使用的不同形式的存儲結構,這里介紹常用的雙親表示法、孩子表示法、雙親孩子表示法和孩子兄弟表示法。
1.雙親表示法由樹的定義可知,樹中每個結點都有且僅有一個雙親結點,根據這一特性,可以用一組連續的一維數組來存儲樹中的各個結點(一般按層次存儲),數組中的一個元素對應樹中的一個結點,其中包括結點的數據信息以及該結點的雙親在數組中的下標。樹的這種存儲方法稱為雙親表示法,雙親表示法的結點結構如圖1所示,其中,data表示數據域,存儲樹中結點的數據信息,parent表示指針域,存儲該結點的雙親在數組中的下標。
1.雙親表示法的存儲結構2)雙親表示法示例圖1所示的樹的雙親表示如圖1所示,這是一棵樹及其雙親表示法的存儲結構。根結點A無雙親,所以parent的值為-1,G、H和I的parent值為4,表示它們的雙親是下標為4的結點E。這種存儲結構利用任一結點的雙親是唯一的性質,可以方便地直接找到任一結點的雙親結點,但求結點的孩子結點時需要掃描整個數組。
圖1樹的雙親表示法示例
㈢ MongoDB樹形數據存儲
樹形結構的存儲是一種非常典型的需求,例如菜單、省市區、欄目等等。
將樹形結構的每個節點作為一行存儲,每個節點保存父節點的指針(pid)。優點是簡單易懂,插入梁納修改比較簡單。缺點是若要獲取某個節點的所有子節點,將是一件非常惡心的事情。
在方式1中增加left和right,相當於btree的左豎渣旦右分支,分別存儲左右分支節點的最大值和最小值。優點是查詢一個節點的子節點容易,僅需做范圍查詢查詢即可。缺點是由於樹形結構存儲在裡面,增加或修改已存在的節點將可能產生連鎖反應,操作復雜。
將整個樹結構存成一個文檔,文檔結構即樹形結構,簡明余擾易懂。缺點是文檔越來越大,對所有節點的修改都集中在此文檔中,並發操作受限。
將每個節點的子節點保存起來,優點是結構簡單查詢子節點方便,缺點是查詢父節點會表麻煩。
充分利用文檔型存儲 schema-less的優點,受限存儲一個大的樹形文檔,再將每個節點的其他信息單獨存儲。優點是操作簡單,結構上的操作可直接操作樹形文檔,數據上的操作僅需操作單條數據。缺點,對所有節點的修改都集中在此文檔中,並發操作受限。
㈣ 如何在關系型資料庫中存儲樹形結構
文中使用公司部門結構樹作為栗子,要在mysql中存儲這個公司部門結構樹
鄰接表想必大家都不陌生吧,用鄰接表的關鍵是,在每個節點存儲他的父節點的id。
在每一個部門信息中都存儲了他的父節點id,parent_id欄位
導入數據的過程就不說了,直接來看下數據吧:
這里使用常用的幾種查詢方式來看下這種方案的查詢
可以通過parent_id做查詢條件,可以快速查詢到一個部門的直屬下級部門
通過部門信息中的parent_id去查相應的父節點信息就可以快速實現
這種數據存儲結構下,更新數據是比較方便快捷的,添加數據時直接找准父節點的id,組織部門變更時,也直接變更父id就好了,刪除時候,看自己業務是否需要刪除子節點這幾種情況,
路徑標的要點,就是每個節點存儲根節點到該節點的路徑,其實我覺得和別的幾種方案可以共用
在每一個部門信息中都存儲了他完整的路徑,path欄位
導入數據的過程就不說了,直接來看下數據吧:
使用路徑表,通過path這個欄位查詢起來是比較困難的,一般都需要使用like,CONCAT函數、REPLACE函數等做字元串的處理邏輯,查詢起來比較復雜,這里不做展示了,線上服務不建議使用這種方式,查詢效率低會影響到服務性能,一般建議和鄰接表方式統一使用,同時添加parent_id和path欄位,parent_id用來查詢,path用來查看節點完整的路徑
這種數據存儲結構下,更新數據是比較方便快捷的,添加數據時直接找准路徑就好,組織部門變更時,也直接找准路徑就好,刪除時候,看自己業務是否需要刪除子節點這幾種情況,
Closure Table,網路直譯過來叫閉合表,大多數人叫做閉包表,這種方案的要點是存儲公司部門信息主表中,不存儲節點關系的數據,使用另一張關系表來存儲節點之間的關系,其中包含了任何兩個有關系(上下級)節點的關聯信息
公司部門信息主表,只需要存儲部門的本身信息
主要包括三個欄位
要點就是關系表的一條記錄是一個上級節點、下級節點、與他們之間的路徑距離。拿部門結構圖來舉例子
總公司-企劃部的關系數據是:
總公司-大區A的關系數據是:
關系表中存儲所有的節點路徑信息,還用distance表示路徑的距離,需要把樹形結構中每兩個節點之間的路徑信息都維護進來。
數據存儲的過程就拿導入總公司-門店A的過程做個示例。主表的數據存儲就不說,說下關系中,存儲部門結構的路徑信息,總公司-門店A總共包含以下幾條路徑:
看到了么,是存儲了所有總公司-門店A之間的路徑信息
這里使用常用的幾種查詢方式來看下這種方案的查詢
這種數據存儲結構下,更新數據比較麻煩,因為他存儲了兩節點直接所有路徑信息(包括中間節點的)