ER-диаграммы сущностей

Часть 1: Концептуальная схема 6 СУБД и детальный физический слой доменов IAD и Engagement

Author

Lead Systems Architect / Database Administrator

Published

July 14, 2026

1. Глобальная концептуальная ER-диаграмма системных СУБД

На уровне концептуального проектирования архитектура FoodLifeCycle изолирует данные каждого контекста. Межсервисные связи лишены физических ограничений FOREIGN KEY и реализуются асинхронно.

Ниже представлена концептуальная схема взаимодействия 6 распределенных баз данных:

Conceptual_DB_Model_Fixed AUTH_DB 1. auth_db (Домен IAD) NOTIF_DB 2. notification_db (Контур IAD / Notification) AUTH_DB->NOTIF_DB Трансляция по trace_id MDM_DB 3. mdm_db (Домен MDM) FRIDGE_DB 4. fridge_db (Домен INVENTORY) FRIDGE_DB->MDM_DB Валидация по product_id AFFINITY_DB 5. affinity_db (Домен AFFINITY) FRIDGE_DB->AFFINITY_DB Инкремент по group_id BUPAR_DB 7. bupar_db (Домен PMA / Process Mining) FRIDGE_DB->BUPAR_DB Сквозной аудит по case_id AID_DB 6. aid_db (Домен AID / ИИ-Оркестрация) AID_DB->AUTH_DB Топик №13 (Авто-бан сессии) AID_DB->FRIDGE_DB Потоковый инференс фреймов


2. Физическая ER-модель. Часть 1: Домены IAD и Engagement

В этой части подробно декомпозированы структуры баз данных auth_db и notification_db. Они отвечают за управление сессиями, правами мультитендентных групп (HOME / OFFICE) и логирование пуш-нотификаций.

IAD_Engagement_Physical_Model cluster_notification_db СУБД: notification_db (notification-service) cluster_auth_db СУБД: auth_db (auth-service) USERS users varchar user_id PK varchar email UK varchar password_hash boolean is_active GROUP_MEMBERS group_members varchar user_id PK, FK varchar group_id PK, FK varchar role USERS->GROUP_MEMBERS USER_SESSIONS user_sessions uuid session_id PK varchar user_id FK varchar refresh_token_hash varchar trace_id IDX USERS->USER_SESSIONS GROUPS groups varchar group_id PK varchar space_type boolean is_verified GROUPS->GROUP_MEMBERS PUSH_LOG push_delivery_log int delivery_id PK varchar user_id varchar template_code varchar trace_id IDX varchar status USER_SESSIONS->PUSH_LOG Асинхронный trace_id ERROR_DIRECTORY error_directory varchar error_code PK int http_status int grpc_status_code varchar app_lang text localized_message NOTIF_TEMPLATES notification_templates varchar template_code PK varchar app_lang PK varchar title text body_text

3. Физическая ER-модель. Часть 2: Домен Мастер-Данных (MDM)

Эта часть детально описывает физическую топологию базы данных mdm_db. СУБД выступает в роли изолированного статического ядра, обслуживающего recipes-service. Она хранит нормативные константы пищевой ценности, связи штрих-кодовых маппингов, а также технологические карты для кулинарного цикла.

Сюда же вынесен изолированный контур асинхронного накопления тикетов ручной модерации (moderation_tickets), который собирает грязный вывод GPU-воркеров (image-processor, grpc-analytics) при нечетком сканировании ОФД-чеков или голосовых рапортов. Это исключает блокировки операционной базы склада при ожидании ручного подтверждения от пользователя во Flutter-приложении.

MDM_Physical_Model cluster_mdm_db СУБД: mdm_db (recipes-service) PRODUCT_CATALOG product_catalog varchar product_id PK varchar element_symbol varchar canonical_name numeric proteins numeric fats numeric carbohydrates int base_affinity_score PRODUCT_BARCODES product_barcodes varchar barcode PK varchar product_id FK PRODUCT_CATALOG->PRODUCT_BARCODES RECIPE_INGREDIENTS recipe_ingredients int recipe_id PK, FK varchar product_id PK, FK numeric required_weight_g PRODUCT_CATALOG->RECIPE_INGREDIENTS RECIPE_BOOK recipe_book int recipe_id PK varchar dish_name int total_portions text instructions RECIPE_BOOK->RECIPE_INGREDIENTS MODERATION_TICKETS moderation_tickets uuid ticket_id PK text raw_text_input varchar status varchar trace_id IDX

4. Физическая ER-модель. Часть 3: Операционный домен склада (INVENTORY)

