use*_*107 31 postgresql referential-integrity array
假设我有一个包含工作角色的表:
CREATE TABLE roles
(
"role" character varying(80) NOT NULL,
CONSTRAINT "role" PRIMARY KEY (role)
);
Run Code Online (Sandbox Code Playgroud)
假设我还有一个表、用户,并且每一行(一个特定用户)可以有任意数量的工作角色:
CREATE TABLE users
(
username character varying(12) NOT NULL,
roles character varying(80)[] NOT NULL,
CONSTRAINT username PRIMARY KEY (username)
);
Run Code Online (Sandbox Code Playgroud)
我应该确保每个成员都users.roles[]存在于roles.role 中。在我看来,我想要的是对每个成员的外键约束users.roles[],如果引用了roles.role。
这对于 postgres 似乎是不可能的。我是不是看错了?处理此问题的建议“正确”方法是什么?
Cra*_*ger 22
支持数组外键的目的是将其纳入 PostgreSQL 9.3,但由于性能和可靠性问题,它没有在发布中脱颖而出。它似乎没有为 9.4 工作。
此时,您需要坚持使用“连接表”来建模 m:n 关系的常用关系方法。
CREATE TABLE user_roles (
username character varying(12) references users(username),
"role" character varying(80) references roles("role"),
PRIMARY KEY(username, "role")
);
Run Code Online (Sandbox Code Playgroud)
我建议在这种情况下也使用代理键,而不是将用户名/角色名称直接存储在连接表中。第一次要重命名用户或角色时,您会很高兴使用代理键。只需unique在roles."role"和上设置约束即可users.username。
| 归档时间: |
|
| 查看次数: |
26149 次 |
| 最近记录: |