首页 > 解决方案 > 如何在 Postgresql 数据库的一列中制作一组 id?

问题描述

我在 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;

将表 public.roles 所有者更改为 postgres;

当我尝试创建一个类似Posgrespermissions类型的外键列时,给我一个错误,即这些字段具有无与伦比的类型 -并且integer[]integerinteger[]

我应该怎么办?

标签: sqlpostgresql

解决方案


我实际上建议不要在这里使用数组。相反,使用联结表来表示每个角色-权限关系,如下所示:

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

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


推荐阅读