[DRAFT] ER: Диаграмма сущностей
Часть 1 Микросервисная архитектура FoodLifeCycleApp. Cхема СУБД доменов: IAD, MDM, INVENTORY PMA
В открытом доступе представлена демонстрационная версия метода. В настоящей публичной документации отображены не все шаги, технические сценарии и приватные эндпоинты для системы цифровых симуляторов бизнес-процессов.
- Полная спецификация метода: Будет доступна только во внутреннем контуре разработки (Confluence / Swagger Enterprise).
1 Начало
При проектировании реляционных структур и Entity-Relationship (ER) моделей для микросервисной системы FoodLifeCycleApp, требуется соблюдение паттерна Database-per-Service. Для исключения связанности компонентов и предотвращения образования «распределенного монолита», прямые ограничения внешних ключей (FOREIGN KEY) между базами данных изолированных доменов запрещены.
Связанность сущностей на глобальном уровне обеспечивается двумя механизмами:
- Сквозной параметр (
trace_id): Полеtrace_id VARCHAR(50)добавляется (injection) шлюзом в виде заголовкаX-Request-ID. Параметр транслируется через gRPC-интерфейсы и сообщения брокера Kafka во все физические базы данных, позволяя сопоставить логи Grafana Loki с изменениями в СУБД без синхронных JOIN-запросов. - Асинхронная репликация Read-моделей: Микросервисы автономно накапливают данные из смежных контекстов через шину событий брокера.
Для повышения читаемости архитектурных схем командами разработки, таблицы на ER-диаграммах визуально сегментированы и раскрашены в соответствии с кодовыми цветами наших Data Flow конвейеров.
2 Примеры ER-диаграмм
2.1 Общая ER-диаграмма
На уровне концептуального проектирования архитектура FoodLifeCycle изолирует данные каждого контекста. Межсервисные связи лишены ограничений FOREIGN KEY и реализуются асинхронно.
Ниже представлена общая схемв взаимодействия распределенных баз данных:
2.2 ER-модель. Домен (IAD)
В этом домене декомпозированы структуры баз данных auth_db и notification_db. Они отвечают за доступ, управление сессиями, правами групп (HOME / OFFICE) и логирование пуш-нотификаций.
2.3 ER-модель. Домен Мастер-Данных (MDM)
В этом домене декомпозированы структуры базы данных mdm_db. Они отвечают за управление справочников, для базовых рецептов, рецептов пользователей (групп) базовых меню, меню пользоватлей( групп) и карточек продуктов (хранят иноформацию о пищевой ценности продукта).
2.4 ER-модель. Домен ИИ-сервисов (AID)
В этой части декомпозированы структуры баз данных aid_db. Они отвечают за логи ИИ сервисов, и запросы отправленые на ручную модерацию непрошедшие: цензуру, обработку естественного языка (NLP), сканировании ОФД-чеков (OCR) или распознавание аудио-записи (VTT).
2.5 ER-модель. Домен “цифрового холодильника” (INVENTORY)
В этой части декомпозированы структуры баз данных fridge_db, billing_db. Они отвечают за операционные таблицы движения ресурсов: учет запасов еды (остатков), чеки (store_receipts), контур приготовления (cooking_history), а также записи потребления (consumption_sessions) и порчи продуктов (waste_logs).
2.6 ER-модель. Домен аналитики и аудита (PMA)
В этой части декомпозированы структуры баз данных affinity_db и bupar_db. Они отвечают за накопления и обработку аналитических метрик (OLAP) и сбор шагов бизнес-процесса для Process Mining.
3 Пример DDL-спецификации по ER-диаграмме
3.1 Пример структуры affinity_db и bupar_db
-- ============================================================================
-- СХЕМА АНАЛИТИЧЕСКОЙ СУБД РЕКОМЕНДАЦИЙ (affinity_db)
-- ============================================================================
CREATE DATABASE affinity_db;
\c affinity_db;
-- 1. Таблица разреженной матрицы предпочтений групп
CREATE TABLE user_product_affinity (
home_group_id VARCHAR(50) NOT NULL,
master_product_id VARCHAR(50) NOT NULL,
score INTEGER NOT NULL CHECK (score BETWEEN 0 AND 100),
last_interaction TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
PRIMARY KEY (home_group_id, master_product_id)
);
-- 2. Локальный кэш-справочник базовых весов (Read-модель репликации из MDM)
CREATE TABLE affinity_product_reference (
product_id VARCHAR(50) PRIMARY KEY,
base_affinity_score INTEGER NOT NULL CHECK (base_affinity_score BETWEEN 0 AND 100)
);
-- Индекс для ночного Крон-движка деградации весов (03:00)
CREATE INDEX idx_affinity_cron_decay ON user_product_affinity (last_interaction ASC) WHERE score > 10;
-- ============================================================================
-- СХЕМА АНАЛИТИЧЕСКОЙ СУБД PROCESS MINING (bupar_db)
-- ============================================================================
CREATE DATABASE bupar_db;
\c bupar_db;
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
-- Плоский журнал логов событий (Event Log) для Process Mining
CREATE TABLE bupar_event_logs (
event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
case_id VARCHAR(50) NOT NULL, -- Сквозной маркер партии/цепочки еды
trace_id VARCHAR(50) NOT NULL, -- Ссылка на технический UUID трейсинга логов Loki
home_group_id VARCHAR(50) NOT NULL,
activity_name VARCHAR(100) NOT NULL, -- Шаги: PRODUCT_BATCH_PURCHASED, MANUAL_DISH_COOKED, FOOD_CONSUMED, FOOD_WASTED
payload_details JSONB NOT NULL, -- Слепок физических параметров мутации
event_timestamp TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Композитный индекс: критически важен для пакета bupar при сборке хронологических графов
CREATE INDEX idx_bupar_case_id_timeline ON bupar_event_logs(case_id, event_timestamp ASC);
-- Индекс для мгновенной фильтрации технического следа по trace_id шлюза Nginx
CREATE INDEX idx_bupar_logs_trace_id ON bupar_event_logs(trace_id);
SELECT 'ПРОЕКТИРОВАНИЕ ФИЗИЧЕСКОГО И СТРУКТУРНОГО СЛОЯ ЕДИНЫХ ER-ДИАГРАММ 6 СУБД ЗАВЕРШЕНО!' AS progress;4 Окончание
В микросервисной архитектуре классические аналитические схемы («Звезда» и «Снежинка») не могут существовать в своем первозданном виде внутри операционных баз данных. Главный принцип микросервисов — Database-per-Service (у каждого сервиса своя изолированная СУБД). Из-за этого таблицы физически разрезаны по разным серверам (как в вашей системе auth_db, fridge_db, mdm_db). Сделать прямой SQL JOIN между таблицей фактов в одном сервисе и измерением в другом технически невозможно.Поэтому в микросервисной инфраструктуре применяются совершенно другие паттерны проектирования схем данных. Если кратко, их три:
- Это адаптация схемы «Звезда» под реалии микросервисов.
Сервис, которому нужна аналитика или быстрая выгрузка, не ходит в другие сервисы за справочниками. Вместо этого он слушает события из брокера сообщений (Kafka/RabbitMQ) и копирует (дублирует) нужные измерения к себе в базу.
- Сквозные ID-цепочки (Логическая «Снежинка»)
Таблицы не связаны физическими FOREIGN KEY, но содержат общие сквозные идентификаторы бизнес-ключей (trace_id, user_id, home_group_id, food_element_id). Каскадные связи «Снежинки» переносятся с уровня базы данных на уровень кода приложения (API Gateway или Бэкенд-оркестратор).
- Выделенное CQRS-хранилище (Read-модель)Паттерн разделения ответственности на чтение и запись (Command Query Responsibility Segregation).Суть: Операционные СУБД микросервисов вообще не занимаются построением сложных схем. Они оптимизированы только на быструю запись (OLTP). Все изменения (события) из всех микросервисов стримятся в одно общее аналитическое хранилище (DWH/Data Lake) — например, в ClickHouse, Greenplum или вашу СУБД аналитики процессов bupar_db.