【问题标题】:Best way to structure database tables for users, groups, and permissions?为用户、组和权限构建数据库表的最佳方法?
【发布时间】:2021-05-11 07:02:33
【问题描述】:

在我的应用程序中,用户可以加入群组,这些群组的管理员可以为每个用户授予不同类型的权限。用户可以根据需要加入任意数量的组。我将如何构建数据库表?

   Users       Groups          Permissions        Group_User_Permissions
-----------  -----------   -------------------   -----------------------
| UID(pk) |  | GID(pk) |   | PID(pk) | VALUE |     | UID | GID | PID |

这是正确的做法吗? 或者这是必要的:

   Users        Groups         Permissions            User_Groups          Group_User_Permissions
-----------  -----------   -------------------  ------------------------  -----------------------
| UID(pk) |  | GID(pk) |   | PID(pk) | VALUE |  | UGID(pk) | UID | GID |     | UGID(pk) | PID |

显然性能很重要,但我不确定最终哪个会更好。有什么想法吗?

【问题讨论】:

  • 只是一些观察; Group_User_Permissions 似乎与 user_groups 有 1-1 的相关性,所以我不明白为什么它是一个单独的表。从中,我看不出 UGID 提供了任何有用的目的。
  • 是的,我想我会使用UGID,因为它会是一个AI PK,使其连接速度更快,并且还限制了User_Groups 中的行数。但这只是一个想法。我不确定哪个更好。
  • 为什么它会“更快地加入”?第一个模型对我来说似乎很好(但我不是专家)。
  • 我不确定,只是一个想法
  • 你有两个 msny to many 关系(用户 - 组和组 - 权限)。对这些建模的问题究竟是什么?

标签: database-design permissions


【解决方案1】:

假设 GID =100 的 group A 是 3 个 permissions

  • 读取 (PID=1)

  • 写入 (PID=2)

  • 执行 (PID=3) 并且有一个用户属于group AUID=1001。 我们以group A中的UserID=1001为例:

    UID GID PID 1001 100 1 1001 100 2 1001 100 3

这是UserPermissionGroup 之间的多对多关系。 复合键(UID,GID,PID) 是主键,每个键都是外键。

拥有Group_User_Permissions 会增加额外的关系,我认为它没有用。 (额外连接 = 复杂查询)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2012-03-28
    相关资源
    最近更新 更多