Подключение
- СУБД: PostgreSQL 15
- БД:
dm_shop
- Пользователь:
dm_shop_user
- Порт (локально):
45432
- Миграции: Liquibase (changesets в
back/src/main/resources/db/changelog/changes/)
- Hibernate DDL:
validate — схема создаётся только через Liquibase
Схема таблиц
products
Основная таблица каталога. Товары поступают через синхронизацию с mphone, цены могут быть переопределены вручную.
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| name | varchar NOT NULL | Название товара |
| description | text | Описание |
| price | numeric(19,2) NOT NULL | Цена закупки/склада |
| site_price | numeric(19,2) | Цена для витрины (переопределяет price) |
| active | boolean NOT NULL | Виден на витрине |
| stock | integer | Остаток на складе |
| external_id | varchar(50) UNIQUE | ID в системе mphone |
| external_category_id | integer | FK → categories.external_id |
| external_brand_id | integer | FK → brands.external_id |
| external_country_id | varchar(50) | Страна производителя (внешний ID) |
| created_at | timestamp NOT NULL | — |
| updated_at | timestamp NOT NULL | — |
categories
Иерархия категорий. Поддерживает дерево через parent_id.
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| external_id | integer UNIQUE | ID в mphone |
| name | varchar NOT NULL | Название |
| enabled | boolean | Показывается ли в навигации |
| show_in_homepage | boolean | Блок на главной странице |
| show_in_tree | boolean | В дереве категорий |
| parent_id | bigint FK→categories.id | Родительская категория |
| image_id | bigint FK→images.id | Иконка категории |
brands
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| external_id | integer UNIQUE | ID в mphone |
| name | varchar NOT NULL | Название бренда |
| enabled | boolean | Активен |
orders
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| status | varchar(50) NOT NULL | NEW, PROCESSING, SENT, ERROR, CANCELLED, COMPLETED, ARCHIVED |
| total_amount | numeric(19,2) NOT NULL | Сумма заказа |
| delivery_cost | numeric(19,2) NOT NULL | Стоимость доставки |
| external_id | varchar(50) | ID в mphone после передачи |
| client_id | bigint | FK → clients.id (внешний клиент) |
| user_id | bigint | FK → users.id (зарегистрированный пользователь) |
| customer_name | varchar | ФИО покупателя |
| customer_phone | varchar(50) | Телефон |
| customer_email | varchar | Email |
| delivery_method | varchar(50) | Способ доставки |
| delivery_address | text | Адрес доставки |
| comment | text | Комментарий покупателя |
| admin_comment | text | Комментарий менеджера |
| created_at | timestamp NOT NULL | — |
| updated_at | timestamp NOT NULL | — |
order_items
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| order_id | bigint FK→orders.id NOT NULL | — |
| product_id | bigint | Ссылка на товар (nullable — товар мог быть удалён) |
| product_name | varchar NOT NULL | Снимок названия на момент заказа |
| quantity | integer NOT NULL | Количество |
| price_at_order | numeric(19,2) NOT NULL | Цена на момент заказа |
| line_total | numeric(19,2) NOT NULL | quantity × price_at_order |
users
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| name | varchar NOT NULL | Имя |
| email | varchar UNIQUE NOT NULL | — |
| password | varchar NOT NULL | BCrypt хеш |
| phone | varchar | Телефон |
| role | varchar NOT NULL | USER, MANAGER, ADMIN |
| created_at | timestamp NOT NULL | — |
| updated_at | timestamp NOT NULL | — |
images
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| s3_key | varchar NOT NULL | Ключ объекта в S3 |
| file_name | varchar | Оригинальное имя файла |
| content_type | varchar | MIME-тип |
| file_size | bigint | Размер в байтах |
| uploaded_by | bigint FK→users.id | Кто загрузил |
| created_at | timestamp NOT NULL | — |
product_images
Связь N:M товаров и изображений с порядком отображения.
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| product_id | bigint FK→products.id NOT NULL | — |
| image_id | bigint FK→images.id NOT NULL | — |
| display_order | integer NOT NULL | Порядок отображения |
reviews
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| author_name | varchar NOT NULL | Имя автора |
| author_role | varchar | Должность / описание |
| review_text | text | Текст отзыва |
| rating | integer | Оценка (1–5) |
| image_id | bigint FK→images.id NULL | Фото автора |
| review_url | varchar | Ссылка на источник отзыва |
| enabled | boolean | Отображается на витрине |
| display_order | integer | Порядок отображения |
| created_at | timestamp NOT NULL | — |
| updated_at | timestamp NOT NULL | — |
banner_blocks / banner_slots
| Колонка | Тип | Описание |
|---|
| banner_blocks.id | bigserial PK | — |
| banner_blocks.name | varchar | Внутреннее название блока |
| banner_blocks.layout | varchar | Тип компоновки |
| banner_blocks.enabled | boolean | — |
| banner_blocks.display_order | integer | — |
| banner_slots.block_id | bigint FK→banner_blocks.id | — |
| banner_slots.position | varchar | Позиция в блоке |
| banner_slots.content_type | varchar | IMAGE, VIDEO, и т.д. |
| banner_slots.content | text | URL или данные контента |
| banner_slots.enabled | boolean | — |
feature_items
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| icon_url | varchar | URL иконки |
| title | varchar NOT NULL | Заголовок |
| description | text | Описание |
| enabled | boolean | — |
| display_order | integer | — |
app_config
Хранилище runtime-конфигурации сайта в формате ключ-значение.
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| key | varchar UNIQUE NOT NULL | Уникальный ключ |
| type | varchar NOT NULL | STRING, NUMBER, BOOLEAN, JSON |
| value | text | Текущее значение |
| default_value | text | Значение по умолчанию |
| is_public | boolean | Доступно через /api/v1/config/public |
| category | varchar | Группировка в UI |
| description | text | Описание параметра |
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| name | varchar NOT NULL | Имя клиента |
| phone | varchar | Телефон |
| email | varchar | Email |
| message | text | Сообщение |
| status | varchar NOT NULL | NEW, REVIEWED, CONTACTED |
| notes | text | Заметки менеджера |
| created_at | timestamp NOT NULL | — |
| updated_at | timestamp NOT NULL | — |
sync_state
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| sync_type | varchar NOT NULL | CATEGORIES, BRANDS, PRODUCTS |
| last_sync_time | timestamp | Последняя успешная инкрементальная синхронизация |
| last_full_sync_time | timestamp | Последняя полная синхронизация |
product_attributes
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| product_id | bigint FK→products.id NOT NULL | — |
| name | varchar NOT NULL | Название атрибута |
| value | text | Значение |
| source | varchar NOT NULL | EXTERNAL (из mphone) / MANUAL |
category_regex_filters
Правила фильтрации товаров по атрибутам при привязке к категории.
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| category_id | bigint FK→categories.id NOT NULL | — |
| attribute_name | varchar NOT NULL | Имя атрибута товара |
| pattern | varchar NOT NULL | Регулярное выражение |
clients
Внешние клиенты из системы mphone.
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| external_id | varchar UNIQUE NOT NULL | ID в mphone |
| name | varchar | Имя клиента |
stock
| Колонка | Тип | Описание |
|---|
| id | bigserial PK | — |
| product_id | bigint FK→products.id NOT NULL | — |
| quantity | integer NOT NULL | Текущий остаток |
Миграции Liquibase
Changesets добавляются в back/src/main/resources/db/changelog/changes/ и регистрируются в db.changelog-master.xml.
Текущий диапазон: changesets 001–034.
Правило: никогда не изменять существующий changeset — только добавлять новые.
Конфигурация Hibernate: ddl-auto: validate — Hibernate только проверяет соответствие сущностей схеме. Если changeset не применён, приложение не запустится с ошибкой валидации.