对树形数据存储的表设计

闭包表

闭包表是解决分级存储的一个简单而优雅的解决方案,它记录了树中所有节点间的关系,而不仅仅只有那些直接的父子节点。

方案 表数量 查询子 查询树 插入 删除 引用完整性
邻接表 1 简单 困难 简单 简单
枚举路径 1 简单 简单 简单 简单
嵌套集 1 困难 简单 困难 困难
闭包表 2 简单 简单 简单 简单

邻接表

常用的邻接表设计, 都会增加一个 parent_id 字段

比如区域表

1
2
3
4
5
6
7
8
9
CREATE TABLE `oa_dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`parentId` int(11) DEFAULT '0' COMMENT '上级ID',
`parentdept` varchar(64) DEFAULT '' COMMENT '上级部门名称',
`deptcode` varchar(32) DEFAULT '' COMMENT '部门编码',
`deptname` varchar(64) DEFAULT '' COMMENT '部门名称',
`createrid` int(11) DEFAULT '0' COMMENT '创建人ID',
`creater` varchar(11) DEFAULT '' COMMENT '创建人',
)

路径枚举

路径枚举则是存储一条节点对于树的路径, 就好像unix的路径一样.

嵌套集

嵌套集解决方案是存储子孙节点的相关信息,而不是节点的直接祖先。我们使用两个数字来编码每个节点,从而表示这一信息,可以将这两个数字称为nsleft 和 nsright。

参考文档