很多人在做一些多级别分类的时候,表结构的基本字段设计如下:
id 分类id
parent_id 父类id
。。。。。
实现无限级分类主要是靠id和parent_id两个字段,parent_id为0表示是顶级分类
相信应该很容易看的懂。
但是这样设计的表结构,有一个硬伤,那就是如果我要取某个节点下面的所有子节点,就必须通过递归来实现了,这样的效率是非常差的
下面提供一种更优的结构,来保证 增加节点、删除节点、查找节点 都以一个相对高效的方式来实现。
实现思路:
在基础的id和parent_id的基础上,再增加一个字段,路径(path),用来存储找到该字段的路径。
例如:
顶级分类:id=1,parent_id=0,path='1'
二级分类:id=2,parent_id=1,path=‘1,2’
三级分类:id=3,parent_id=2,path='1,2,3'
来看一下基本的结构图:
红色表示节点id,框内表示节点路径
表结构设计如下:
CREATE TABLE Table_Type
(
id INTEGER NOT NULL AUTO_INCREMENT,
parent_id INTEGER,
node VARCHAR(255),
PRIMARY KEY (id)
)
这样,假如我们要在ID为7的记录下,插入一条新ID为13的记录,新记录的node就是1,2,7,13
要找一个节点下的所有子节点,就无需用递归,只要一个SQL。
如“查ID为2记录下所有子节点”
select * from Table_Types where node like "1,2,%"
如“删除ID为2记录下所有子节点”
delete from Table_Types where node like "1,2"
即同时删除此节点和它的所有子节点