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

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

START TRANSACTION;

DO $EF$
BEGIN
    IF NOT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'multiapp') THEN
        CREATE SCHEMA multiapp;
    END IF;
END $EF$;

CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE TABLE multiapp.notification_templates (
    id uuid NOT NULL,
    template_header character varying(128) NOT NULL,
    template_text character varying(512) NOT NULL,
    created_at timestamp without time zone NOT NULL,
    changed_at timestamp without time zone NOT NULL,
    deleted_at timestamp without time zone,
    title character varying(256) NOT NULL,
    CONSTRAINT pk_notification_templates PRIMARY KEY (id)
);
COMMENT ON TABLE multiapp.notification_templates IS 'Шаблон уведомления. # Описание модели';
COMMENT ON COLUMN multiapp.notification_templates.id IS 'Идентификатор. Если не передан создаётся сервером. # Тип: Guid';
COMMENT ON COLUMN multiapp.notification_templates.template_header IS 'Заголовок шаблона. Поддерживает mustache теги в формате: {{название переменной|тип данных}}. Название переменной в теге может содержать латинские буквы (в верхнем или нижнем регистре), цифры и символ \"_\". Тип данных может быть указан в верхнем или нижнем регистре, пробелы не допускаются, допустимые типы данных указаны в таблице. Символы \"{\" и \"}\" являются служебными и могут использоваться только для формирования Mustache тегов. # Диапазон: 3..128';
COMMENT ON COLUMN multiapp.notification_templates.template_text IS 'Тело шаблона. Поддерживает mustache теги в формате: {{название переменной|тип данных}}. Название переменной в теге может содержать латинские буквы (в верхнем или нижнем регистре), цифры и символ \"_\". Тип данных может быть указан в верхнем или нижнем регистре, пробелы не допускаются, допустимые типы данных указаны в таблице. Символы \"{\" и \"}\" являются служебными и могут использоваться только для формирования Mustache тегов. # Диапазон: 3..512';
COMMENT ON COLUMN multiapp.notification_templates.created_at IS 'Дата создания. # Тип: DateTime';
COMMENT ON COLUMN multiapp.notification_templates.changed_at IS 'Дата последнего изменения. Заполняется и обновляется сервером. При изменении должен совпадать со значением из БД. Является версией объекта. # Тип: DateTime';
COMMENT ON COLUMN multiapp.notification_templates.deleted_at IS 'Дата удаления. # Тип: DateTime?';
COMMENT ON COLUMN multiapp.notification_templates.title IS 'Системное наименование. # Диапазон: 3..256';

CREATE TABLE multiapp.partners (
    id uuid NOT NULL,
    name character varying(256) NOT NULL,
    api_key uuid NOT NULL,
    public_key text,
    created_at timestamp without time zone NOT NULL,
    changed_at timestamp without time zone NOT NULL,
    deleted_at timestamp without time zone,
    CONSTRAINT pk_partners PRIMARY KEY (id)
);
COMMENT ON TABLE multiapp.partners IS 'Партнер. # Описание модели';
COMMENT ON COLUMN multiapp.partners.id IS 'Идентификатор. Если не передан создаётся сервером. # Тип: Guid';
COMMENT ON COLUMN multiapp.partners.name IS 'Наименование. # Диапазон: 2..256';
COMMENT ON COLUMN multiapp.partners.api_key IS 'API ключ. # Тип: Guid';
COMMENT ON COLUMN multiapp.partners.public_key IS 'Публичный ключ';
COMMENT ON COLUMN multiapp.partners.created_at IS 'Дата создания партнера. # Тип: DateTime';
COMMENT ON COLUMN multiapp.partners.changed_at IS 'Дата обновления партнера. # Тип: DateTime';
COMMENT ON COLUMN multiapp.partners.deleted_at IS 'Дата удаления партнера. # Тип: DateTime?';

