Re: [請益] 該怎麼設計目錄的資料表呢!?
※ 引述《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
推
06/17 15:33, , 1F
06/17 15:33, 1F
推
06/17 16:21, , 2F
06/17 16:21, 2F
→
06/17 16:21, , 3F
06/17 16:21, 3F
推
06/18 01:12, , 4F
06/18 01:12, 4F
推
06/19 16:13, , 5F
06/19 16:13, 5F
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章