在数据库中存储树型结构的分类数据
一、简单实现
软件开发的过程中,经常会需要实现一个树形列表,如:网站频道的分类、商品分类等。此时会使用以下的方式建立表:
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: 分类级别
加入级别字段,对于查找分类在某些情况下也更加有利,但也牺牲一定的代价:增加分类工作的负担。