首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
OPPO Watch
jsisjs20130824
V2EX  ›  Python

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

  •  
  •   jsisjs20130824 · 2 天前 · 983 次点击

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

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

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

    https://www.bilibili.com/video/BV1x5411s7ik/
    jsisjs20130824
        11
    jsisjs20130824   1 天前
    @anaf tui
    anaf
        12
    anaf   1 天前
    @jsisjs20130824 欢迎关注 往后会出更多 python/IT 工具人相关的视频
    gjquoiai
        13
    gjquoiai   1 天前
    relationship 可以自定义连接方式
    jsisjs20130824
        14
    jsisjs20130824   6 小时 11 分钟前
    @gjquoiai 那个自定义的方式处理多对多还是不行,没办法跨过中间表,而且是不是会产生笛卡尔查询
    jsisjs20130824
        15
    jsisjs20130824   20 分钟前
    更新,我把中间表去掉了,中间表不用外键,那么中间表的数据数据库没办法帮你保持一致性,举个例子,角色权限,我更新这个用户的权限列表,我去中间表中根据 role_id 查出所有 permission_id,然后把新增 permission_id 加进来,老的 permission_id 去掉,还要每次保证 role_id permission_id 唯一,好几把麻烦,直接干掉中间表,permission 用列表替代,爽多了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3339 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 11:59 · PVG 19:59 · LAX 04:59 · JFK 07:59
    ♥ Do have faith in what you're doing.