作者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
1F:推 rickysu:看来有人直接给答案了。 06/17 15:33
2F:推 kingoface:感恩rickysu大大,还有谢谢dinos大大精辟的解析,我现在 06/17 16:21
3F:→ kingoface:正在实作中,有研究心得会分享给大家的! 06/17 16:21
4F:推 Bambe:joomla 的 menu 也是这样实作出来的呢~~ 06/18 01:12
5F:推 rocairforce:不M吗 06/19 16:13