資料結構 - php 對 mysql 資料庫遍曆的問題

來源:互聯網
上載者:User

一個關於代理分銷系統的演算法最佳化問題

比如,代理層級分:金、銀、銅三級,我現在是金牌代理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?

建議分級查詢,按需查詢資料,一次性顯示一個關係樹查詢次數多,耗資源;
這樣的實現可以看無限級分類,使用左右值原理,先序遍曆樹形結構,與商場的分類同原理

先檢查代理層級建索引了沒。

整個樹顯示出來一個頁面也不合適吧,可以做成按需查詢。
金牌代理開啟頁面顯示下級的所有銀牌代理,點擊銀牌代理使用者再查看他下級的銅牌代理

謝邀,說說我的幾個思路吧:

  1. 如果更新不是很頻繁的話,使用緩衝(資料量30萬,估計只能緩衝1~2級了),不用每次用SQL查詢。

  2. 多次載入,這個樓上也說了,先載入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都需要重新計算序號),但是搜尋就非常快了,一般一次搜尋就能出結果啦。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.