MYSQL 中分层数据的管理
该分类所在的层次。另外,我们在删除节点的时候要特别小心,因为潜在的可能会孤立一棵
子树(当删除 portable electronics 分类时,所有他的子分类都成了孤儿)。部分局限性
可以通过使用客户端代码或者存储过程来解决,我们可以从树的底部开始向上迭代来获得一
颗树或者单一路径,我们也可以在删除节点的时候使其子节点指向一个新的父节点,来防止
孤立子树的产生。
嵌套集合(Nested Set)模型
我想在这篇文章中重点阐述一种不同的方法,俗称为嵌套集合模型。在嵌套集合模型中,我
们将以一种新的方式来看待我们的分层数据,不再是线与点了,而是嵌套容器。我试着以嵌
套容器的方式画出了 electronics 分类图:
从上图可以看出我们依旧保持了数据的层次,父分类包围了其子分类。在数据表中,我们通
过使用表示节点的嵌套关系的左值(left value)和右值(right value)来表现嵌套集合模型
中数据的分层特性:
CREATE TABLE nested_category (
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
lft INT NOT NULL,
rgt INT NOT NULL
);
INSERT INTO nested_category
VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),
(4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),
(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),
(9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);
SELECT * FROM nested_category ORDER BY category_id;
+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
第 4 页/总 16 页