много всего и тестовые данные
This commit is contained in:
@@ -953,8 +953,8 @@ V1 создаёт GiST exclusion constraint `ex_academic_years_no_overlap` дл
|
||||
|
||||
Пара `semester_id + version_number` уникальна. Частичный индекс
|
||||
`uq_schedule_versions_published_semester` запрещает более одной строки `PUBLISHED` на
|
||||
семестр. Начальная загрузка V1 создаёт опубликованную версию 1 для каждого семестра и
|
||||
привязывает к ней существующие seed-правила. Для семестров, создаваемых через API после
|
||||
семестр. Тестовая загрузка V2 создаёт опубликованную версию 1 для каждого seed-семестра и
|
||||
привязывает к ней тестовые правила. Для семестров, создаваемых через API после
|
||||
запуска, `AcademicPeriodService` в той же транзакции создаёт пустую опубликованную версию 1
|
||||
`Основное расписание` и две записи истории: создание и публикацию.
|
||||
|
||||
@@ -1177,10 +1177,15 @@ CHECK фиксирует допустимую форму каждого типа
|
||||
### Правила работы
|
||||
|
||||
1. Все миграции находятся в `backend/src/main/resources/db/migration/`
|
||||
2. Формат имени: `V{номер}__{описание}.sql` (напр. `V1__init.sql`, `V2__add_departments.sql`)
|
||||
3. **ЗАПРЕЩЕНО** изменять уже закоммиченные файлы миграций — это сломает контрольные суммы Flyway. Исключение допускается только по прямой просьбе пользователя и при полном сбросе tenant-БД.
|
||||
4. Flyway запускается **программно** при первом обращении к БД тенанта (`TenantConfigWatcher.initDatabaseForTenant()`)
|
||||
5. Настройка `baselineOnMigrate=true` — непустая БД без истории будет помечена baseline и
|
||||
2. Пока действует режим пересобираемого baseline, вся постоянная схема, функции, индексы,
|
||||
триггеры и ограничения изменяются только в `V1__init.sql`.
|
||||
3. `V2__test_data.sql` содержит только тестовые/демонстрационные данные. Постоянный DDL в
|
||||
ней запрещён; временные staging-таблицы должны удаляться до завершения миграции.
|
||||
4. `V3` и последующие миграции не создаются до отдельного решения владельца.
|
||||
5. Изменение V1/V2 меняет контрольные суммы Flyway и требует полного сброса затронутых
|
||||
tenant-БД. Сброс выполняется только по прямой команде владельца.
|
||||
6. Flyway запускается **программно** при первом обращении к БД тенанта (`TenantConfigWatcher.initDatabaseForTenant()`)
|
||||
7. Настройка `baselineOnMigrate=true` — непустая БД без истории будет помечена baseline и
|
||||
`V1` не выполнится; поэтому текущую консолидированную V1 применяют только к полностью
|
||||
пустой tenant-схеме
|
||||
|
||||
@@ -1188,19 +1193,46 @@ CHECK фиксирует допустимую форму каждого типа
|
||||
|
||||
| Файл | Описание |
|
||||
|------|----------|
|
||||
| `V1__init.sql` | Полная baseline-схема: справочники, роли, refresh-сессии JWT, PostgreSQL rate limit и аудит входа, lifecycle-поля, история кафедр, календарные графики, динамическое расписание, версии/черновики и аудит публикаций, точечные изменения, отсутствия и журнал замен, пожелания преподавателей, заявки на изменение занятий и их история, seed, CHECK/UNIQUE/GiST-ограничения, конкурентно безопасные триггеры и комментарии |
|
||||
| `V2__backfill_default_theory_periods.sql` | Добавляет периоды `Т` на весь учебный год для каждого курса только в полностью пустых календарных графиках; уже настроенные графики не изменяет |
|
||||
| `V1__init.sql` | Полная schema-only baseline: таблицы, связи, refresh-сессии JWT, PostgreSQL rate limit и аудит входа, lifecycle-поля, календарные графики, динамическое расписание, версии/черновики и аудит публикаций, точечные изменения, отсутствия, пожелания и заявки преподавателей, CHECK/UNIQUE/GiST-ограничения, конкурентно безопасные триггеры и комментарии. Постоянных доменных данных нет |
|
||||
| `V2__test_data.sql` | Единый тестовый seed: прежние демонстрационные записи V1, справочники и полный набор связанных нагрузочных данных. Здесь же после создания графиков сохранена логика прежней V2: период `Т` на весь год добавляется каждому курсу только полностью пустого графика |
|
||||
|
||||
### Этап разработки
|
||||
|
||||
Исторические разработческие миграции V2–V7, а затем повторно созданные V2 с отсутствиями
|
||||
и мастером замены и V3 с пожеланиями и заявками преподавателей по прямому решению владельца
|
||||
проекта объединены в baseline `V1`. После фиксации baseline новые изменения оформляются
|
||||
отдельными инкрементальными миграциями; первой стала `V2__backfill_default_theory_periods.sql`.
|
||||
Интервальное хранение активностей и правильная нумерация недель календарного графика входят
|
||||
непосредственно в V1.
|
||||
Существующая tenant-БД с уже применённой V1 получает V2 без изменения контрольной суммы
|
||||
baseline. Для развёртывания V1 с нуля по-прежнему требуется пустая tenant-схема.
|
||||
Исторические разработческие изменения объединены в schema-only baseline `V1`. По решению
|
||||
владельца проект временно не наращивает цепочку миграций: изменения постоянной схемы вносятся
|
||||
в V1, а V2 полностью зарезервирована под тестовый набор. Такой режим рассчитан на пересоздание
|
||||
tenant-БД с нуля и несовместим с сохранением прежних контрольных сумм V1/V2.
|
||||
|
||||
`V2__test_data.sql` применяется общим `TenantDatabaseMigrationService` без разделения по
|
||||
Spring-профилям, поэтому сейчас тестовый набор попадёт в каждый новый tenant, включая
|
||||
production. Это сознательное ограничение текущего режима разработки; перед production-релизом
|
||||
V2 необходимо сделать условной или исключить из production locations.
|
||||
|
||||
### Объём тестового набора V2
|
||||
|
||||
На чистой схеме V2 создаёт детерминированный связанный набор:
|
||||
|
||||
| Сущности | Количество |
|
||||
|----------|-----------:|
|
||||
| Кафедры / специальности / профили | 41 / 42 / 42 |
|
||||
| Пользователи / преподаватели | 155 / 151 |
|
||||
| Группы / подгруппы | 202 / 404 |
|
||||
| Дисциплины / связи преподаватель–дисциплина / разрешённые типы занятий | 229 / 844 / 2532 |
|
||||
| Аудитории / связи с оборудованием | 80 / 174 |
|
||||
| Календарные графики / периоды / дисциплины графиков / назначения групп | 132 / 576 / 3456 / 202 |
|
||||
| Версии / события истории | 8 / 16 |
|
||||
| Правила / связи с группами / слоты / лабораторные подгруппы | 610 / 611 / 610 / 202 |
|
||||
| Пожелания / отсутствия / комментарии к дисциплинам | 60 / 20 / 40 |
|
||||
|
||||
Учебные годы: 2024–2025, 2025–2026, 2026–2027 и 2027–2028. Для трёх последних
|
||||
создаётся одинаковый набор из 44 графиков направлений с периодами теоретического обучения
|
||||
и дисциплинами по семестрам. Назначения существующих групп сохраняются на 2025–2026 год.
|
||||
|
||||
Из 202 групп две (`ИВТ-21-1`, `ИБ-41м`) перенесены из прежней V1, ещё 200 созданы по
|
||||
шифрам направлений ЮЗГУ. Источниками названий служат публичные страницы структуры,
|
||||
приёмной кампании и перечней дисциплин ЮЗГУ; ФИО 150 массовых преподавателей синтетические
|
||||
и имеют непубликуемый случайный пароль. Доступны для ручного входа только документированные
|
||||
исторические demo-аккаунты.
|
||||
|
||||
### Полный сброс БД (локально)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user