【发布时间】:2016-02-06 01:31:09
【问题描述】:
我正在构建一个需要三种用户角色的数据库架构:普通用户、管理员和超级管理员。我的第一种方法是创建两个表,一个用于普通用户,一个用于从 users 表继承的管理员和超级管理员。所以表定义是这样的:
CREATE TABLE users (
id BIGSERIAL NOT NULL PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
name TEXT NOT NULL,
gender CHAR NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE admins (
phone BIGINT NOT NULL,
doc BIGINT NOT NULL,
super_admin BOOLEAN NOT NULL,
id BIGINT NOT NULL PRIMARY KEY REFERENCES users(id)
);
但我不确定如何在需要时选择用户或管理员。所以现在我在想是否最好只留下一个“用户”表并定义一个新表“角色”,用户将在其中匹配,以便使用指定用户是否正常的列“角色”来选择它们、管理员或超级管理员。
【问题讨论】:
-
您可以有一个新的角色表,并在您的用户表中有一个
role列和一个 FK 引用。问题是,如果有一天你想让用户拥有多个角色,这会稍微困难一些,因为这意味着多对多关系,这通常意味着一个中间表。您可能想尝试使用 Flag 枚举方法,其中分配 Super Admin = 1、Admin =2、Normal = 4、Supervisor = 8 等。现在用户可以拥有Normal | Supervisor的角色,并且用于检查主管的 where 子句变为(user.role & 8) = 8. -
@Sourav'Abhi'Mitra 因此,如果用户正常开始,但他想同时成为普通用户和管理员,它只会在“标志”列中更改?例如,他开始为 4,然后变为 5(正常 + 管理员含义)。
-
@licuadolala 是的,虽然 (normal+admin) 将是 (4+2) = 6,但这确实意味着一些额外的处理逻辑。
标签: sql database postgresql database-design