我如何在一列是Postgresql数据库的ID数组?

时间:2019-04-15 05:29:45

标签: sql postgresql

我在postgres表中有权限表

CREATE TABLE public.permissions
(
permission_id integer NOT NULL,
crud_signature text COLLATE pg_catalog."default" NOT NULL,
object_id uuid NOT NULL,
object_type text COLLATE pg_catalog."default" NOT NULL,
include_subcategories boolean NOT NULL,
CONSTRAINT permissions_pkey PRIMARY KEY (permission_id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.permissions
OWNER to postgres;

并具有ROLES表。每个角色都有多个权限。

CREATE TABLE public.roles
(
role_id integer NOT NULL,
role_name text COLLATE pg_catalog."default" NOT NULL,
role_description text COLLATE pg_catalog."default",
permissions integer[],
CONSTRAINT roles_pkey PRIMARY KEY (role_id)
)
WITH (
OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public.roles     拥有者到postgres;

当我尝试创建类型为permissions的{​​{1}}之类的外键列时,Posgres给我一个错误,认为eseese字段具有不可分割的类型-integer[]integer

我该怎么办?

1 个答案:

答案 0 :(得分:2)

我实际上建议在这里使用数组。而是使用 junction 表来表示每个角色权限关系,如下所示:

CREATE TABLE roles_permissions (
    role_id integer NOT NULL,
    permission_id integer NOT NULL,
    CONSTRAINT rp_pkey PRIMARY KEY (role_id, permission_id)
);

然后通过删除权限数组来修改当前的roles表。您当前的方法使用非规范化数据,因为您正试图在数组中为每个单独的角色存储一组权限。