設計一個無限級分類的數據表是一個很常見的數據庫任務。比如你寫一個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 |
優先級,越大,同級顯示的時候越靠前 |
大概就設計成這樣,為什么要這樣設計,后面章節慢慢敘述。當然會有設計上不合理的地方,僅僅拋磚引玉