前言
无限分类其专业的命名就是存储树形结构,这是一个很常见的问题,但是有很多种解决方案。由于在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/
http://www.ccvita.com/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
版权声明:原创作品,欢迎转载,转载时请务必以超链接形式标明文章原始地址、作者信息和本声明。