rbac 权限系统不用外键以后,关联操作变麻烦了(救救纠结的孩子吧)

2020-05-23 15:12:53 +08:00
 johnsona

目前打算用 rbac 管理公司项目的权限,建立了五张表,user,role,permission,role_permission,user_role,不使用外键,我使用的是 sqlalchemy 。 现在问题是:

1.不使用外键之后,查询操作好像变麻烦了,比如我要查用户,带出他的角色,那我就要先查出用户,根据 user_id 再执行一次操作,从 user_role 中找出 role_id,如果需要角色名信息,我还要用 role_id 去 role 表中再查出 role_name 。感觉自己要手动执行三次 sql 查询,麻烦了。 还有就是,我创建用户,需要先从 role 表中查询出 role_id,然后把用户数据插入 user 表,再拿到 user_id 和 role_id 一起插入 user_role 表,一次查询和两次插入,都是自己手动在 orm 中维护,代码量增加不少,变得更麻烦了。而且两次插入我是启事务执行的,这个是不是就变得和外键一样了?

2.rbac 是在后台给角色配权限名,那开发者每写一个接口,都去后台指定哪些角色可以 access 这个接口,会不会比较麻烦,各位怎么看

各位大佬给萌新一个建议吧。 感觉自己好纠结,开发也有两年了,每每做项目都会纠结,好不开心啊,可每当我写起代码时,思索逻辑时,我心中仍然还有热情,大佬们指点一下吧

3048 次点击
所在节点    Python
17 条回复
johnsona
2020-05-23 15:26:14 +08:00
sigh
yc8332
2020-05-23 15:33:03 +08:00
不用外键就不能连表查找了吗?只是不在数据库定义外键而已。
xuanbg
2020-05-23 15:42:29 +08:00
手写 sql
johnsona
2020-05-23 15:43:17 +08:00
@yc8332 可是麻烦呀,另外创建数据需要把几张表的数据创建放在一个事务中,这是不是就和外键一样了
johnsona
2020-05-23 16:54:33 +08:00
@xuanbg 表连接吗
youngce
2020-05-23 17:01:31 +08:00
class Employee:
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
company = models.ForeignKey(Company, on_delete=models.CASCADE, db_constraint=False)

django 的 orm 可以通过 db_constraint 设定外键为逻辑外键,不在数据库建立物理外键。sqlalchemy 难道没有类似的功能?
JellyDong
2020-05-23 17:11:09 +08:00
不知道这个表行不,之前自己看一些资料摸索的 https://github.com/jellydong/LJDAPP
可以控制到按钮
johnsona
2020-05-23 17:21:03 +08:00
@youngce 没有,我也知道 django 有这个,这个实际上是底层执行了 join 语句?
johnsona
2020-05-23 17:22:36 +08:00
@JellyDong 用的外键
anaf
2020-05-23 18:17:41 +08:00
我做了个项目,包含有权限系统的 。做成了视频 代码放了 github 但是鉴于没人观看 我来打打广告 行嘛 V 友们

https://www.bilibili.com/video/BV1x5411s7ik/
johnsona
2020-05-24 07:36:27 +08:00
@anaf tui
anaf
2020-05-24 10:58:00 +08:00
@jsisjs20130824 欢迎关注 往后会出更多 python/IT 工具人相关的视频
gjquoiai
2020-05-24 17:26:22 +08:00
relationship 可以自定义连接方式
johnsona
2020-05-25 13:47:50 +08:00
@gjquoiai 那个自定义的方式处理多对多还是不行,没办法跨过中间表,而且是不是会产生笛卡尔查询
johnsona
2020-05-25 19:38:12 +08:00
更新,我把中间表去掉了,中间表不用外键,那么中间表的数据数据库没办法帮你保持一致性,举个例子,角色权限,我更新这个用户的权限列表,我去中间表中根据 role_id 查出所有 permission_id,然后把新增 permission_id 加进来,老的 permission_id 去掉,还要每次保证 role_id permission_id 唯一,好几把麻烦,直接干掉中间表,permission 用列表替代,爽多了
hsluoyz
2020-05-26 16:59:39 +08:00
没必要自己写,用 Casbin
johnsona
2020-07-12 17:32:35 +08:00
自己解决了,不用外键是指不用数据库外键,orm 里面的对象关联还是那么写,然后创建数据表不要用 flask-migrate,这会创建数据库的外键,自行写 sql 脚本执行 ddl,其他照旧,完事

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/674677

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX