【问题标题】:Better way to represent user roles in a database在数据库中表示用户角色的更好方法
【发布时间】:2012-10-17 15:50:55
【问题描述】:

是在用户表中更好地表示用户权限还是在自己的权限表中更好?

用户表中的权限
将权限放在用户表中意味着为用户表中的每个权限创建一列。一个优点是查询应该运行得更快,因为在将用户与用户权限相关联时不需要连接。缺点是权限列过多会使用户表变得混乱。

权限表中的权限以多对多关系连接到用户表
这样做可以干净地将权限与用户表分开,但它需要跨两个表连接才能访问用户权限。数据库访问可能会更慢,但数据库设计看起来更简洁。

当有许多权限时,将权限保存在单独的表中可能会更好。做出此决定时还有哪些其他考虑因素,以及在各种情况下哪种设计更好?

【问题讨论】:

    标签: database database-design user-permissions


    【解决方案1】:

    访问控制的标准模式称为基于角色的安全性。随着用户数量您需要的不同类型权限数量的增长,您的用户到权限链接的管理可能会变得越来越困难。

    例如,如果您有 5 个管理员和 50 个用户,您如何保持每个组的权限同步?当您的一位用户被提升为管理员时,您需要进行多少次编辑?答案是创建两个交集:users-to-rolesroles-to-permissions

    我对@9​​87654321@的回答中描述了这个解决方案(包括实体关系图)。

    【讨论】:

    • 这对于更复杂的应用程序来说是一个可靠的答案。正如@Nurkeiwicz 所说,一个简单的应用程序甚至可能不需要滚动表或权限表。
    • 图不错,你用的什么工具?
    • @dangerousdave - 抱歉延迟回复,我已经出城了。我将 Visio 与自定义智能形状一起使用,这些形状是为了使用 James Martin ERD 视觉约定和自定义线条图案而构建的,使其具有手绘外观。
    • 我一直错过角色成员表。这个回复让我很开心,因为它解决了很多问题,这些问题可能会在项目变得更大时出现。
    • @steampowered 这种方法能否使用增量类型的用户角色权限(基于其他方法)。考虑这些权限:搜索、发布、评论、管理用户。我想拥有:访客(搜索)、用户(搜索、发布、评论)、管理员(搜索、发布、评论、管理用户)。我可以这样说:访客(搜索),用户是访客+(帖子,评论),管理员是用户+(管理用户)吗?这会是一个编程混乱吗?
    【解决方案2】:

    当不同角色/权限的数量相对较少时,您的第一种方法是可行的。例如,如果您只有两种类型的用户:普通用户和管理员,单独的表看起来有点过头了。单个is_admin 列就足够简单了。

    但是,一旦角色数量超过几个,这种方法就无法扩展。它有几个缺点:

    • 用户表变得非常“宽”,有很多空列(浪费空间)

    • 向系统添加新角色需要更改用户表。这对于大型用户数据库来说很麻烦并且可能很耗时

    • 列出用户角色需要枚举所有列,而不是简单的数据库查询。

    【讨论】:

    • 枚举权限列以显示所有滚动并在数据库上运行 ALTAR 命令 - 我没有想到的两件事。单独的表格很快变得更受欢迎。
    猜你喜欢
    • 2015-01-22
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2011-01-22
    • 2015-10-23
    • 2018-11-12
    • 2014-05-13
    相关资源
    最近更新 更多