组织机构树型数据库结构
2015-09-09 15:27
375 查看
之前做的一个系统,里面涉及一个组织机构,之前也做过,之前做得非常简单普遍
数据库表结构主要是一个主键id,名称name,一个父级外键parent_id
比如
id name parent_id
1 汕头公司 null
2 计算机中心 1
3 人事部 1
类似这样,相信大家都能想到,添加,修改都很方便,但查询就出现一个问题,就是比如你想得到汕头公司里面的员工,包括子部门的话,就必须得用递归,递归这东西,想起来很伤脑的,如果层数比较多,数据量比较大的话还非常耗性能的。
那为了查询性能就必须增加一些辅助的字段,百度上有介绍过一种添加左右键的,意义我看半天就只懂了一点,但是涉及到修改,比较移动位置的话,里面介绍的得把全部的左右键重新设置,我又看不太懂了,脑子有点笨,越看越晕,所以就不再研究了,不过这个辅助字段是是int的,相信这种查询是很快的。
后面我想了另一个数据库结构,也是比较通俗易懂,适合我这么笨的人。
我直接上数据吧,相信比我聪明的人一看就知道了。
如图,我主要是增加了一个parent_ids这个字段,这个字段主要记录了,当前的部门上级部门总共有哪些部门。
那么当你要查询时,你可以这样,比如你要查询汕头公司(id 为149)以下包括子部门所有的员工
这样里面用的是like 可能效率不高,但至少不用递循了,也比较容易理解。
如果你要移动的话,这个可能理解起来有点麻烦,我一开始也是忽略其中一些小问题,导致移动位置时parent_ids出错了
比如你要移动汕头公司(id为149)到上海公司(id为148)里面
最好用事务处理
首先查询到上海公司的parent_ids为1,,那么汕头公司的parent_ids就为1,148,了
然后还得更新汕头公司所有子部门的parent_ids
懂了查询跟修改,那删除也是比较简单的
新增就更简单了,这儿就是写了。
希望对大家有用处。
数据库表结构主要是一个主键id,名称name,一个父级外键parent_id
比如
id name parent_id
1 汕头公司 null
2 计算机中心 1
3 人事部 1
类似这样,相信大家都能想到,添加,修改都很方便,但查询就出现一个问题,就是比如你想得到汕头公司里面的员工,包括子部门的话,就必须得用递归,递归这东西,想起来很伤脑的,如果层数比较多,数据量比较大的话还非常耗性能的。
那为了查询性能就必须增加一些辅助的字段,百度上有介绍过一种添加左右键的,意义我看半天就只懂了一点,但是涉及到修改,比较移动位置的话,里面介绍的得把全部的左右键重新设置,我又看不太懂了,脑子有点笨,越看越晕,所以就不再研究了,不过这个辅助字段是是int的,相信这种查询是很快的。
后面我想了另一个数据库结构,也是比较通俗易懂,适合我这么笨的人。
我直接上数据吧,相信比我聪明的人一看就知道了。
如图,我主要是增加了一个parent_ids这个字段,这个字段主要记录了,当前的部门上级部门总共有哪些部门。
那么当你要查询时,你可以这样,比如你要查询汕头公司(id 为149)以下包括子部门所有的员工
SELECT e.* from employee e INNER JOIN org o on e.org_id=o.id where o.id=149 or FIND_IN_SET(149,o.parent_ids);
这样里面用的是like 可能效率不高,但至少不用递循了,也比较容易理解。
如果你要移动的话,这个可能理解起来有点麻烦,我一开始也是忽略其中一些小问题,导致移动位置时parent_ids出错了
比如你要移动汕头公司(id为149)到上海公司(id为148)里面
最好用事务处理
首先查询到上海公司的parent_ids为1,,那么汕头公司的parent_ids就为1,148,了
update org set parent_ids='1,148,',parent_id=148 where id=149
然后还得更新汕头公司所有子部门的parent_ids
update org set parent_ids=CONCAT('1,148,',SUBSTRING_INDEX(parent_ids,'1,',-1)) where FIND_IN_SET(149,parent_ids);这一步可能很多同学看不懂,我刚开始也忽略了这一步,后面移动位置时,parent_ids就出错了。
懂了查询跟修改,那删除也是比较简单的
DELETE * from org where o.id=149 or FIND_IN_SET(149,parent_ids);
新增就更简单了,这儿就是写了。
希望对大家有用处。
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马
- 分割超大Redis数据库例子
- 重装主控服务器后,数据库连接失败的解决办法:请正确还原数据库。