Ele*_*ing 2 schema postgresql database-design
我正在创建一个与 Discord 具有类似角色和权限系统的应用程序。
基本上
我不知道如何设计这样的系统。最初,我想我应该有一个roles
表,对于每个权限都会有一个布尔列,例如:can_change_nickname
。
但这似乎不太正确...
如果您有任何推荐的读物,或者可以提供详细说明为什么这样做的答案,我将非常感激。
USER
是 1 个或多个的成员GROUPS
GROUP
可以有 1 个或多个ROLES
ROLE
可以有 1 个或多个PERMISSIONS
USER
只能PERMISSION
通过将 aROLE
与这些 一起分配来获得PERMISSIONS
。GROUP
将根据应用程序提供的功能和内容类型共享通用权限ROLES
可以共享相同的PERMISSIONS
。所以看起来我需要一个角色和权限的表。现在我只需要找到PERMISSIONS
表格的样子。
让我们从组开始。一般来说,我使用复数作为表名,除非有一个有效的集体名词。您可能有不同的偏好。
CREATE TABLE GROUPS
( GROUP_ID ... NOT NULL PRIMARY KEY
, ... ) ;
Run Code Online (Sandbox Code Playgroud)
由于一个用户可以是多个组的成员(并且我假设一个组可以包含多个用户),因此我们需要一个 nn 关系。这通常是通过连接表实现的:
CREATE TABLE USERS
( USER_ID ... NOT NULL PRIMARY KEY
, ... ) ;
CREATE TABLE USER_GROUPS
( USER_ID ... NOT NULL
REFERENCES USERS (USER_ID)
, GROUP_ID ... NOT NULL
REFERENCES GROUPS (GROUP_ID)
, PRIMARY KEY (USER_ID, GROUP_ID)
);
Run Code Online (Sandbox Code Playgroud)
接下来我们有权限:
CREATE TABLE PERMISSIONS
( PERMISSION_ID ... NOT NULL PRIMARY KEY
, ...
);
Run Code Online (Sandbox Code Playgroud)
由于一个权限可以存在多个角色,因此我们再次使用 nn 关系表:
CREATE TABLE ROLES
( ROLE_ID ... NOT NULL PRIMARY KEY
, ...);
CREATE TABLE ROLE_PERMISSIONS
( ROLE_ID ... NOT NULL
REFERENCES ROLES (ROLE_ID)
, PERMISSION_ID ... NOT NULL
REFERENCES PERMISSIONS (PERMISSION_ID)
, PRIMARY KEY (ROLE_ID, PERMISSION_ID)
);
Run Code Online (Sandbox Code Playgroud)
最后我们可以描述组和角色之间的关系。如果我没猜错的话,这又是一个 nn 关系:
CREATE TABLE GROUP_ROLES
( ROLE_ID ... NOT NULL
REFERENCES ROLES (ROLE_ID)
, GROUP_ID ... NOT NULL
REFERENCES GROUPS (GROUP_ID)
, PRIMARY KEY (ROLE_ID, GROUP_ID)
);
Run Code Online (Sandbox Code Playgroud)
这当然只是一个草图。我盲目发明了属性名称,如果现实中存在属性名称,就使用它..
归档时间: |
|
查看次数: |
3324 次 |
最近记录: |