多層級樹形結構數據庫存儲方式


要做一個多層級樹形結構數據,后端數據如何存儲,以怎樣的形式給前端呢

 

方法1:Adjacency List存儲相鄰關系

 id, parent_id以鄰接表(Adjacency List)的形式進行存儲在一張表中

這種方式在關系存儲比較簡單,查詢的時候比較復雜。

比如查詢部門下的所有子部門信息,因為表中只記錄的上下級的部門及其子部門信息。需要遍歷表中的信息

這有兩種方式。

方式1:

在數據庫中遞歸遍歷數據表,這樣只需要一次io就可以完成這個操作。降低的數據庫連接數,缺點是占用數據庫的cpu,在數據量大的時候會贊成數據庫服務器宕機,甚至直接損壞

方式2:

在編程語言中進行遍歷。for循環中通過parent_id遍歷出部門下的下級子部門,放入到map中,如果沒有查詢到信息就返回null

具體代碼參考分銷系統的用戶關系,用戶與推廣鏈接的數據庫設計。設計思路 。這個需要頻繁的進行數據庫查詢,在部門層級數不大於50的時候是可以適用的。

也可以把表中的所有數據查詢下來,放到list中,通過遞歸遍歷list數據方式進行數據查詢。在數據表比較小的時候也可以適用。優點是只需要進行一次IO,缺點是當數據表數據很大時,數據庫內存消耗會很大。

 

 方法2:左右值編碼存儲關系。

一條記錄中增加兩個字段,left 和 right

例如公司部門樹型結構圖

 

先看下他們構成的樹結構圖

從上圖可知,左右值的排序規律是按照先序遍歷進行排序,即,根-->左-->右(因為根不需要計算值,排序從左子樹到右子樹從小到大排列)

查看規律,

中國總部這個根節點的左值比它的所有子節點都小。右值比它的所有子節點都大

 

 

 

 

 如果層級數據不多,建議平級返回數據,客戶端自己組合層級。
數據存儲 一般是看你的需求,比如:
國家-城市-道路-母嬰。這種差異較大的就是多個表關聯存儲
 

如果是很緊密的那就存儲一個表就好,也可以使用NOSQL方式存儲,這樣篩查也是可以的。

 

 如果數據量大那就分接口返回
 比如查詢1級接口。查詢2級接口 3級接口....
依次的來,不要1~3級的全部返回了
就是購物的就可以啊
淘寶的篩選就類似,京東也是


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM