为用户、组和权限构建数据库表的最佳方式?

Best way to structure database tables for users, groups, and permissions?

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

   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 |

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

让我们考虑 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 会增加一个额外的关系,但我认为它没有用。 (额外连接 = 复杂查询)