数组成员的外键约束?

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)

我建议在这种情况下也使用代理键,而不是将用户名/角色名称直接存储在连接表中。第一次要重命名用户或角色时,您会很高兴使用代理键。只需uniqueroles."role"和上设置约束即可users.username