Схема базы данных
START TRANSACTION;
DO $EF$
BEGIN
IF NOT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'access_management') THEN
CREATE SCHEMA access_management;
END IF;
END $EF$;
CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE TABLE access_management.groups (
id text NOT NULL,
title character varying(256) NOT NULL,
description character varying(256),
claims jsonb NOT NULL DEFAULT '[]',
requirements jsonb NOT NULL DEFAULT '[]',
deleted_at timestamp without time zone,
CONSTRAINT pk_groups PRIMARY KEY (id)
);
COMMENT ON TABLE access_management.groups IS 'Группа разрешений. # Описание модели';
COMMENT ON COLUMN access_management.groups.id IS 'Идентификатор группы. Тип: Guid';
COMMENT ON COLUMN access_management.groups.title IS 'Наименование';
COMMENT ON COLUMN access_management.groups.claims IS 'Массив атрибутов группы. Те атрибуты которые есть у пользователей которые находятся в группе';
COMMENT ON COLUMN access_management.groups.requirements IS 'Требования, означающие принадлежность пользователя к данной группе. Для принадлежности пользователя к группе пользователь должен соответствовать всем требованиям';
COMMENT ON COLUMN access_management.groups.deleted_at IS 'Дата удаления';
CREATE TABLE access_management.users_groups (
user_id text NOT NULL,
group_id text NOT NULL,
CONSTRAINT pk_users_groups PRIMARY KEY (user_id, group_id),
CONSTRAINT fk_users_groups_groups_group_id FOREIGN KEY (group_id) REFERENCES access_management.groups (id) ON DELETE CASCADE
);
COMMENT ON TABLE access_management.users_groups IS 'Связка пользователя с группой. # Описание модели';
COMMENT ON COLUMN access_management.users_groups.user_id IS 'Идентификатор пользователя';
COMMENT ON COLUMN access_management.users_groups.group_id IS 'Идентификатор группы. Тип: Guid';
CREATE INDEX ix_groups_claims ON access_management.groups USING gin (claims jsonb_ops);
CREATE INDEX ix_groups_id ON access_management.groups USING btree (id DESC);
CREATE INDEX ix_groups_requirements ON access_management.groups USING gin (requirements jsonb_ops);
CREATE INDEX ix_groups_title ON access_management.groups USING btree (title DESC);
CREATE INDEX ix_groups_title_gin ON access_management.groups USING gin (to_tsvector('russian', title));
CREATE INDEX ix_users_groups_group_id ON access_management.users_groups (group_id);
COMMIT;