前言
无限分类其专业的命名就是存储树形结构,这是一个很常见的问题,但是有很多种解决方案。由于在PHP开发中涉及到关系型数据的存储,除非使用一种像XML的数据库,否则关系数据库中的表都不是层次结构的,他们只是一个平坦的列表。所以你必须找到一种把层次数据库转化的方法。
常用树形结构存储方案比较:
邻接列表模式
在SQL相关的教程文献中关于存储树形结构的示例,我们最常看到的就是邻接列表模式(Adjacency List Model)。
详细实现方式可自行搜索,这种也是在PHP开发中最常用到的方法。
优点:邻接列表模型很容易理解,代码也很简单。
缺点:嵌套查询SQL所耗费的时间,尤其是当分类的深度加深,查询的次数会以级数的速度增加。
优化:通过将整个树形结构缓存到文本来减轻数据库存储的压力。
改进前序遍历树
这种算法是目前应用较多的逻辑算法,他对分类深度和分类数据较多的属性分类有设计上的优势,在曾经做过的学生学分管理的项目中用过(学院分类、专业分类、班级分类、学生并且每个分类的数据都很多)。
优点:取出任意节点的树形结构都只需一次查询即可实现。
缺点:数据库存储的数据不透明,不利于调试
MooPHP设计方案
经过权衡采用第一种和路径优化的方式,具体实现不写了,等完成之后写详细的文档。
推荐资料
这篇文章和后面的摘要都不错,推荐下。
http://shiningray.cn/hierarchical-data-database.html
http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html
http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html
http://xml.apache.org/xindice/
https://kimi.pub/315.html
http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_9_5.html
[1] http://www.sitepoint.com/glossary.php?q=C#term_28
[2] http://www.sitepoint.com/glossary.php?q=X#term_3
[3] http://www.sitepoint.com/glossary.php?q=P#term_1
[4] http://www.sitepoint.com/glossary.php?q=P#term_50
[5] http://www.sitepoint.com/glossary.php?q=%23#term_72
[6] http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html
[7] http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html
[8] http://xml.apache.org/xindice/
[9] http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_9_5.html
呃 很简洁 简洁到几乎什么都没说 等看代码吧
没看明白啊~
问个问题
我也用的是这个模板
在IE下看没问题 可在firefox下导航却看不到了
是怎么回事呢? 而你的在IE firefox下都是好的
前序遍历树的更新相当麻烦,当你的树大到一定程度后,其维护成本比使用成本会高出很多
我正我是什么都看不懂……
我是打酱油路过的!
习明说得~
关键还是路径优化的方式。看看KIMI要怎么处理~~
今天睡觉做梦梦到了前序遍历树,正如joyqi说的,树大到一定程度以后,维护成本太高。
又见酱油党
路径优化是想通过一种手段把查询邻接列表模式下的所有子分类查询简化为一句SQL。目前已经实现,但是想进一步优化为数字型查询
哈哈,我看不懂哦。。。。。
真神奇,我刚刚跟同事讨论完这个问题,就看到你这帖子了。。。
其实还有一种做法,把所有的分类记录都读出来(分类的话一般都不会太多,最多能有几千条?!),然后用PHP进行排序,保存到数组里,最后在缓存下来。显示的时候只要读取数组直接显示就可以了。(缓存是王道啊哈哈!!!)
路径优化我一直觉得是一个比较笨的方法,虽然很快,但是稍微有一点错误整个记录关系就全混乱了,这个是反关系型数据的做法。
验证码很漂亮所以我留言了,可否将其生成程序给我发了份,谢谢了
@jiedan 代码暂时还没有分发 :)