RBAC模块时的一点点遍历问题

权限管理模块时的一点点遍历问题记录



基于角色的权限访问控制(Role-Based Access Control)是一种经典的权限管理模型,在项目中经常使用。

在做此模块的时候,因为涉及到了权限的存储问题,所以表的设计是id name parent_id的存储模式。因此我们可以将这种结构看成树形结构,通过父子节点的连接来确定位置。

我们可以通过ArrayList将所有的父子节点存储起来,传到前端供其使用

可是如果子节点下还有分支,就需要添加List,并将孙节点信息存储。因为父节点-子节点-孙节点的结构是相同的,只是所属层级不同,我们就想到了使用递归算法来遍历获取。

这样似乎可以完美解决了分支的动态增删,可是如果考虑到数据库性能是否可行?

每次遍历一层节点都需要查询一次数据库,多层查询就需要多少次数据库查询,这样对数据库资源是一种浪费

因此先将所有数据一次性查询出来,然后再在代码中进行逻辑处理,更为合理

特此记录

递归获取树形结构内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Set<Category> categorySet = Sets.newHashSet();
findChildCategory(categorySet, categoryId);

private Set<Category> findChildCategory(Set<Category> categorySet, Integer categoryId) {
Category category = categoryMapper.selectByPrimaryKey(categoryId);
if (category != null) {
categorySet.add(category);
}
//查找子节点,递归算法一定要有一个退出条件
List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId);
for (Category categoryItem : categoryList) {
findChildCategory(categorySet, categoryItem.getId());
}
return categorySet;
}

嵌套for循环获取树形结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
List<Permission> permissions = new ArrayList<Permission>();
// 查询所有的权限permission
List<Permission> ps = permissionService.queryAll();

for (Permission : ps) {
// 子节点
Permission child = p;
if (p.getPid() == 0) {
// 顶级节点
permission.add(p);
} else {
for (permission innerPermission : ps) {
if (child.getPid().equals(innerPermission.getId())) {
// 父节点
Permission parent = innerPermission;
// 组合父子节点的关系
parent.getChildren().add(child);
}
}
}
}
return permission;

使用Map获取

使用map就可以使用到索引进行查询,所以效率比仅用for循环更高

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
List<Permission> permissions = new ArrayList<Permission>();
// 查询所有的权限permission
List<Permission> ps = permissionService.queryAll();

Map<Integer, Permission> permissionMap = new HashMap<Integer, Permission>();
for (Permission p : ps) {
permissionMap.put(p.getId(), p);
}

for (Permission p : ps) {
Permission child = p;
if (child.getPid() == 0) {
Permissions.add(p)
} else {
Permission parent = permissionMap.get(child.getPid());
parent.getChildren().add(child);
}
}
return permission;


本文标题:RBAC模块时的一点点遍历问题

文章作者:ProYI

发布时间:2019年01月06日 - 22:01

最后更新:2022年02月06日 - 16:02

原始链接:https://ProYI.github.io/post/a831b05.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际转载请保留原文链接及作者。

0%
;