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

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

START TRANSACTION;

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

CREATE EXTENSION IF NOT EXISTS pg_trgm;

CREATE TABLE banner.banners (
    id uuid NOT NULL,
    type text NOT NULL,
    priority integer NOT NULL,
    title character varying(256) NOT NULL,
    header character varying(64) NULL,
    header_color character varying(9) NULL,
    subtitle character varying(256) NULL,
    subtitle_color character varying(9) NULL,
    background_color character varying(9) NULL,
    background_gradient jsonb NULL,
    repeat_after_days integer NULL,
    show_start_at date NOT NULL,
    show_ended_at date NOT NULL,
    images jsonb NOT NULL DEFAULT '[]',
    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,
    CONSTRAINT pk_banners PRIMARY KEY (id)
);
COMMENT ON TABLE banner.banners IS 'Баннер. # Описание модели';
COMMENT ON COLUMN banner.banners.id IS 'Идентификатор. Если не передан создаётся сервером. # Тип: Guid';
COMMENT ON COLUMN banner.banners.type IS 'Тип баннера';
COMMENT ON COLUMN banner.banners.priority IS 'Приоритет. # Диапазон: 0..255';
COMMENT ON COLUMN banner.banners.title IS 'Название. Обычно это название рекламной компании. Не отображается пользователям. # Диапазон: 3..256';
COMMENT ON COLUMN banner.banners.header IS 'Заголовок. # Диапазон: 3..64';
COMMENT ON COLUMN banner.banners.header_color IS 'Цвет текста заголовка. Все цвета должны быть в формате hex #RRGGBBAA. Пример: #7e00c380. # Диапазон: 9..9. # Паттерн: /^#[0-9a-fA-F]{8}$/';
COMMENT ON COLUMN banner.banners.subtitle IS 'Подзаголовок. # Диапазон: 3..256';
COMMENT ON COLUMN banner.banners.subtitle_color IS 'Цвет текста подзаголовка. Все цвета должны быть в формате hex #RRGGBBAA. Пример: #7e00c380. # Диапазон: 9..9. # Паттерн: /^#[0-9a-fA-F]{8}$/';
COMMENT ON COLUMN banner.banners.background_color IS 'Цвет заднего плана(подложки). Отрисовывается до загрузки картинки и градиента. Все цвета должны быть в формате hex #RRGGBBAA. Пример: #7e00c380. # Диапазон: 9..9. # Паттерн: /^#[0-9a-fA-F]{8}$/';
COMMENT ON COLUMN banner.banners.background_gradient IS 'Градиент';
COMMENT ON COLUMN banner.banners.repeat_after_days IS 'Количество дней через которое можно повторно показать баннер. Если null, то закрыть нельзя, баннер повторно выводится каждый раз. # Диапазон: 0..366';
COMMENT ON COLUMN banner.banners.show_start_at IS 'Дата начала показа. Бессрочно если значение 2000-01-01. # Тип: DateOnly. # Диапазон: 730119..1095362';
COMMENT ON COLUMN banner.banners.show_ended_at IS 'Дата конца показа. Бессрочно если значение 3000-01-01. # Тип: DateOnly. # Диапазон: 730119..1095362';
COMMENT ON COLUMN banner.banners.images IS 'Картинки. # Диапазон: 0..20';
COMMENT ON COLUMN banner.banners.links IS 'Ссылки для переходов. # Диапазон: 0..100';
COMMENT ON COLUMN banner.banners.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 banner.banners.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 banner.banners.created_at IS 'Дата создания. # Тип: DateTime';
COMMENT ON COLUMN banner.banners.changed_at IS 'Дата последнего изменения. Заполняется и обновляется сервером. Заполняется при создании и изменении. Является версией объекта. # Тип: DateTime';

CREATE INDEX ix_banners_app_tags ON banner.banners USING gin (app_tags);

CREATE INDEX ix_banners_background_gradient ON banner.banners USING gin (background_gradient jsonb_path_ops);

CREATE INDEX ix_banners_changed_at ON banner.banners USING btree (changed_at DESC);

CREATE INDEX ix_banners_created_at ON banner.banners USING btree (created_at DESC);

CREATE INDEX ix_banners_images ON banner.banners USING gin (images jsonb_ops);

CREATE INDEX ix_banners_links ON banner.banners USING gin (links jsonb_ops);

CREATE INDEX ix_banners_priority_show_start_at ON banner.banners USING btree (priority DESC, show_start_at DESC);

CREATE INDEX ix_banners_show_ended_at ON banner.banners USING btree (show_ended_at DESC);

CREATE INDEX ix_banners_show_start_at ON banner.banners USING btree (show_start_at DESC);

CREATE INDEX ix_banners_title_header_subtitle ON banner.banners USING gin (to_tsvector('russian', title || ' ' || coalesce(header, '') || ' ' || coalesce(subtitle, '')));

CREATE INDEX ix_banners_type ON banner.banners (type DESC);

CREATE INDEX ix_banners_user_tags ON banner.banners USING gin (user_tags);


COMMIT;