Загрузка данных
-- ============================================================
-- DATABASE: it_cube — автоматизация приёма и распределения заявок
-- СУБД: MySQL 8.0+
-- Нормализация: 3НФ
-- Таблиц: 7 (без триггеров и индексов)
-- ============================================================
DROP DATABASE IF EXISTS it_cube;
CREATE DATABASE it_cube
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE it_cube;
-- ============================================================
-- 1. TABLE: parents — родители (законные представители)
-- ============================================================
CREATE TABLE parents (
parent_id INT AUTO_INCREMENT PRIMARY KEY, -- код родителя
last_name VARCHAR(50) NOT NULL, -- фамилия
first_name VARCHAR(50) NOT NULL, -- имя
middle_name VARCHAR(50) NULL, -- отчество
phone VARCHAR(20) NOT NULL UNIQUE, -- телефон
email VARCHAR(100) NOT NULL UNIQUE, -- электронная почта
snils CHAR(11) NULL UNIQUE, -- СНИЛС
registered_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -- дата регистрации
) ENGINE=InnoDB;
-- ============================================================
-- 2. TABLE: children — дети (обучающиеся)
-- ============================================================
CREATE TABLE children (
child_id INT AUTO_INCREMENT PRIMARY KEY, -- код ребёнка
last_name VARCHAR(50) NOT NULL, -- фамилия
first_name VARCHAR(50) NOT NULL, -- имя
middle_name VARCHAR(50) NULL, -- отчество
birth_date DATE NOT NULL, -- дата рождения
snils CHAR(11) NULL UNIQUE, -- СНИЛС
parent_id INT NOT NULL, -- код родителя (внешний ключ)
CONSTRAINT fk_children_parents
FOREIGN KEY (parent_id)
REFERENCES parents(parent_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT chk_birth_date
CHECK (birth_date <= CURDATE()) -- дата рождения не в будущем
) ENGINE=InnoDB;
-- ============================================================
-- 3. TABLE: teachers — преподаватели
-- ============================================================
CREATE TABLE teachers (
teacher_id INT AUTO_INCREMENT PRIMARY KEY, -- код преподавателя
last_name VARCHAR(50) NOT NULL, -- фамилия
first_name VARCHAR(50) NOT NULL, -- имя
middle_name VARCHAR(50) NULL, -- отчество
specialization VARCHAR(100) NOT NULL, -- специализация
phone VARCHAR(20) NOT NULL UNIQUE, -- телефон
email VARCHAR(100) NOT NULL UNIQUE -- электронная почта
) ENGINE=InnoDB;
-- ============================================================
-- 4. TABLE: programs — образовательные программы (направления)
-- ============================================================
CREATE TABLE programs (
program_id INT AUTO_INCREMENT PRIMARY KEY, -- код программы
name VARCHAR(100) NOT NULL UNIQUE, -- название программы
description TEXT NULL, -- описание
min_age TINYINT UNSIGNED NOT NULL, -- минимальный возраст
max_age TINYINT UNSIGNED NOT NULL, -- максимальный возраст
duration_hours SMALLINT UNSIGNED NOT NULL, -- длительность (часов)
CONSTRAINT chk_age
CHECK (min_age < max_age AND min_age >= 5) -- корректный возрастной диапазон
) ENGINE=InnoDB;
-- ============================================================
-- 5. TABLE: groups — учебные группы (кружки)
-- ============================================================
CREATE TABLE groups (
group_id INT AUTO_INCREMENT PRIMARY KEY, -- код кружка
program_id INT NOT NULL, -- код программы (внешний ключ)
teacher_id INT NOT NULL, -- код преподавателя (внешний ключ)
room VARCHAR(20) NULL, -- аудитория
academic_year VARCHAR(9) NOT NULL, -- учебный год (напр. 2026/2027)
max_seats SMALLINT UNSIGNED NOT NULL, -- максимум мест
free_seats SMALLINT UNSIGNED NOT NULL, -- свободных мест
CONSTRAINT fk_groups_programs
FOREIGN KEY (program_id)
REFERENCES programs(program_id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT fk_groups_teachers
FOREIGN KEY (teacher_id)
REFERENCES teachers(teacher_id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT chk_seats
CHECK (free_seats <= max_seats AND free_seats >= 0) -- мест не больше максимума и не меньше нуля
) ENGINE=InnoDB;
-- ============================================================
-- 6. TABLE: schedule — расписание занятий
-- ============================================================
CREATE TABLE schedule (
lesson_id INT AUTO_INCREMENT PRIMARY KEY, -- код занятия
group_id INT NOT NULL, -- код кружка (внешний ключ)
weekday ENUM('Пн','Вт','Ср','Чт','Пт','Сб','Вс') NOT NULL, -- день недели
start_time TIME NOT NULL, -- время начала
end_time TIME NOT NULL, -- время окончания
CONSTRAINT fk_schedule_groups
FOREIGN KEY (group_id)
REFERENCES groups(group_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT chk_time
CHECK (start_time < end_time) -- время начала меньше времени окончания
) ENGINE=InnoDB;
-- ============================================================
-- 7. TABLE: applications — заявки на обучение
-- ============================================================
CREATE TABLE applications (
application_id INT AUTO_INCREMENT PRIMARY KEY, -- код заявки
child_id INT NOT NULL, -- код ребёнка (внешний ключ)
group_id INT NULL, -- код кружка (NULL — пока не распределён)
status VARCHAR(20) NOT NULL DEFAULT 'новая', -- статус заявки
submitted_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, -- дата подачи
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP -- дата изменения
ON UPDATE CURRENT_TIMESTAMP,
comment TEXT NULL, -- комментарий
CONSTRAINT fk_applications_children
FOREIGN KEY (child_id)
REFERENCES children(child_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_applications_groups
FOREIGN KEY (group_id)
REFERENCES groups(group_id)
ON DELETE SET NULL
ON UPDATE CASCADE,
CONSTRAINT chk_status
CHECK (status IN ('новая','на_проверке','одобрена',
'зачислен','отклонена','отменена')), -- допустимые статусы
CONSTRAINT chk_enrolled_with_group
CHECK (
(status = 'зачислен' AND group_id IS NOT NULL)
OR
(status <> 'зачислен')
) -- зачислен только при указанном кружке
) ENGINE=InnoDB;
-- ============================================================
-- END OF SCRIPT
-- ============================================================