Перейти к содержанию

Схема базы данных

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;