#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
таблицу, удалив массив разрешений. Ваш текущий подход использует ненормализованные данные, потому что вы пытаетесь сохранить набор разрешений в массиве для каждой отдельной роли.