组织机构数据隔离(上级可看下级,同级屏蔽)的高效实现思路

组织机构数据隔离(上级可看下级,同级屏蔽)的高效实现思路

刘老板

刘老板

2024年5月14日 08:32

背景

在WEB开发中,采用前后端分离,要求对用户数据权限进行控制:

1.上级组织可查看下级组织的数据,同级别不能相互查看;
2.可设置仅查看自己创建的数据;
3.在数据库结构设计时,通常将组织机构设计为树形结构,表结构“Id,Name,ParentId。。。”
Id	Name	 ParentId	Level 
1	总公司	 0	        1 
2	分公司1	 1	        2 
3	分公司2	 1	        2 
4	部门A	 2	        3 
5	部门B	 3	        3 
6	部门C	 2	        3

这样设计表结构清晰明了,可添加多级组织架构。不过,获得某人所在层级和所有下级列表时,SQL使用递归等方法效率较低,通常的做法是:

  1. 用户A已登陆,并携带token访问API,查询订单Order003
  2. API根据用户Id获得其所在组织及下级组织列表IdList
  3. 查询得知订单Order003是用户B创建的
  4. 获得B所以组织Id,并验证是否在IdList中
  5. 如果有权访问,则返回Order003订单数据,否则返回“无权查看”信息

以上步骤在SQL查询语句中虽然可通过多表JION及WHERE条件来实现,但运行效率很低,关键是这种权限验证非常频繁,造成系统整体运行效率低下,需要找一个更高效的方法来实现。

方案一

咱们俩博客

指导思想是“以空间换时间”
组织机构表设计成非树形结构
组织代码为BIGINT类型,最多9级,每级代码由两位数字组成(10-99)
订单表中增加一个字段:创建人组织代码
--用户A是【A大区E公司】的,组织代码为111400,查询订单Order003,
SQL大致如下:select*from OrderTable where id='Order003'and num between 111400 and 111499

是否有权限查看该条数据通过num between 111400 and 111499来控制,如果无权查看,则返回空,执行效率几乎与无鉴权时相同。

方案二

咱们俩博客

本方案是在【方案一】的基本上进行改造,降低程序代码实现难度
组织代码字段为VARCHAR类型,格式为xx.yy.zz.
组织层级数不限,只要代码字段设置足够大
--用户A是【A大区E公司】的,组织代码为1.1.,查询订单Order003,
SQL大致如下:select * from OrderTable where id='Order003' and num like '1.1.%'


转载:https://www.cnblogs.com/zhaoshujie/p/13684951.html

标签:
数据库
原文链接:链接
THE END
点赞(1)
收藏
评论(0)
分享