要做一個多層級樹形結構數據,后端數據如何存儲,以怎樣的形式給前端呢
方法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級的全部返回了
就是購物的就可以啊
淘寶的篩選就類似,京東也是
依次的來,不要1~3級的全部返回了
就是購物的就可以啊
淘寶的篩選就類似,京東也是