Files
magistr/.agent/rules/database_schema.md

84 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
description: Полное описание схемы базы данных проекта
---
# Описание базы данных: Система расписания университета
В этом правиле содержится полное описание структуры базы данных PostgreSQL, используемой в проекте.
## Основные сущности и таблицы
### 1. Пользователи и роли (`users`)
Хранит учетные записи пользователей системы.
- `id` (BIGSERIAL, РК)
- `username` (VARCHAR(50), UNIQUE, NOT NULL) - логин
- `password` (VARCHAR(255), NOT NULL) - хэш пароля (используется bcrypt через pgcrypto)
- `role` (VARCHAR(20), NOT NULL, DEFAULT 'STUDENT') - роль пользователя. Возможные значения: `ADMIN`, `TEACHER`, `STUDENT`.
### 2. Формы обучения (`education_forms`)
Справочник форм обучения.
- `id` (BIGSERIAL, РК)
- `name` (VARCHAR(100), UNIQUE, NOT NULL) - например: 'Бакалавриат', 'Магистратура', 'Специалитет'
### 3. Студенческие группы (`student_groups`)
Справочник учебных групп.
- `id` (BIGSERIAL, РК)
- `name` (VARCHAR(100), UNIQUE, NOT NULL) - название группы (например, 'ИВТ-21-1')
- `education_form_id` (BIGINT, FK -> education_forms.id) - привязка к форме обучения
### 4. Подгруппы (`subgroups`)
Разделение групп на подгруппы (для лабораторных и практик).
- `id` (BIGSERIAL, РК)
- `group_id` (BIGINT, FK -> student_groups.id)
- `name` (VARCHAR(100), NOT NULL) - название подгруппы (например, 'Подгруппа 1')
### 5. Дисциплины (`subjects`)
Справочник учебных предметов.
- `id` (BIGSERIAL, РК)
- `name` (VARCHAR(200), UNIQUE, NOT NULL) - название дисциплины (например, 'Высшая математика')
### 6. Типы занятий (`lesson_types`)
Справочник видов учебных занятий.
- `id` (BIGSERIAL, РК)
- `name` (VARCHAR(50), UNIQUE, NOT NULL) - вид занятия (Лекция, Практика, Лабораторная работа)
### 7. Оборудование (`equipments`)
Справочник доступного оборудования для аудиторий.
- `id` (BIGSERIAL, РК)
- `name` (VARCHAR(50), UNIQUE, NOT NULL) - например, 'Проектор', 'ПК', 'Лаборатория', 'Интерактивная доска'
### 8. Аудиторный фонд (`classrooms`)
Справочник аудиторий университета.
- `id` (BIGSERIAL, РК)
- `name` (VARCHAR(50), UNIQUE, NOT NULL) - номер/название аудитории
- `capacity` (INT, NOT NULL) - вместимость (количество посадочных мест)
- `is_available` (BOOLEAN, DEFAULT TRUE) - статус доступности аудитории для проведения пар
### 9. Привязка оборудования к аудиториям (`classroom_equipments`)
Связующая таблица (Many-to-Many) для указания, какое оборудование есть в аудитории.
- `classroom_id` (BIGINT, FK -> classrooms.id)
- `equipment_id` (BIGINT, FK -> equipments.id)
### 10. Привязка преподавателей к дисциплинам (`teacher_subjects`)
Связующая таблица (Many-to-Many). Определяет, какие предметы имеет право вести преподаватель.
- `user_id` (BIGINT, FK -> users.id)
- `subject_id` (BIGINT, FK -> subjects.id)
### 11. Расписание занятий (Пар) (`lessons`)
Главная таблица, хранящая сетку расписания. Связывает все основные сущности в рамках одного учебного занятия.
- `id` (BIGSERIAL, РК)
- `teacher_id` (BIGINT, FK -> users.id) - кто ведет пару
- `subject_id` (BIGINT, FK -> subjects.id) - какую дисциплину ведут
- `lesson_type_id` (BIGINT, FK -> lesson_types.id) - вид занятия (лекция/практика)
- `classroom_id` (BIGINT, FK -> classrooms.id) - где проходит
- `group_id` (BIGINT, FK -> student_groups.id) - у какой группы
- `subgroup_id` (BIGINT, FK -> subgroups.id, NULLABLE) - конкретная подгруппа (если пара не у всей группы)
- `day_of_week` (INT, NOT NULL) - день недели (1=Понедельник ... 7=Воскресенье)
- `is_even_week` (BOOLEAN, NOT NULL) - признак четности недели (TRUE = четная, FALSE = нечетная)
- `start_time` (TIME, NOT NULL) - время начала пары (например: '08:00:00')
- `end_time` (TIME, NOT NULL) - время окончания пары (например: '09:30:00')
## Особенности архитектуры БД
- Используется расширение `pgcrypto` для шифрования паролей пользователей (`bcrypt`).
- Все связи Many-to-Many и внешние ключи настроены с `ON DELETE CASCADE` там, где это необходимо, для поддержания целостности данных при удалении родительских сущностей.