CREATE TABLE multiapp.apps (
    id uuid NOT NULL,
    partner_id uuid NOT NULL,
    type character varying(32) NOT NULL,
    title character varying(256) NOT NULL,
    header character varying(30),
    subtitle character varying(60),
    background_color character varying(9),
    status_type character varying(32) NOT NULL,
    links jsonb NOT NULL DEFAULT '[]',
    user_tags text[] NOT NULL DEFAULT ARRAY[]::text[],
    app_tags text[] NOT NULL DEFAULT ARRAY[]::text[],
    created_at timestamp without time zone NOT NULL,
    changed_at timestamp without time zone NOT NULL,
    permissions jsonb NOT NULL,
    grant_types text[] NOT NULL DEFAULT ARRAY[]::text[],
    CONSTRAINT pk_apps PRIMARY KEY (id),
    CONSTRAINT fk_apps_partners_partner_id FOREIGN KEY (partner_id) REFERENCES multiapp.partners (id) ON DELETE RESTRICT
);
COMMENT ON TABLE multiapp.apps IS 'Приложение. # Описание модели';
COMMENT ON COLUMN multiapp.apps.id IS 'Идентификатор. Если не передан создаётся сервером. # Тип: Guid';
COMMENT ON COLUMN multiapp.apps.partner_id IS 'Идентификатор партнера. # Тип: Guid';
COMMENT ON COLUMN multiapp.apps.type IS 'Тип приложения';
COMMENT ON COLUMN multiapp.apps.title IS 'Системное наименование. Не отображается пользователям. # Диапазон: 3..256';
COMMENT ON COLUMN multiapp.apps.header IS 'Заголовок. # Диапазон: 3..30';
COMMENT ON COLUMN multiapp.apps.subtitle IS 'Подзаголовок. # Диапазон: 3..60';
COMMENT ON COLUMN multiapp.apps.background_color IS 'Цвет заднего плана(подложки). Все цвета должны быть в формате hex #RRGGBBAA. Пример: #7e00c380. # Диапазон: 9..9. # Паттерн: /^#[0-9a-fA-F]{8}$/';
COMMENT ON COLUMN multiapp.apps.status_type IS 'Статус приложения';
COMMENT ON COLUMN multiapp.apps.links IS 'Ссылки для переходов. # Диапазон: 0..100';
COMMENT ON COLUMN multiapp.apps.user_tags IS 'Список тегов пользователей. Обязательное. Описывает кто может видеть приложение. Тэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10. # Диапазон: 1..100. # Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/';
COMMENT ON COLUMN multiapp.apps.app_tags IS 'Список тегов приложений. Обязательное. Описывает какие клиенты могут видеть приложение. Тэг - максимум 5 символов, значение - максимум 19 символов, количество сегментов - максимум 10. # Диапазон: 1..20. # Паттерн: /^[A-Z-]{1,5}_[0-9A-Z-]{1,19}(?:\.[A-Z-]{1,5}_[0-9A-Z-]{1,19}){0,9}$/';
COMMENT ON COLUMN multiapp.apps.created_at IS 'Дата создания. # Тип: DateTime';
COMMENT ON COLUMN multiapp.apps.changed_at IS 'Дата последнего изменения. Заполняется и обновляется сервером. При изменении должен совпадать со значением из БД. Является версией объекта. # Тип: DateTime';
COMMENT ON COLUMN multiapp.apps.permissions IS 'Разрешения';
COMMENT ON COLUMN multiapp.apps.grant_types IS 'Список разрешений';

CREATE TABLE multiapp.notification_templates_partners (
    notification_template_id uuid NOT NULL,
    partner_id uuid NOT NULL,
    CONSTRAINT pk_notification_templates_partners PRIMARY KEY (notification_template_id, partner_id),
    CONSTRAINT fk_notification_templates_partners_notification_templates_noti FOREIGN KEY (notification_template_id) REFERENCES multiapp.notification_templates (id),
    CONSTRAINT fk_notification_templates_partners_partners_partner_id FOREIGN KEY (partner_id) REFERENCES multiapp.partners (id)
);
COMMENT ON TABLE multiapp.notification_templates_partners IS 'Связь шаблона уведомлений и партнера. # Описание модели';
COMMENT ON COLUMN multiapp.notification_templates_partners.notification_template_id IS 'Идентификатор шаблона уведомления. # Тип: Guid';
COMMENT ON COLUMN multiapp.notification_templates_partners.partner_id IS 'Идентификатор партнера. # Тип: Guid';

CREATE INDEX ix_apps_app_tags ON multiapp.apps USING gin (app_tags);

CREATE INDEX ix_apps_changed_at ON multiapp.apps USING btree (changed_at DESC);

CREATE INDEX ix_apps_created_at ON multiapp.apps USING btree (created_at DESC);

CREATE INDEX ix_apps_id ON multiapp.apps (id DESC);

CREATE INDEX ix_apps_links ON multiapp.apps USING gin (links jsonb_ops);

CREATE INDEX ix_apps_partner_id ON multiapp.apps (partner_id DESC);

CREATE INDEX ix_apps_permissions ON multiapp.apps USING gin (permissions jsonb_path_ops);

CREATE INDEX ix_apps_status_type ON multiapp.apps (status_type DESC);

CREATE INDEX ix_apps_title_header_subtitle ON multiapp.apps USING gin (to_tsvector('russian', title || ' ' || coalesce(header, '') || ' ' || coalesce(subtitle, '')));

CREATE INDEX ix_apps_type ON multiapp.apps (type DESC);

CREATE INDEX ix_apps_user_tags ON multiapp.apps USING gin (user_tags);

CREATE INDEX ix_notification_templates_changed_at ON multiapp.notification_templates USING btree (changed_at DESC);

CREATE INDEX ix_notification_templates_created_at ON multiapp.notification_templates USING btree (created_at DESC);

CREATE INDEX ix_notification_templates_id ON multiapp.notification_templates (id DESC);

CREATE INDEX ix_notification_templates_template_header_template_text_title ON multiapp.notification_templates USING gin (to_tsvector('russian', template_header || ' ' || template_text || ' ' || title));

CREATE INDEX ix_notification_templates_partners_partner_id ON multiapp.notification_templates_partners (partner_id);

CREATE INDEX ix_partners_changed_at ON multiapp.partners USING btree (changed_at DESC);

CREATE INDEX ix_partners_created_at ON multiapp.partners USING btree (created_at DESC);

CREATE INDEX ix_partners_id ON multiapp.partners (id DESC);

CREATE INDEX ix_partners_name ON multiapp.partners USING gin (to_tsvector('russian', name));


COMMIT;