# Шаг 2: Проектирование базы данных ## Цель Спроектировать и создать структуру базы данных для хранения всех сущностей системы. --- ## Задачи ### 2.1. Сущности базы данных #### Таблица: `departments` (Подразделения) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | name | VARCHAR(255) | Название подразделения | | created_at | TIMESTAMP | Дата создания | | updated_at | TIMESTAMP | Дата обновления | #### Таблица: `users` (Пользователи) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | login | VARCHAR(100) | Уникальный логин | | password_hash | VARCHAR(255) | Хеш пароля | | full_name | VARCHAR(255) | ФИО | | role | ENUM | 'hr', 'manager', 'employee' | | department_id | UUID | FK -> departments | | is_active | BOOLEAN | Активна ли учётная запись | | created_at | TIMESTAMP | Дата создания | | updated_at | TIMESTAMP | Дата обновления | #### Таблица: `tests` (Тесты) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | title | VARCHAR(255) | Название теста | | description | TEXT | Описание (опционально) | | passing_threshold | INTEGER | Порог зачёта (%) | | time_limit | INTEGER | Таймер в минутах (nullable) | | allow_back | BOOLEAN | Возврат к предыдущему | | is_active | BOOLEAN | Активен | | is_versioned | BOOLEAN | Есть версии | | created_by | UUID | FK -> users | | created_at | TIMESTAMP | Дата создания | | updated_at | TIMESTAMP | Дата обновления | #### Таблица: `test_versions` (Версии тестов) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | test_id | UUID | FK -> tests | | version | INTEGER | Номер версии | | is_active | BOOLEAN | Активная версия | | created_at | TIMESTAMP | Дата создания | #### Таблица: `questions` (Вопросы) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | test_version_id | UUID | FK -> test_versions | | text | TEXT | Текст вопроса | | question_order | INTEGER | Порядок вопроса | | has_multiple_answers | BOOLEAN | Несколько правильных | #### Таблица: `answer_options` (Варианты ответов) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | question_id | UUID | FK -> questions | | text | TEXT | Текст варианта | | is_correct | BOOLEAN | Правильный ответ | | option_order | INTEGER | Порядок варианта | #### Таблица: `test_assignments` (Назначения тестов) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | test_version_id | UUID | FK -> test_versions | | assigned_by | UUID | FK -> users | | deadline | DATE | Срок сдачи | | max_attempts | INTEGER | Допустимое число попыток | | created_at | TIMESTAMP | Дата назначения | #### Таблица: `test_assignment_targets` (Получатели назначений) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | assignment_id | UUID | FK -> test_assignments | | target_type | ENUM | 'department', 'user' | | target_id | UUID | FK (department или user) | #### Таблица: `test_attempts` (Попытки прохождения) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | test_version_id | UUID | FK -> test_versions | | user_id | UUID | FK -> users | | attempt_number | INTEGER | Номер попытки | | status | ENUM | 'in_progress', 'completed', 'expired' | | started_at | TIMESTAMP | Начало | | completed_at | TIMESTAMP | Завершение | | correct_count | INTEGER | Правильных ответов | | total_questions | INTEGER | Всего вопросов | | passed | BOOLEAN | Зачёт | #### Таблица: `user_answers` (Ответы пользователя) | Поле | Тип | Описание | |------|-----|----------| | id | UUID | PK | | attempt_id | UUID | FK -> test_attempts | | question_id | UUID | FK -> questions | | selected_options | UUID[] | Выбранные варианты | #### Таблица: `settings` (Настройки) | Поле | Тип | Описание | |------|-----|----------| | key | VARCHAR(100) | PK | | value | TEXT | Значение | --- ## Результат - Созданы все таблицы с связями - Накатанные миграции - Схема БД готова