diff --git a/Database.md b/Database.md new file mode 100644 index 0000000..4673094 --- /dev/null +++ b/Database.md @@ -0,0 +1,83 @@ +--- +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` там, где это необходимо, для поддержания целостности данных при удалении родительских сущностей. \ No newline at end of file diff --git a/Home.md b/Home.md deleted file mode 100644 index 8b7bd78..0000000 --- a/Home.md +++ /dev/null @@ -1 +0,0 @@ -Добро пожаловать в вики. \ No newline at end of file