看板 PHP 關於我們 聯絡資訊
※ 引述《kingoface (Vincent)》之銘言: : 狀況是這樣的, : 需要做一個類似目錄的東西。 : 以下是類似的示意圖(不好意思,有點醜)比如: : A : A_test : A-1-1 : A-file : B : B-111 : B-123 : 222 : B-test2 : B-BB : B-file : 目標是B-file : 那在資料表中 : 該怎麼紀錄他是在 B-> 222 -> B-test2->B-BB 底下呢? : 是要在一個欄位中寫成 : B:222:B-test2:B-BB : 然後利用:切割字串,還是有更好的方法嗎? 樹的話可以考慮MPTT(Modified Preorder Tree Traversal) 原理是使用節點的左右兩側紀錄上下關係,例如原本的樹長這樣 A ┌──┴────┐ B C ┌──┼──┐ ┌─┴─┐ D E F G H ┌─┴─┐ I J 分別在從頂端節點(A)的左側開始紀錄流水號,當有下層時先由下一層的最左側+1 當無下層時再往右側+1,若無右側時再到上層+1,直到回到 A 1A20 ┌──┴────┐ 2B9 10C19 ┌──┼──┐ ┌─┴─┐ 3D4 5E6 7F8 11G16 17H18 ┌─┴─┐ 12I13 14J15 比如要找 C 的子孫節點有哪些,那只要找左側數字大於10,且右側數字小於19 G 父 小於11 大於16 跟另外兩種方式 一:像你的作法,紀錄完整節點 二:只紀錄 parent node 比較起來,mysql 的查詢操作上,特別是固定長度的資料表時 在新增或搬移節點時,MPTT 會比一二都來得沒效率 但在尋找或刪節點除時,MPTT 會比一二效率表現好上很多 若你的資料是不常異動(insert/update/delete)且經常要用來尋找(select)的話, 可以考慮一下 MPTT -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.181.51.65
rickysu:看來有人直接給答案了。 06/17 15:33
kingoface:感恩rickysu大大,還有謝謝dinos大大精闢的解析,我現在 06/17 16:21
kingoface:正在實作中,有研究心得會分享給大家的! 06/17 16:21
Bambe:joomla 的 menu 也是這樣實作出來的呢~~ 06/18 01:12
rocairforce:不M嗎 06/19 16:13