学而实习之 不亦乐乎

在数据库中存储树型结构的分类数据

2023-09-01 06:51:01

一、简单实现

软件开发的过程中,经常会需要实现一个树形列表,如:网站频道的分类、商品分类等。此时会使用以下的方式建立表:

cid int(11):主键
name varchar(64):分类名
pid int(11): cid 的父分类,0 表示该项为顶层分类。

当需要查询分类时,只需要一个 SQL 语句就能查询出所有节点的对应关系:

select c2.cid, c2.pid, c1.name pname, c2.name
from category c1, category c2
where  (c2.pid<>1 and c2.pid<>0) and c2.pid=c1.cid ;

或者

SELECT c2.cid, c2.pid, c1.name pname, c2.name FROM
(SELECT * FROM category where pid=1) c1
RIGHT JOIN
(SELECT * FROM category where pid in (SELECT cid FROM category where pid=1)) c2
on c1.cid = c2.pid

可以看到,这里只有两级分类,如果还有3级或以上的分类,其 SQL 语句会更加繁琐。因此这种方式适合数据量小,分类级别较少的情况。

二、其他实现方式

也可以在表中加入分类级别字段,表结构如下:

cid int(11):主键
name varchar(64):分类名
pid int(11): cid 的父分类,0 表示该项为顶层分类。
level int: 分类级别

加入级别字段,对于查找分类在某些情况下也更加有利,但也牺牲一定的代价:增加分类工作的负担。