Данный раздел детально описывает транзакционную структуру базы данных fridge_db. В соответствии с бизнес-логикой симулятора, эта СУБД объединяет в себе все операционные таблицы движения ресурсов. Сюда инкапсулированы партионный учет остатков, фискальные чеки ОФД (store_receipts), каскадный кулинарный контур приготовления (cooking_history), а также сессии порционного съедения (consumption_sessions) и порчи продуктов (waste_logs).

Схлопывание разрозненных черновиков в единую базу данных fridge_db позволило выполнять сложные уменьшения весов по алгоритму FIFO (ORDER BY created_at ASC) и реактивные пересчеты меню в рамках одной СУБД [bupar-audit-service]. Это исключило распределенные блокировки таблиц и гарантировало высокую отказоустойчивость при пиковых нагрузках со смартфона.

Inventory_Core_Physical_Model cluster_fridge_db СУБД: fridge_db (fridge-service ядро) FRIDGE_INVENTORY fridge_inventory varchar batch_id PK varchar home_group_id IDX varchar product_id IDX numeric quantity numeric initial_volume varchar status varchar trace_id IDX timestamptz expired_at timestamptz created_at STORE_RECEIPTS store_receipts varchar receipt_id PK varchar home_group_id varchar shop_id numeric total_amount varchar trace_id IDX RECEIPT_ITEMS receipt_items int item_id PK varchar receipt_id FK text raw_input_name varchar resolved_product_id numeric quantity numeric price_per_unit STORE_RECEIPTS->RECEIPT_ITEMS COOKING_HISTORY cooking_history uuid log_id PK varchar home_group_id int recipe_id varchar recipe_name varchar status varchar trace_id CONSUMPTION_SESSIONS consumption_sessions uuid session_id PK varchar home_group_id int recipe_id varchar trace_id CONSUMPTION_ITEMS consumption_items int id PK uuid session_id FK varchar product_id numeric consumed_volume CONSUMPTION_SESSIONS->CONSUMPTION_ITEMS WASTE_LOGS waste_logs uuid waste_id PK varchar home_group_id varchar product_id numeric wasted_volume varchar waste_reason varchar trace_id

5. Физическая ER-модель. Часть 4: Аналитика и Сквозной Процессный Аудит

Заключительная часть физической ER-модели консолидирует структуры данных предиктивного домена AFFINITY и контура сквозного процессного майнинга PMA. Эти домены функционируют в режиме накопления и обработки аналитических метрик (OLAP), изолируя тяжелые математические расчеты и сбор сквозных трейсов от операционного ядра склада.

Связующими звеньями между транзакционным слоем (fridge_db) и аналитикой здесь выступают: * product_id / master_product_id — связывает локальные Read-модели дефолтных весов номенклатуры. * case_id — сквозной идентификатор экземпляра процесса (ID конкретной партии еды), связывающий шаги закупки, готовки, порционного съедения и утилизации в единый направленный граф векторов для Process Mining пакета bupar.

Analytics_Core_Physical_Model cluster_bupar_db СУБД: bupar_db (bupar-audit-service) cluster_affinity_db СУБД: affinity_db (affinity-service) USER_AFFINITY user_product_affinity varchar home_group_id PK varchar master_product_id PK int score timestamptz last_interaction IDX AFF_PROD_REF affinity_product_reference varchar product_id PK int base_affinity_score REDIS_MATRIX_CACHE In-Memory Redis Matrix varchar redis_key PK varchar associated_product_id PK numeric sorted_score BUPAR_LOGS bupar_event_logs uuid event_id PK varchar case_id IDX varchar trace_id IDX varchar home_group_id varchar activity_name jsonb payload_details timestamptz event_timestamp USER_PRODUCT_AFFINITY USER_PRODUCT_AFFINITY USER_PRODUCT_AFFINITY->AFF_PROD_REF

AID_Physical_Model cluster_aid_db СУБД: aid_db (ИИ-воркеры) AI_MEDIA_SESSIONS ai_media_sessions uuid session_id PK varchar user_id varchar session_type varchar trace_id IDX varchar status AI_STREAM_FRAMES_LOG ai_stream_frames_log bigint frame_id PK uuid session_id FK varchar detected_class_name numeric confidence_score AI_MEDIA_SESSIONS->AI_STREAM_FRAMES_LOG

6. Физическая DDL-спецификация структуры affinity_db и bupar_db

Скрипт разворачивает финальные аналитические таблицы персистентного слоя и оптимизирующие индексы для фоновых математических планировщиков Celery Beat.

