层次结构的数据库处理
2010-03-12 00:00:00 来源:WEB开发网原文地址:http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
作者:Mike Hillyer
翻译:陈建平 chinaontology@gmail.com
大部分的开发者都会遇到要在SQL数据库中处理层状数据的问题,也都知道关系数据库其实并不擅长此道。关系数据库中的表并不是层次状的(XML是层次结构),而是扁平的列表。层状数据中的父子关系无法在关系表中自然地表达。
层状数据是一个集合,集合当中的元素都有唯一的父节点和零个或多个的子节点(根节点除外,它无父节点)。层状数据广泛应用于数据库应用系统当中,包括了论坛、邮件列表、商业组织结构、内容管理分类和产品分类等。为了说明问题,我们使用一个虚拟的电子商店的产品分类层次作为例子。
查看原图(大图)
这些产品分类形成一个层状结构,与上面提到的其他应用系统当中的结构类似。在这篇文章当中,我们将在 MySQL 中使用两种处理方式,先使用传统的邻接表模型。
邻接表模型
典型的做法下,范例中的分类数据将被存储于如下结构的表中(为了方便读者,我已经包含了完整的CREATE 和 INSERT 命令)
CREATE TABLE category(
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
parent INT DEFAULT NULL);
INSERT INTO category
VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),
(4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),
(7,'MP3 PLAYERS',6),(8,'FLASH',7),
(9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);
SELECT * FROM category ORDER BY category_id;
+-------------+----------------------+--------+
| category_id | name | parent |
+-------------+----------------------+--------+
| 1 | ELECTRONICS | NULL |
| 2 | TELEVISIONS | 1 |
| 3 | TUBE | 2 |
| 4 | LCD | 2 |
| 5 | PLASMA | 2 |
| 6 | PORTABLE ELECTRONICS | 1 |
| 7 | MP3 PLAYERS | 6 |
| 8 | FLASH | 7 |
| 9 | CD PLAYERS | 6 |
| 10 | 2 WAY RADIOS | 6 |
+-------------+----------------------+--------+
10 rows in set (0.00 sec)
更多精彩
赞助商链接