一個關於代理分銷系統的演算法最佳化問題
比如,代理層級分:金、銀、銅三級,我現在是金牌代理A,同時我發展了銀牌代理B、C、D,銀牌代理b發展了銅牌代理E、F,
A的下級代理列表
╦═══════
║
╠═ b
║ ╠══ e
║ ╠══ f
╠═ c
╠═ d
我現在用程式作出上面這樣一張例圖方法是:(PHP+MYSQL)
先搜尋所有上級代理為A的代理,
例如找到了B代理,再搜尋所有上級代理為B的代理,本次搜尋完畢。
再搜尋C代理 …………
以此類推。
問題:
現在代理資料庫中有三十萬條記錄,每個代理都可以在代理分銷系統中查看自己的下級代理樹,按照以上方法:
每次搜尋都要很久,如果某個代理的下級代理有1000個,那就根本顯示不出來。
我想到的解決辦法是用一個數組儲存所有使用者關係,然後將這個數組儲存為檔案,對每次添加刪除使用者都對這個數組同時進行更新操作,然後把想要的資料從數組遍曆出來,然後直接到資料庫中執行一個select就可以了。。這種辦法可行麼,還有什麼其他解決方案麼
遍曆
想從上層會員找其下的底層會員,會用到遍曆,目測是三叉樹的層次遍曆,這個演算法,目測會對資料庫進行好多好多次的查詢。。。太耗費資源了,有沒有什麼替代方案?緩衝?redis?
回複內容:
一個關於代理分銷系統的演算法最佳化問題
比如,代理層級分:金、銀、銅三級,我現在是金牌代理A,同時我發展了銀牌代理B、C、D,銀牌代理b發展了銅牌代理E、F,
A的下級代理列表
╦═══════
║
╠═ b
║ ╠══ e
║ ╠══ f
╠═ c
╠═ d
我現在用程式作出上面這樣一張例圖方法是:(PHP+MYSQL)
先搜尋所有上級代理為A的代理,
例如找到了B代理,再搜尋所有上級代理為B的代理,本次搜尋完畢。
再搜尋C代理 …………
以此類推。
問題:
現在代理資料庫中有三十萬條記錄,每個代理都可以在代理分銷系統中查看自己的下級代理樹,按照以上方法:
每次搜尋都要很久,如果某個代理的下級代理有1000個,那就根本顯示不出來。
我想到的解決辦法是用一個數組儲存所有使用者關係,然後將這個數組儲存為檔案,對每次添加刪除使用者都對這個數組同時進行更新操作,然後把想要的資料從數組遍曆出來,然後直接到資料庫中執行一個select就可以了。。這種辦法可行麼,還有什麼其他解決方案麼
遍曆
想從上層會員找其下的底層會員,會用到遍曆,目測是三叉樹的層次遍曆,這個演算法,目測會對資料庫進行好多好多次的查詢。。。太耗費資源了,有沒有什麼替代方案?緩衝?redis?
建議分級查詢,按需查詢資料,一次性顯示一個關係樹查詢次數多,耗資源;
這樣的實現可以看無限級分類,使用左右值原理,先序遍曆樹形結構,與商場的分類同原理
先檢查代理層級建索引了沒。
整個樹顯示出來一個頁面也不合適吧,可以做成按需查詢。
金牌代理開啟頁面顯示下級的所有銀牌代理,點擊銀牌代理使用者再查看他下級的銅牌代理
謝邀,說說我的幾個思路吧:
如果更新不是很頻繁的話,使用緩衝(資料量30萬,估計只能緩衝1~2級了),不用每次用SQL查詢。
多次載入,這個樓上也說了,先載入N級的,等點擊後,再ajax去請求N+1級的。
樹結構 無限極分類
自己搜尋具體答案吧,這個講細了很麻煩,大致原理說一下給你。
怎麼才能最快的知道誰是自己的下級呢?如果大家來站隊的話,滿足兩個條件即可,1- 你知道誰是第一個,2-保證自己是最後一個 (當然也可以知道誰是最後一個,保證自己是第一個)
根據這個推論為每個節點編上一個合適的序號即可實現快速尋找,如 select * from tree where indexNumber >= search.node.min && indexNumber < search.node.indexNumber
最終的表結構類似
id, parent_id(父節點), top_id(根節點,如果有多個樹的時候), indexNumber(樹內的索引編號,top_id+indexNumber是唯一的), min(已我為基準,誰是本分支下的第一個), level(樹高)
對於你的例子應該類似 (括弧內第一個數字是索引號,第二個是min,第三個是樹高)
a(6,1,0) b(3,1,1) c(4,4,1) d(5,5,1)e(1,1,2) f(2,2,2)
這個結構在節點操作的時候較複雜(比如你在f後面加個g,或者刪掉f,那麼abcd都需要重新計算序號),但是搜尋就非常快了,一般一次搜尋就能出結果啦。