关于无限分类的两种思路总结
2011/7/2 9:34:47 类别:数据库摘要:最近看了网上的2种无限分类的示例,这里作下小结.一种我相信是大家一直常用的采用Parent_ID(父节点),另一种就是采用左右值实现的.本文仅介绍思路
首先先说下这2种分类方法的实现思路,下面引用网络上朋友整理好的数据结构
Food | |---Fruit | | | |---Red | | | | | |--Cherry | | | +---Yellow | | | +--Banana | +---Meat |--Beef +--Pork
一种数据库设计结构
字段有ID(分类ID) cateName(分类名),parentID(父类ID),parentPath(节点路径),cateLevel(节点层次),cateOrder(节点排序)
这种设计思路是常用思路,也是我一直用到现在的设计模式,此结构对于数据量不太大的情况下,很适用,其缺点是遍历树时的效率问题,一直没有找到好的解决办法(附目前的2种办法:1.递归当前节点获取当前目录路径,2用节点路径循环查询数据库获取目录路径)这里数据库有parentPath和没有parentPath都是可以的.关键是程序的实现思路.
另一种设计模式就是这里要着重讲解的左右值分类法(有着高效的遍历树和快速查找功能)
树型结构如下
1 Food 18 | +------------------------------+ | | 2 Fruit 11 12 Meat 17 | | +-------------+ +------------+ | | | | 3 Red 6 7 Yellow 10 13 Beef 14 15 Pork 16 | | 4 Cherry 5 8 Banana 9
表的设计如下图所示
+------------+-----+-----+ | name | lft | rgt | +------------+-----+-----+ | Food | 1 | 18 | | Fruit | 2 | 11 | | Red | 3 | 6 | | Cherry | 4 | 5 | | Yellow | 7 | 10 | | Banana | 8 | 9 | | Meat | 12 | 17 | | Beef | 13 | 14 | | Pork | 15 | 16 | +------------+-----+-----+ --Select * FROM tree Where lft BETWEEN 2 AND 11;获取当前节点所有子孙结点的SQL --当前节点有多少子孙结点,计算公式为(rgt-lft-1)/2 即可获取子孙结点个数
此方法目前测试最不方便的为获取当前节点的儿子节点(考虑办法添加字段level显示当前节点层,这样就可以加个SQL条件实现查询所有儿子节点了)
这里主要介绍了目前这2种无限分类的实现思路,具体实现代码要靠大家自己动手.我就不贴了,我相信在自己写的过程中,能有更多的收益,说不定引发出更好的分类思路(比如取长补短,结合这两个分类的特点)