V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
johnsona
V2EX  ›  Python

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

  •  1
     
  •   johnsona · 2020-05-23 15:12:53 +08:00 · 2912 次点击
    这是一个创建于 1426 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前打算用 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 这个接口,会不会比较麻烦,各位怎么看

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

    17 条回复    2020-07-12 17:32:35 +08:00
    johnsona
        1
    johnsona  
    OP
       2020-05-23 15:26:14 +08:00
    sigh
    yc8332
        2
    yc8332  
       2020-05-23 15:33:03 +08:00
    不用外键就不能连表查找了吗?只是不在数据库定义外键而已。
    xuanbg
        3
    xuanbg  
       2020-05-23 15:42:29 +08:00
    手写 sql
    johnsona
        4
    johnsona  
    OP
       2020-05-23 15:43:17 +08:00
    @yc8332 可是麻烦呀,另外创建数据需要把几张表的数据创建放在一个事务中,这是不是就和外键一样了
    johnsona
        5
    johnsona  
    OP
       2020-05-23 16:54:33 +08:00
    @xuanbg 表连接吗
    youngce
        6
    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
        7
    JellyDong  
       2020-05-23 17:11:09 +08:00
    不知道这个表行不,之前自己看一些资料摸索的 https://github.com/jellydong/LJDAPP
    可以控制到按钮
    johnsona
        8
    johnsona  
    OP
       2020-05-23 17:21:03 +08:00
    @youngce 没有,我也知道 django 有这个,这个实际上是底层执行了 join 语句?
    johnsona
        9
    johnsona  
    OP
       2020-05-23 17:22:36 +08:00
    @JellyDong 用的外键
    anaf
        10
    anaf  
       2020-05-23 18:17:41 +08:00
    我做了个项目,包含有权限系统的 。做成了视频 代码放了 github 但是鉴于没人观看 我来打打广告 行嘛 V 友们

    https://www.bilibili.com/video/BV1x5411s7ik/
    johnsona
        11
    johnsona  
    OP
       2020-05-24 07:36:27 +08:00
    @anaf tui
    anaf
        12
    anaf  
       2020-05-24 10:58:00 +08:00
    @jsisjs20130824 欢迎关注 往后会出更多 python/IT 工具人相关的视频
    gjquoiai
        13
    gjquoiai  
       2020-05-24 17:26:22 +08:00
    relationship 可以自定义连接方式
    johnsona
        14
    johnsona  
    OP
       2020-05-25 13:47:50 +08:00
    @gjquoiai 那个自定义的方式处理多对多还是不行,没办法跨过中间表,而且是不是会产生笛卡尔查询
    johnsona
        15
    johnsona  
    OP
       2020-05-25 19:38:12 +08:00
    更新,我把中间表去掉了,中间表不用外键,那么中间表的数据数据库没办法帮你保持一致性,举个例子,角色权限,我更新这个用户的权限列表,我去中间表中根据 role_id 查出所有 permission_id,然后把新增 permission_id 加进来,老的 permission_id 去掉,还要每次保证 role_id permission_id 唯一,好几把麻烦,直接干掉中间表,permission 用列表替代,爽多了
    hsluoyz
        16
    hsluoyz  
       2020-05-26 16:59:39 +08:00
    没必要自己写,用 Casbin
    johnsona
        17
    johnsona  
    OP
       2020-07-12 17:32:35 +08:00
    自己解决了,不用外键是指不用数据库外键,orm 里面的对象关联还是那么写,然后创建数据表不要用 flask-migrate,这会创建数据库的外键,自行写 sql 脚本执行 ddl,其他照旧,完事
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3577 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 00:45 · PVG 08:45 · LAX 17:45 · JFK 20:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.