VEU.WathBody/1-docs/2-db
virus-home f232d592a4 Этап 7: итерации 1–2 — m01–m05 серверной части + обе волны ревью 2026-10-18 (З-35…З-42)
Модули (d-dev, все закрыты): m01-server-db (38 psql-функций, 13 репозиториев,
psql 123/123), m02-rest-api (sync/workouts/programs + middleware),
m03-program-store (версии draft→active→archived), m04-metrics-engine
(метрики + 6 красных флагов, Safety.*), m05-progression-rules
(ProgressionRules + BreakEngine: правила 1–5, делоад, перерывы/возврат,
фильтр ограничений is_active/замены; Web 81/81 + Core 56/56).

Волны ревью: З-35 external_id до артефактов (миграция 003, program_insert
rev.2 с DROP старой сигнатуры); З-36 --mode migrate (Program.cs,
MigrationRunner, Db.MigrationsDir); З-37 tech-req 4.2 к факту (BpElevated*,
фактические параметры, camelCase); З-38 шлюзы m05; З-39 примечание Ф-14.2
(illness → перезапуск); З-40/З-42 документация к факту (dto, SqlHelperAbstract,
spec m05/m04); З-41(а) is_active=false в sync → exercise_delete (Ф-4.2).

Инфраструктура: docker watchbody-pg (PostgreSQL 17, порт 5433); Kit.Helpers
в 3-app/1-lib (не изменялся). Эксплуатационные файлы (program-trenirovok.*,
program-import.json, presentation-trenirovok.html, журнал метрик) в коммит
не включены.
2026-10-18 20:11:40 +05:00
..
ref Этап 7: итерации 1–2 — m01–m05 серверной части + обе волны ревью 2026-10-18 (З-35…З-42) 2026-10-18 20:11:40 +05:00
src Этап 7: итерации 1–2 — m01–m05 серверной части + обе волны ревью 2026-10-18 (З-35…З-42) 2026-10-18 20:11:40 +05:00
readme.md Этап 7: итерации 1–2 — m01–m05 серверной части + обе волны ревью 2026-10-18 (З-35…З-42) 2026-10-18 20:11:40 +05:00

readme.md

БД WatchBody (PostgreSQL)

Документация БД серверной части — шаг 6 процесса (std1\_process\process.md), правила d-db (std1\_rules\d\d-db.md), db-func (std1\_rules\db\db-func.md). Решение шага 6 — 0-mng\plan.md.

Общие сведения

  • СУБД: PostgreSQL 17+; доступ — только через хранимые функции (Kit.Helpers SqlHelperAbstract/SqlHelperPostgres — fluent PrepareExecute<T>(), tech-requirements разд. 3; З-42 — фактическое имя компонента).
  • Схемы-слои: src — основные данные (атлеты, тренировки, программы, метрики); ref — справочники (двигательные группы).
  • Изоляция атлетов (🛡): каждая таблица данных несёт athlete_id; все функции слоя src принимают p_athlete_id и выбирают/пишут только в пределах атлета (requirements, Ф-8.5, инвариант раздела 5).
  • Идемпотентность (🛡, Р2-Б): PK клиентских сущностей — UUID; телефон генерирует UUID (строки «только .fit» — сервер), повторная вставка с тем же UUID возвращает существующую запись; ссылки дочерних записей — те же UUID, маппинг серверных id не нужен.
  • JSON: версии программ и факты .fit — jsonb с проверкой схемы на стороне приложения (не в БД).

Состав

Файл Содержание
ref\tables.md справочники слоя ref
src\tables.md таблицы слоя src
{слой}\functions.md списки функций (после утверждения таблиц)

План миграции (d-db-1)

  1. Схемы: CREATE SCHEMA IF NOT EXISTS src; CREATE SCHEMA IF NOT EXISTS ref;
  2. Справочники: ref\exercise_group.psql — таблица + вставка 5 значений (идемпотентно, ON CONFLICT (code) DO NOTHING).
  3. Таблицы src: порядок — athlete → athlete_profile → exercise → exercise_replacement → program → program_version → workout → workout_set → command_log → daily_log → workout_metrics → breaks (FK-зависимости).
  4. Функции: файлы {слой}\функции.psql по сущностям в том же порядке (CREATE OR REPLACE — перезапуск безопасен).
  5. Версионирование: каталог 2-db\migrations\ — NNN_описание.sql по возрастанию; каждая миграция идемпотентна (IF NOT EXISTS / OR REPLACE); факт применения — одна запись на файл в src.migration (id, filename, applied_at).
  6. Применение (З-36): Server.WatchBody.Web --mode migrate (--config <path>) — файлы каталога 2-db\migrations\ по возрастанию имён, журнал — src.migration (MigrationRepository), транзакция на файл, коды возврата 0/1; ключ конфига Db.MigrationsDir (умолчание — migrations рядом с исполняемым файлом).

Таблица llm_calls (v2)

Журнал вызовов LLM-планировщика (дизайн LLM-планирования, разд. 8) создаётся в v2 вместе с LlmPlanner — в v1 не проектируется.