начало работы построения динамического расписания и документация
This commit is contained in:
173
docs/DATABASE.md
173
docs/DATABASE.md
@@ -51,7 +51,8 @@ erDiagram
|
||||
BIGINT group_size
|
||||
BIGINT education_form_id FK
|
||||
BIGINT department_id FK
|
||||
INT course
|
||||
BIGINT specialty_code FK
|
||||
BIGINT year_start_study
|
||||
TIMESTAMP created_at
|
||||
}
|
||||
|
||||
@@ -142,15 +143,82 @@ erDiagram
|
||||
VARCHAR semester_type
|
||||
VARCHAR period
|
||||
}
|
||||
|
||||
time_slots {
|
||||
BIGSERIAL id PK
|
||||
INT order_number UK
|
||||
TIME start_time
|
||||
TIME end_time
|
||||
INT duration_minutes
|
||||
}
|
||||
|
||||
academic_years {
|
||||
BIGSERIAL id PK
|
||||
VARCHAR title UK
|
||||
DATE start_date
|
||||
DATE end_date
|
||||
}
|
||||
|
||||
semesters {
|
||||
BIGSERIAL id PK
|
||||
BIGINT academic_year_id FK
|
||||
VARCHAR semester_type
|
||||
DATE start_date
|
||||
DATE end_date
|
||||
}
|
||||
|
||||
holidays {
|
||||
BIGSERIAL id PK
|
||||
DATE date
|
||||
BIGINT academic_year_id FK
|
||||
VARCHAR description
|
||||
}
|
||||
|
||||
academic_calendar_matrix {
|
||||
BIGSERIAL id PK
|
||||
BIGINT semester_id FK
|
||||
INT course_number
|
||||
BIGINT specialty_id FK
|
||||
INT week_number
|
||||
VARCHAR activity_type
|
||||
}
|
||||
|
||||
schedule_rules {
|
||||
BIGSERIAL id PK
|
||||
BIGINT subject_id FK
|
||||
BIGINT semester_id FK
|
||||
DATE active_from_date
|
||||
INT total_academic_hours
|
||||
}
|
||||
|
||||
schedule_rule_groups {
|
||||
BIGINT schedule_rule_id FK,PK
|
||||
BIGINT group_id FK,PK
|
||||
}
|
||||
|
||||
schedule_rule_slots {
|
||||
BIGSERIAL id PK
|
||||
BIGINT schedule_rule_id FK
|
||||
INT day_of_week
|
||||
VARCHAR parity
|
||||
BIGINT time_slot_id FK
|
||||
BIGINT subgroup_id FK
|
||||
BIGINT teacher_id FK
|
||||
BIGINT classroom_id FK
|
||||
BIGINT lesson_type_id FK
|
||||
VARCHAR lesson_format
|
||||
}
|
||||
|
||||
departments ||--o{ users : "department_id"
|
||||
departments ||--o{ student_groups : "department_id"
|
||||
departments ||--o{ subjects : "department_id"
|
||||
departments ||--o{ schedule_data : "department_id"
|
||||
education_forms ||--o{ student_groups : "education_form_id"
|
||||
specialties ||--o{ student_groups : "specialty_code"
|
||||
student_groups ||--o{ subgroups : "group_id"
|
||||
student_groups ||--o{ lessons : "group_id"
|
||||
student_groups ||--o{ schedule_data : "group_id"
|
||||
student_groups ||--o{ schedule_rule_groups : "group_id"
|
||||
users ||--o{ lessons : "teacher_id"
|
||||
users ||--o{ teacher_subjects : "user_id"
|
||||
users ||--o{ teacher_lesson_types : "user_id"
|
||||
@@ -159,11 +227,24 @@ erDiagram
|
||||
subjects ||--o{ teacher_subjects : "subject_id"
|
||||
subjects ||--o{ teacher_lesson_types : "subject_id"
|
||||
subjects ||--o{ schedule_data : "subjects_id"
|
||||
subjects ||--o{ schedule_rules : "subject_id"
|
||||
lesson_types ||--o{ teacher_lesson_types : "lesson_type_id"
|
||||
lesson_types ||--o{ schedule_data : "lesson_type_id"
|
||||
lesson_types ||--o{ schedule_rule_slots : "lesson_type_id"
|
||||
classrooms ||--o{ lessons : "classroom_id"
|
||||
classrooms ||--o{ schedule_rule_slots : "classroom_id"
|
||||
classrooms ||--o{ classroom_equipments : "classroom_id"
|
||||
equipments ||--o{ classroom_equipments : "equipment_id"
|
||||
academic_years ||--o{ semesters : "academic_year_id"
|
||||
academic_years ||--o{ holidays : "academic_year_id"
|
||||
semesters ||--o{ academic_calendar_matrix : "semester_id"
|
||||
semesters ||--o{ schedule_rules : "semester_id"
|
||||
specialties ||--o{ academic_calendar_matrix : "specialty_id"
|
||||
schedule_rules ||--o{ schedule_rule_groups : "schedule_rule_id"
|
||||
schedule_rules ||--o{ schedule_rule_slots : "schedule_rule_id"
|
||||
time_slots ||--o{ schedule_rule_slots : "time_slot_id"
|
||||
subgroups ||--o{ schedule_rule_slots : "subgroup_id"
|
||||
users ||--o{ schedule_rule_slots : "teacher_id"
|
||||
```
|
||||
|
||||
---
|
||||
@@ -220,7 +301,8 @@ erDiagram
|
||||
| `group_size` | BIGINT | Количество студентов |
|
||||
| `education_form_id` | BIGINT FK → education_forms | Форма обучения |
|
||||
| `department_id` | BIGINT FK → departments | Кафедра |
|
||||
| `course` | INT CHECK(1–6) | Курс |
|
||||
| `specialty_code` | BIGINT FK → specialties | Специальность |
|
||||
| `year_start_study` | BIGINT | Год начала обучения, используется для вычисления текущего курса |
|
||||
|
||||
#### `subgroups` — Подгруппы
|
||||
| Колонка | Тип | Описание |
|
||||
@@ -270,7 +352,10 @@ erDiagram
|
||||
|
||||
### Расписание
|
||||
|
||||
#### `lessons` — Основное расписание занятий
|
||||
#### `lessons` — Временная таблица старой модели
|
||||
|
||||
Таблица пока остаётся в схеме до удаления старого кода, но новая базовая миграция больше не заполняет её тестовыми данными. Целевой источник расписания — `schedule_rules` и `schedule_rule_slots`.
|
||||
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
@@ -309,7 +394,10 @@ erDiagram
|
||||
| `subject_id` | BIGINT PK, FK → subjects (CASCADE) | Дисциплина |
|
||||
| `lesson_type_id` | BIGINT PK, FK → lesson_types (CASCADE) | Тип занятия |
|
||||
|
||||
#### `schedule_data` — Данные к составлению расписания
|
||||
#### `schedule_data` — Временная таблица старой модели нагрузки
|
||||
|
||||
Таблица пока остаётся в схеме до удаления старого кода, но новая базовая миграция больше не использует её как источник seed-данных.
|
||||
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
@@ -324,6 +412,81 @@ erDiagram
|
||||
| `semester_type` | VARCHAR(255) | Весенний / Осенний |
|
||||
| `period` | VARCHAR(255) | Учебный год |
|
||||
|
||||
### Динамическое расписание
|
||||
|
||||
#### `time_slots` — Временные слоты занятий
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
| `order_number` | INT UNIQUE | Номер пары в дне |
|
||||
| `start_time` | TIME | Время начала |
|
||||
| `end_time` | TIME | Время окончания |
|
||||
| `duration_minutes` | INT | Длительность в минутах |
|
||||
|
||||
#### `academic_years` — Учебные годы
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
| `title` | VARCHAR(20) UNIQUE | Название, например `2025-2026` |
|
||||
| `start_date` | DATE | Дата начала |
|
||||
| `end_date` | DATE | Дата окончания |
|
||||
|
||||
#### `semesters` — Семестры
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
| `academic_year_id` | BIGINT FK → academic_years | Учебный год |
|
||||
| `semester_type` | VARCHAR(20) | `autumn` или `spring` |
|
||||
| `start_date` | DATE | Дата начала, от неё считается неделя 1 |
|
||||
| `end_date` | DATE | Дата окончания |
|
||||
|
||||
#### `holidays` — Праздники и исключения
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
| `date` | DATE | Неучебная дата |
|
||||
| `academic_year_id` | BIGINT FK → academic_years | Учебный год |
|
||||
| `description` | VARCHAR(255) | Описание |
|
||||
|
||||
#### `academic_calendar_matrix` — Матрица учебного графика
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
| `semester_id` | BIGINT FK → semesters | Семестр |
|
||||
| `course_number` | INT | Курс |
|
||||
| `specialty_id` | BIGINT FK → specialties | Специальность |
|
||||
| `week_number` | INT | Номер недели семестра |
|
||||
| `activity_type` | VARCHAR(20) | `THEORY`, `EXAM`, `VACATION`, `PRACTICE` |
|
||||
|
||||
#### `schedule_rules` — Правила расписания
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
| `subject_id` | BIGINT FK → subjects | Дисциплина |
|
||||
| `semester_id` | BIGINT FK → semesters | Семестр |
|
||||
| `active_from_date` | DATE | Дата начала действия правила |
|
||||
| `total_academic_hours` | INT | Лимит академических часов |
|
||||
|
||||
#### `schedule_rule_groups` — Группы правила
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `schedule_rule_id` | BIGINT PK, FK → schedule_rules | Правило |
|
||||
| `group_id` | BIGINT PK, FK → student_groups | Группа |
|
||||
|
||||
#### `schedule_rule_slots` — Слоты правила
|
||||
| Колонка | Тип | Описание |
|
||||
|---------|-----|----------|
|
||||
| `id` | BIGSERIAL PK | ID |
|
||||
| `schedule_rule_id` | BIGINT FK → schedule_rules | Правило |
|
||||
| `day_of_week` | INT CHECK(1–7) | День недели: 1 — понедельник |
|
||||
| `parity` | VARCHAR(10) | `BOTH`, `EVEN`, `ODD` |
|
||||
| `time_slot_id` | BIGINT FK → time_slots | Временной слот |
|
||||
| `subgroup_id` | BIGINT FK → subgroups, NULL | Подгруппа |
|
||||
| `teacher_id` | BIGINT FK → users | Преподаватель |
|
||||
| `classroom_id` | BIGINT FK → classrooms | Аудитория |
|
||||
| `lesson_type_id` | BIGINT FK → lesson_types | Тип занятия |
|
||||
| `lesson_format` | VARCHAR(30) | `Очно` или `Онлайн` |
|
||||
|
||||
---
|
||||
|
||||
## Flyway миграции
|
||||
@@ -340,7 +503,7 @@ erDiagram
|
||||
|
||||
| Файл | Описание |
|
||||
|------|----------|
|
||||
| `V1__init.sql` | Инициализация: все таблицы, тестовые данные, триггеры, комментарии |
|
||||
| `V1__init.sql` | Инициализация: справочники, динамическое расписание, тестовые правила, триггеры, комментарии |
|
||||
|
||||
### Накатывание на существующих тенантов
|
||||
|
||||
|
||||
Reference in New Issue
Block a user