设计一个无限级分类的数据表是一个很常见的数据库任务。比如你写一个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 |
优先级,越大,同级显示的时候越靠前 |
大概就设计成这样,为什么要这样设计,后面章节慢慢叙述。当然会有设计上不合理的地方,仅仅抛砖引玉