设计一个无限级分类的数据表是一个很常见的数据库任务。比如你写一个CMS,需要有4,5级分类的栏目,反正就是很普遍,所以还是需要了解一下。下面本专题的所有内容,都是我自己随手演示写写,仅仅供参考,绝不是标准答案。
我们先设计一个数据表吧,一个可供无限级分类的数据表。
SQL语句设计如下:
01 |
CREATE TABLE `categories` ( |
02 |
`id` int (10) unsigned NOT NULL auto_increment, |
03 |
` name ` varchar (50) NOT NULL , |
04 |
`xname` varchar (50) NOT NULL , |
05 |
`parentid` int (10) default '0' , |
06 |
`parentid_list` varchar (20) default '0' , |
07 |
`depth` varchar (10) default NULL , |
08 |
`state` varchar (10) default '1' , |
09 |
`priority` varchar (10) default '0' , |
11 |
) DEFAULT CHARACTER SET utf8; |
一会再介绍为什么字段要这么设计,先插入测试数据。顺便说下,数据是从亚马逊那里拿的几个栏目。
04 |
INSERT INTO `categories` VALUES ( '1' , '图书' , null , '0' , '1' , '1' , '1' , '0' ); |
05 |
INSERT INTO `categories` VALUES ( '2' , '科技' , null , '1' , '1,2' , '2' , '1' , '0' ); |
06 |
INSERT INTO `categories` VALUES ( '3' , '计算机/互联网' , null , '2' , '1,2,3' , '3' , '1' , '0' ); |
07 |
INSERT INTO `categories` VALUES ( '4' , '医学' , null , '2' , '1,2,4' , '3' , '1' , '0' ); |
08 |
INSERT INTO `categories` VALUES ( '5' , '自然与科学' , null , '2' , '1,2,5' , '3' , '1' , '0' ); |
09 |
INSERT INTO `categories` VALUES ( '6' , '电脑办公' , null , '0' , '6' , '1' , '1' , '0' ); |
10 |
INSERT INTO `categories` VALUES ( '7' , '电脑整机' , null , '6' , '6,7' , '2' , '1' , '0' ); |
11 |
INSERT INTO `categories` VALUES ( '8' , '笔记本' , null , '7' , '6,7,8' , '3' , '1' , '0' ); |
12 |
INSERT INTO `categories` VALUES ( '9' , '平板电脑' , null , '7' , '6,7,9' , '3' , '1' , '0' ); |
13 |
INSERT INTO `categories` VALUES ( '10' , '服务器' , null , '7' , '6,7,10' , '3' , '1' , '0' ); |
14 |
INSERT INTO `categories` VALUES ( '11' , '家用电器' , null , '0' , '11' , '1' , '1' , '0' ); |
15 |
INSERT INTO `categories` VALUES ( '12' , '厨房电器' , null , '11' , '11,12' , '2' , '1' , '0' ); |
16 |
INSERT INTO `categories` VALUES ( '13' , '电饭锅' , null , '12' , '11,12,13' , '3' , '1' , '0' ); |
17 |
INSERT INTO `categories` VALUES ( '14' , '大家电' , null , '11' , '11,14' , '2' , '1' , '0' ); |
18 |
INSERT INTO `categories` VALUES ( '15' , '冰箱' , null , '14' , '11,14,15' , '3' , '1' , '0' ); |
插入数据之后,数据表大概就成了这个样子:
现在就很直观了吧,每个字段大概有什么作用,应该也能看出来了。
数据表字段简单说明:
列名 |
数据类型 |
默认值 |
备注 |
id |
int |
|
自增主键 |
name |
varchar(50) |
|
分类类别名称 |
parenid |
int |
0 |
父母分类Id |
parenid_list |
varchar(20) |
0 |
分类的层级关系,从最高级到自己 |
Depth |
varchar(10) |
1 |
深度,从1递增 |
Status |
varchar10) |
1 |
状态:0禁用,1启用 |
Priority |
varchar(10) |
0 |
优先级,越大,同级显示的时候越靠前 |
大概就设计成这样,为什么要这样设计,后面章节慢慢叙述。当然会有设计上不合理的地方,仅仅抛砖引玉