组织机构是典型的层次树结构表,以下就以组织为例开始分析
1. 部门机构树如下
┌─────────────── │ │ 部门 │ │ │ ├─技术部 │ │ │ │ │ ├─技术1部 │ │ │ │ │ └─技术2部 │ │ │ ├─市场部 │ │ │ │ │ ├─市场1部 │ │ │ │ │ └─市场2部 │ │ │ └─客服部 │ └─────────────── |
2. 数据库表 org
标识 | 父标识 | 所有父标识 | 名称 | 编码 | 父编码 | 所有父编码 | 叶子 | 级别 |
id | parent_id | parent_ids | text | code | parent_code | parent_codes | leaf | grade |
1 | '1' | 部门 | 00 | '00' | 0 | 1 | ||
2 | 1 | '1','2' | 技术部 | 0001 | 00 | '00','0001' | 0 | 2 |
3 | 2 | '1','2','3' | 技术 1 部 | 000101 | 0001 | '00','0001','000101' | 1 | 3 |
4 | 2 | '1','2','4' | 技术 2 部 | 000102 | 0001 | '00','0001','000102' | 1 | 3 |
5 | 1 | '1','5' | 市场部 | 0002 | 00 | '00','0002' | 0 | 2 |
6 | 5 | '1','5','6' | 市场 1 部 | 000201 | 0002 | '00','0002','000201' | 1 | 3 |
7 | 5 | '1','5','7' | 市场 2 部 | 000201 | 0002 | '00','0002','000202' | 1 | 3 |
8 | 1 | '1','8' | 客服部 | 0003 | 00 | '00','0003' | 1 | 2 |
3. 这样设计的好处
(1) | 上下级关系变化时修改code即可,不需要修改主键id |
(2)
| 有了code可以方便查看所有子节点信息 ,比如查看id为1的所有子节点信息 根据id(1)先获取code(0001)再执行select * from org where code like '0001%' |
(3)
| 有了parent_codes可以方便查看所有父节点信息 ,比如查看id为6的所有父节点信息 根据id(6)先获取parent_codes再执行select * from org where code in ('00','0002','000201') |
(4)
| 有了leaf可以方便查看所有叶子和非叶子节点信息 ,比如查看所有叶子节点信息 select * from org where leaf = '1' |
(5)
| 有了grade可以方便查看某级别的节点信息 ,比如查看层次树级别为2的节点信息 select * from org where grade = '2' |
4. 注意事项
(1)
| 根节点code的值必须是00 不合法:01、02、10、20 |
(2)
| 子节点code的值必须是“父节点code + 序号(不能是00)” 合法:0001、0002、000101 不合法:01、0000、0101、000100 |