树形结构在我们的日常开发中经常用到,很多功能为了展示层次关系往往都使用树形结构来存储,对于树形结构数据表设计,也有多种方案供我们选择,接下来我就介绍下树形结构表设计的一些基本方案。以组织结构中的部门表(department)为例
- 常规设计。一张表搞定,记录父级id即可,如下:
CREATE TABLE `department` (
`departmentid` smallint(5) unsigned NOT NULL auto_increment, // 部门流水ID
`title` varchar(90) NOT NULL default ”, // 部门名称
`parentid` smallint(5) unsigned NOT NULL default ‘0’, // 部门上级ID
·path` varchar(60) NOT NULL default ”, // 部门路径Id
`displayorder` smallint(6) unsigned NOT NULL default ‘1000’, // 部门显示顺序
PRIMARY KEY (`departmentid`),
KEY `parentid` (`parentid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
数据表记录数据如下:部门ID 部门名称 父级ID 路径 显示顺序 1 技术开发部 0 1 2 开发组 1 1 2 3 开发A组 2 1,2 3 - 基于左右值编码。
CREATE TABLE `department` (
`departmentid` smallint(5) unsigned NOT NULL auto_increment, // 部门流水ID
`title` varchar(90) NOT NULL default ”, // 部门名称
`parentid` smallint(5) unsigned NOT NULL default ‘0’, // 部门上级ID
`lft` smallint(6) unsigned NOT NULL default ‘0’, // 左值
`rght` smallint(6) unsigned NOT NULL default ‘0’, // 右值
PRIMARY KEY (`departmentid`),
KEY `parentid` (`parentid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
数据表记录数据如下:部门ID 部门名称 父级ID 左值 右值 1 技术开发部 0 1 6 2 开发组 1 2 5 3 开发A组 2 3 4
- 节点表 + 关系表
CREATE TABLE `department` (
`departmentid` smallint(5) unsigned NOT NULL auto_increment, // 部门流水ID
`title` varchar(90) NOT NULL default ”, // 部门名称
`displayorder` smallint(6) unsigned NOT NULL default ‘1000’, // 部门显示顺序
PRIMARY KEY (`departmentid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE `departmentrelation` (
`parentid` smallint(5) unsigned NOT NULL default ‘0’, // 节点父级ID
`childid` smallint(5) unsigned NOT NULL default ‘0’, // 节点ID
`level` smallint(3) unsigned NOT NULL default ‘0’, // 节点深度
PRIMARY KEY (`childid`,`parentid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
数据表记录数据如下:
部门表(department)部门ID 部门名称 显示顺序 1 技术开发部 1 2 开发组 2 3 开发A组 3 关系表(departmentrelation)
父级ID 子级ID 节点深度 1 1 0 1 2 1 2 2 1 1 3 2 2 3 2 3 3 2