层次结构的数据库处理
2010-03-12 00:00:00 来源:WEB开发网这中方法的主要局限是,你必须在每个层次上进行自连接,性能自然会随着复杂连接的增加而下降。
邻接表模型的局限
使用纯SQL来处理邻接表模型很难做到最好。如果要找到完整的路径,我们必须先知道其所在的层次。其次,还必须特别注意删除操作带来的整棵子树被孤儿化(例如删除 portable electronics 节点,其下的所有子节点都将变成孤儿节点)。可以通过客户端的代码或者存储过程来处理此类问题。通过程序语言处理,先从树的底层开始向上循环以取得整个树或者单条路径。在删除操作时,可以将子节点的层次提升以及重新排序子节点,让其指向新的父节点,以此来避免孤儿节点的产生。
嵌套集合模型
我在此文中推荐的模型采用一种不同的方法,通常称为“嵌套集合模型”。在此模型中,我们用另一种全新的方式来看层状数据,不再是节点与连线,而是层次嵌套的容器。试着画出我们的电子产品分类:
查看原图(大图)
注意层次结构是怎样保持的,父类包裹着他们的子节点。我们通过为节点添加代表嵌套关系的左、右值,来将结构信息保存到表当中。
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 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
+-------------+----------------------+-----+-----+
更多精彩
赞助商链接