-- ============================================================================
-- СХЕМА АНАЛИТИЧЕСКОЙ СУБД РЕКОМЕНДАЦИЙ (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;

Дополнение 1

Физическая топология и сквозные связи слоев данных (ERD Model)

Ниже представлена концептуальная схема взаимодействия и изоляции баз данных проекта FoodLifeCycle, построенная на основе развернутых в манифесте SQL DDL миграций и Redis/Kafka контрактов.

Physical_DB_Model_FoodLifeCycle AUTH_DB 1. auth_db (SECURITY) users sessions abuse_violations b2b_trusted_stores error_directory NOTIF_DB 2. notification_db templates push_log AUTH_DB:t3->NOTIF_DB:t1 Топик: profanity.violate (template_code) FRIDGE_DB 4. fridge_db (INVENTORY) fridge_inventory (FIFO Index) v_client_fridge_inventory (VIEW) cooking_history consumption_sessions consumption_items waste_logs food_elements AUTH_DB:t4->FRIDGE_DB:t1 Топик: fridge_item.deduct (shop_id / token_hash) MDM_DB 3. mdm_db (MDM) moderation_tickets ocr_processing_logs vision_yolo_processing_logs MDM_DB:t1->FRIDGE_DB:t7 Топик: product.process (product_id) FRIDGE_DB:t7->MDM_DB:t1 gRPC: ИИ-Обогащение status = 'READY' FRIDGE_DB:t1->FRIDGE_DB:t2 Теневое маскирование (masked_ui_quantity) AFFINITY_DB 6. affinity_db (Redis) ZSET: affinity:user:product Lua: Decay Strategy FRIDGE_DB:t1->AFFINITY_DB:t1 Топик: product.templated ZINCRBY (+1.0) BUPAR_DB 7. bupar_db (PMA) bupar_event_logs (case_id Index) FRIDGE_DB:t3->BUPAR_DB:t1 Асинхронный захват по case_id (FOOD_CONSUMED / WASTED) FRIDGE_DB:t1->BUPAR_DB:t1 Лог выравнивания баланса (SHORTAGE_RECONCILED) RECIPES_DB 5. recipes_db (RECIPES) recipe_book recipe_ingredients RECIPES_DB:t2->FRIDGE_DB:t1 gRPC: mutateRecipeBalances (FIFO каскад)

Дополнение 2

Физическая топология и сквозные связи слоев данных (ERD Model)

Ниже представлена исчерпывающая физическая схема взаимодействия и изоляции баз данных проекта FoodLifeCycle, содержащая все 22 таблицы и структуры, зафиксированные в топологии физического слоя архитектурного манифеста.

Physical_DB_Model_FoodLifeCycle_Full AUTH_DB 1. auth_db (SECURITY) users groups members sessions error_directory abuse_violations b2b_trusted_stores NOTIF_DB 2. notification_db templates push_log AUTH_DB:t6->NOTIF_DB:t1 Топик: profanity.violate FRIDGE_DB 4. fridge_db (INVENTORY) fridge_inventory (FIFO Index) store_receipts receipt_items cooking_history consumption_sessions consumption_items waste_logs food_elements v_client_fridge_inventory (VIEW) AUTH_DB:t7->FRIDGE_DB:t1 Топик: fridge_item.deduct AUTH_DB:t2->FRIDGE_DB:t1 gRPC: Контроль контура (HOME / OFFICE) MDM_DB 3. mdm_db (MDM) product_catalog barcodes recipe_book recipe_ingredients moderation_tickets ocr_processing_logs vision_yolo_processing_logs MDM_DB:t5->FRIDGE_DB:t8 Топик: product.process MDM_DB:t4->FRIDGE_DB:t1 gRPC: mutateRecipeBalances (Списание из recipe_ingredients) FRIDGE_DB:t8->MDM_DB:t1 gRPC: Валидация номенклатуры по product_catalog AFFINITY_DB 5. affinity_db (Redis) user_product_affinity (ZSET) affinity_product_reference FRIDGE_DB:t1->AFFINITY_DB:t1 Топик: product.templated BUPAR_DB 6. bupar_db (PMA) bupar_event_logs (case_id Index) FRIDGE_DB:t5->BUPAR_DB:t1 Асинхронный захват по case_id (FOOD_CONSUMED) FRIDGE_DB:t7->BUPAR_DB:t1 Асинхронный захват по case_id (FOOD_WASTED) FRIDGE_DB:t1->BUPAR_DB:t1 Лог выравнивания баланса (SHORTAGE_RECONCILED)

Дополнение 3

8.1. Физическая ER-модель базы данных: auth_db (SECURITY)

Ниже представлена детальная физическая ER-диаграмма контура авторизации, управления группами, b2b-клиентами и динамического маппинга системных ошибок СУБД auth_db.

Physical_ERD_Auth_DB t_users users (Пользователи) id UUID PK, gen_random_uuid() email VARCHAR(255) UNIQUE, NOT NULL password_hash VARCHAR(256) NOT NULL (Argon2id) is_active BOOLEAN DEFAULT true created_at TIMESTAMPTZ DEFAULT NOW() updated_at TIMESTAMPTZ DEFAULT NOW() t_members members (Связующая M2M участников) id UUID PK, gen_random_uuid() group_id VARCHAR(64) FK -> groups.id user_id UUID FK -> users.id role VARCHAR(32) NOT NULL ('Admin' / 'Manager') joined_at TIMESTAMPTZ DEFAULT NOW() t_users:id->t_members:user_id 1..* t_sessions sessions (Рефреш-сессии ротации) id UUID PK, gen_random_uuid() user_id UUID FK -> users.id token_hash VARCHAR(64) UNIQUE, NOT NULL (SHA-256) device_fingerprint VARCHAR(255) NOT NULL is_revoked BOOLEAN DEFAULT false expires_at TIMESTAMPTZ NOT NULL created_at TIMESTAMPTZ DEFAULT NOW() t_users:id->t_sessions:user_id t_groups groups (Домашние/Офисные пространства) id VARCHAR(64) PK (e.g. 'hg_8841') name VARCHAR(128) NOT NULL space_type VARCHAR(16) NOT NULL ('HOME' / 'OFFICE') created_at TIMESTAMPTZ DEFAULT NOW() t_groups:id->t_members:group_id 1..* cache_blacklist cache_blacklist t_sessions:token_hash->cache_blacklist:k1 Инвалидация при Logout t_errors error_directory (Справочник ошибок) id UUID PK, gen_random_uuid() error_code VARCHAR(128) UNIQUE, NOT NULL internal_status VARCHAR(64) NOT NULL message_translations JSONB NOT NULL (ru/en dict) resolution_hint_translations JSONB NOT NULL min_app_version VARCHAR(32) DEFAULT '1.0.0' is_active BOOLEAN DEFAULT true t_violations abuse_violations (Лог нарушений цензуры) id UUID PK, gen_random_uuid() user_id VARCHAR(64) NOT NULL (Индекс) trace_id VARCHAR(128) NOT NULL (X-Request-ID) raw_content TEXT NOT NULL confidence_score NUMERIC(4,3) NOT NULL created_at TIMESTAMPTZ DEFAULT NOW() cache_abuse cache_abuse t_violations:user_id->cache_abuse:k1 Скоринг Lua INCR t_stores b2b_trusted_stores (B2B Партнеры) id UUID PK, gen_random_uuid() shop_id VARCHAR(64) UNIQUE, NOT NULL store_chain_name VARCHAR(128) NOT NULL token_hash VARCHAR(256) NOT NULL (SHA-256) is_active BOOLEAN DEFAULT true

8.1. Физическая ER-модель базы данных: auth_db (auth-service)

Physical_ERD_Auth_DB_Strict t_users users user_id varchar PK email varchar UK password_hash varchar is_active boolean t_sessions user_sessions session_id uuid PK user_id varchar FK refresh_token_hash varchar trace_id varchar IDX t_users:user_id->t_sessions:user_id t_members group_members user_id varchar PK, FK group_id varchar PK, FK role varchar t_users:user_id->t_members:user_id t_groups groups group_id varchar PK space_type varchar is_verified boolean t_groups:group_id->t_members:group_id t_errors error_directory error_code varchar PK http_status int grpc_status_code int app_lang varchar localized_message text

8.1. Физическая ER-модель базы данных: auth_db (auth-service)

Physical_ERD_Auth_DB_Strict t_users users user_id varchar PK email varchar UK password_hash varchar is_active boolean t_sessions user_sessions session_id uuid PK user_id varchar FK refresh_token_hash varchar trace_id varchar IDX t_users:user_id->t_sessions:user_id t_members group_members user_id varchar PK, FK group_id varchar PK, FK role varchar t_users:user_id->t_members:user_id t_groups groups group_id varchar PK space_type varchar is_verified boolean t_groups:group_id->t_members:group_id t_errors error_directory error_code varchar PK http_status int grpc_status_code int app_lang varchar localized_message text

8.2. Физическая ER-модель базы данных: notification_db (notification-service)

Physical_ERD_Notification_DB_Strict t_templates notification_templates template_code varchar PK app_lang varchar PK title varchar body_text text t_push_log push_delivery_log delivery_id int PK user_id varchar template_code varchar trace_id varchar IDX status varchar t_push_log:trace_id->t_templates:template_code Асинхронный trace_id