🗄 База данных
Общая информация
- СУБД: PostgreSQL (локально
postgres:alpine3.23, продакшн — managed PostgreSQL)
- Управление схемой: Flyway (программный запуск)
- Hibernate DDL: Отключён (
ddl-auto=none)
- Расширения:
pgcrypto (bcrypt-хеширование паролей)
- Мультитенантность: Каждый тенант = отдельная БД
ER-диаграмма
Описание таблиц
Справочники высшего уровня
departments — Кафедры
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID кафедры |
name |
VARCHAR(255) |
Название кафедры |
code |
BIGINT UNIQUE |
Код кафедры |
specialties — Специальности
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID специальности |
name |
VARCHAR(255) |
Название специальности |
specialty_code |
VARCHAR(255) |
Код ФГОС (напр. 10.03.01) |
Пользователи
users — Пользователи системы
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID пользователя |
username |
VARCHAR(50) UNIQUE |
Логин |
password |
VARCHAR(255) |
bcrypt-хеш пароля |
role |
VARCHAR(20) |
ADMIN, TEACHER, STUDENT |
full_name |
VARCHAR(255) |
ФИО |
job_title |
VARCHAR(255) |
Должность |
department_id |
BIGINT FK → departments |
Кафедра |
created_at |
TIMESTAMP |
Дата создания |
updated_at |
TIMESTAMP |
Дата обновления (авто-триггер) |
Триггер: update_users_updated_at автоматически обновляет updated_at при любом UPDATE.
Учебный процесс
education_forms — Формы обучения
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
name |
VARCHAR(100) UNIQUE |
Название (Бакалавриат, Магистратура, Специалитет) |
description |
TEXT |
Описание |
student_groups — Учебные группы
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
name |
VARCHAR(100) UNIQUE |
Название группы (напр. ИВТ-21-1) |
group_size |
BIGINT |
Количество студентов |
education_form_id |
BIGINT FK → education_forms |
Форма обучения |
department_id |
BIGINT FK → departments |
Кафедра |
course |
INT CHECK(1–6) |
Курс |
subgroups — Подгруппы
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
group_id |
BIGINT FK → student_groups (CASCADE) |
Родительская группа |
name |
VARCHAR(100) |
Название подгруппы |
student_capacity |
INT |
Количество студентов |
subjects — Дисциплины
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
name |
VARCHAR(200) UNIQUE |
Название |
code |
VARCHAR(20) |
Код предмета |
department_id |
BIGINT FK → departments |
Кафедра |
description |
TEXT |
Описание |
Аудиторный фонд
classrooms — Аудитории
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
name |
VARCHAR(50) UNIQUE |
Название (напр. 101 Ленинская) |
capacity |
INT CHECK(> 0) |
Вместимость |
building |
VARCHAR(50) |
Корпус |
floor |
INT |
Этаж |
is_available |
BOOLEAN |
Доступна для назначения пар |
description |
TEXT |
Описание |
equipments — Оборудование
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
name |
VARCHAR(50) UNIQUE |
Название |
description |
TEXT |
Описание |
inventory_number |
VARCHAR(50) |
Инвентарный номер |
classroom_equipments — Привязка оборудования к аудиториям
| Колонка |
Тип |
Описание |
classroom_id |
BIGINT PK, FK → classrooms (CASCADE) |
Аудитория |
equipment_id |
BIGINT PK, FK → equipments (CASCADE) |
Оборудование |
quantity |
INT CHECK(> 0) |
Количество единиц |
notes |
TEXT |
Примечания |
Расписание
lessons — Основное расписание занятий
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
teacher_id |
BIGINT FK → users |
Преподаватель |
group_id |
BIGINT FK → student_groups |
Группа |
subject_id |
BIGINT FK → subjects |
Дисциплина |
lesson_format |
VARCHAR(255) |
Очно / Онлайн |
type_lesson |
VARCHAR(255) |
Лекция / Практическая работа / Лабораторная работа |
classroom_id |
BIGINT FK → classrooms |
Аудитория |
day |
VARCHAR(255) |
День недели |
week |
VARCHAR(255) |
Верхняя / Нижняя / Обе |
time |
VARCHAR(255) |
Временной слот |
lesson_types — Типы занятий (справочник)
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
name |
VARCHAR(50) UNIQUE |
Название типа |
color_code |
VARCHAR(7) |
HEX-цвет для UI (напр. #FF6B6B) |
duration_minutes |
INT |
Длительность (по умолчанию 90) |
Связи «Преподаватель ↔ Дисциплина»
teacher_subjects — Квалификация преподавателей
| Колонка |
Тип |
Описание |
user_id |
BIGINT PK, FK → users (CASCADE) |
Преподаватель |
subject_id |
BIGINT PK, FK → subjects (CASCADE) |
Дисциплина |
qualification_level |
VARCHAR(50) |
Уровень квалификации |
experience_years |
INT |
Стаж |
teacher_lesson_types — Типы занятий преподавателя
| Колонка |
Тип |
Описание |
user_id |
BIGINT PK, FK → users (CASCADE) |
Преподаватель |
subject_id |
BIGINT PK, FK → subjects (CASCADE) |
Дисциплина |
lesson_type_id |
BIGINT PK, FK → lesson_types (CASCADE) |
Тип занятия |
schedule_data — Данные к составлению расписания
| Колонка |
Тип |
Описание |
id |
BIGSERIAL PK |
ID |
department_id |
BIGINT FK → departments |
Кафедра |
semester |
INT |
Номер семестра |
group_id |
BIGINT FK → student_groups |
Группа |
subjects_id |
BIGINT FK → subjects |
Дисциплина |
lesson_type_id |
BIGINT FK → lesson_types |
Тип занятия |
number_of_hours |
INT |
Количество часов |
is_division |
BOOLEAN |
Деление на подгруппы |
teacher_id |
BIGINT FK → users |
Преподаватель |
semester_type |
VARCHAR(255) |
Весенний / Осенний |
period |
VARCHAR(255) |
Учебный год |
Flyway миграции
Правила работы
- Все миграции находятся в
backend/src/main/resources/db/migration/
- Формат имени:
V{номер}__{описание}.sql (напр. V1__init.sql, V2__add_departments.sql)
- ЗАПРЕЩЕНО изменять уже закоммиченные файлы миграций — это сломает контрольные суммы Flyway
- Flyway запускается программно при первом обращении к БД тенанта (
TenantConfigWatcher.initDatabaseForTenant())
- Настройка
baselineOnMigrate=true — если в БД уже есть данные, Flyway начнёт с baseline
Текущие миграции
| Файл |
Описание |
V1__init.sql |
Инициализация: все таблицы, тестовые данные, триггеры, комментарии |
Накатывание на существующих тенантов
Для применения новой миграции к уже существующим тенантам необходимо перезапустить backend:
Полный сброс БД (локально)