组织机构树数据库表设计

Posted blog-cq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了组织机构树数据库表设计相关的知识,希望对你有一定的参考价值。

公司需要做一个组织机构管理的系统,但是现有的数据库中存储的方式,机构之间的关联只是通过parent_id关联的,这样在查询的时候需要不断的递归查询表数据,性能很差,逻辑也不清晰。所以在网上找到了几种针对这种树状结构存储,查询插入的优化方法

1.发现几种树结构数据库存储方案

2.聊聊树状结构如何在数据库中存储

3.组织机构树设计 

1.2两种有点复杂了,第三个连接有一位答主介绍了一种快捷查询的方法

 1 很麻烦的做法。
 2 简单的只需要在原表里加一列就行了:
 3 
 4 组织机构简洁字段设计:
 5 
 6 (ogran_code是组织机构唯一代码,真正的系统里都会有这东西的)
 7 
 8 id,name,ogran_code,parent_id
 9 
10 快速查询字段设计:
11 
12 id,name,ogran_code,parent_id,code_link
13 
14 (code_link是从根到该机构的整个code链条,例如: "root_code"+"first_code"+"child_code")
15 分隔符自定义即可
16 添加编辑机构时只关注该机构的父机构,在父机构的link上添加本机构的部分:  "pareat_code_link"+"local_code"
17 
18 任何查询都可以通过这个字段快速完成。
19 
20 1,某机构所有子机构,查询所有包含某机构CODE的CODE_LINK即可。可以使用like,超级简单。
21 2,查询Level,拆分该字段即可。
22 
23 总之,很方便记录的一个链路LINK,可以做到任意需要递归才可以完成的查询。

 

 

 用图表分析了一下

 

技术图片

  • 当插入(1总公司)

  id  code_link

  1  0_null_null

  • 在(1总公司)下插入(2上海分公司),总公司的child_code为2,上海分公司的root_code为1

  id  code_link

  1  0_null_2

  2  1_null_null

  • 在(1总公司)下插入(3深圳分公司),总公司的child_code为2,3,上海分公司的root_code为1

  id  code_link

  1  0_null_2,3

  2  1_null_null

  3  1_null_null

  • 在(2上海分公司)下插入(4徐汇办事处),上海分公司的child_code为4,徐汇办事处的first_code为2

  id  code_link

  1  0_null_2,3

  2  1_null_4

  3  1_null_null

  4  1_2_null

  • 在(2上海分公司)下插入(5闵行办事处),上海分公司的child_code为4,5,闵行办事处的first_code为2

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_null

  4  1_2_null

  5  1_2_null

  • 在(3深圳分公司)下插入(6人事部),深圳分公司的child_code为6,人事部的first_code为3

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6

  4  1_2_null

  5  1_2_null

  6  1_3_null

  • 在(3深圳分公司)下插入(7财务部),深圳分公司的child_code为6,7,财务部的first_code为3

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_null

  5  1_2_null

  6  1_3_null

  7  1_3_null

  • 在(4徐汇办事处)下插入(8研发部),徐汇办事处的child_code 为8,研发部的first_code为2,4(带上徐汇办事处的first_code 2)

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_8

  5  1_2_null

  6  1_3_null

  7  1_3_null

  8  1_2,4_null

  • 在(4徐汇办事处)下插入(9市场部),徐汇办事处的child_code 为8,9,市场部的first_code为2,4(带上徐汇办事处的first_code 2)

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_8,9

  5  1_2_null

  6  1_3_null

  7  1_3_null

  8  1_2,4_null

  9  1_2,4_null

  • 在(9市场部)下插入(10市场调研小组),市场部的child_code为10,市场调研小组的first_code为2,4,9(带上市场部的first_code)

  id  code_link

  1  0_null_2,3

  2  1_null_4,5

  3  1_null_6,7

  4  1_2_8,9

  5  1_2_null

  6  1_3_null

  7  1_3_null

  8  1_2,4_null

  9  1_2,4_10

  10   1_2,4,9_null

 

至此,查询一个机构的子机构只需查询root_code和first_code中含有此节点id的数据

例如,查询(2上海分公司)的子机构,则为4,5,8,9,10

查询(4徐汇办事处)的子机构,则为8,9,10


  

以上是关于组织机构树数据库表设计的主要内容,如果未能解决你的问题,请参考以下文章

Web中树形数据(层级关系数据)的实现—以行政区树为例

mysql递归查询

PostgreSQL - 树组织

无限级分类实现思路 (组织树的分级管理)

AppBoxFuture: 组织结构与权限体系

大学二年级数据结构课程设计问题