Как мне создать массив идентификаторов в одном столбце базы данных Postgresql?

#sql #postgresql

#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_defau<

ALTER TABLE public.permissions
OWNER to postgres;
  

и есть таблица РОЛЕЙ. Каждая роль имеет несколько разрешений.

 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_defau<
  

ИЗМЕНИТЬ ТАБЛИЦУ public.roles
ВЛАДЕЛЕЦ postgres;

Когда я пытаюсь создать столбец внешних ключей типа permissions типа integer[] Posgres выдает мне сообщение об ошибке, что эти поля имеют несравнимые типы — integer и integer[]

Что мне делать?

Комментарии:

1. Пожалуйста, включите в свой вопрос достаточно примеров входных и выходных данных, чтобы было ясно, что вы пытаетесь здесь сделать.

2. Я пытаюсь сделать поле разрешений в таблице РОЛЕЙ внешним ключом. И это должен быть массив ключей разрешений

3. Я рекомендую внести изменения в дизайн, см. мой ответ ниже.

Ответ №1:

На самом деле я бы рекомендовал не использовать здесь массивы. Вместо этого используйте таблицу соединений для представления каждого отношения роли-разрешения, что-то вроде этого:

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

Затем измените текущую roles таблицу, удалив массив разрешений. Ваш текущий подход использует ненормализованные данные, потому что вы пытаетесь сохранить набор разрешений в массиве для каждой отдельной роли.