作者dinos (守護神)
看板PHP
標題Re: [請益] 該怎麼設計目錄的資料表呢!?
時間Mon Jun 17 15:29:41 2013
※ 引述《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
1
A20
┌──┴────┐
2
B9 10
C19
┌──┼──┐ ┌─┴─┐
3
D4 5
E6 7
F8 11
G16 17
H18
┌─┴─┐
12
I13 14
J15
比如要找 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