Загрузка данных


-- =============================================
-- База данных: Экзаменационная сессия
-- =============================================

CREATE DATABASE IF NOT EXISTS exam_session;
USE exam_session;

-- =============================================
-- 1. Группа
-- =============================================
CREATE TABLE `group` (
    group_id VARCHAR(10) PRIMARY KEY,           
    group_name VARCHAR(100) NOT NULL,
    course INT NOT NULL,
    specialty VARCHAR(150) NOT NULL,
    student_count INT DEFAULT 0
);

-- =============================================
-- 2. Студент
-- =============================================
CREATE TABLE student (
    student_id INT AUTO_INCREMENT PRIMARY KEY,
    full_name VARCHAR(150) NOT NULL,
    birth_date DATE,
    phone VARCHAR(20),
    group_id VARCHAR(10),
    
    FOREIGN KEY (group_id) REFERENCES `group`(group_id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);

-- =============================================
-- 3. Преподаватель
-- =============================================
CREATE TABLE teacher (
    teacher_id VARCHAR(10) PRIMARY KEY,         
    full_name VARCHAR(150) NOT NULL,
    position VARCHAR(100),
    phone VARCHAR(20)
);

-- =============================================
-- 4. Дисциплина
-- =============================================
CREATE TABLE discipline (
    discipline_id VARCHAR(10) PRIMARY KEY,      
    discipline_name VARCHAR(150) NOT NULL,
    hours INT NOT NULL,
    semester INT NOT NULL,
    control_type ENUM('Экзамен', 'Зачёт', 'Дифференцированный зачёт') NOT NULL
);

-- =============================================
-- 5. Связь Преподаватель ↔ Дисциплина (N:M)
-- =============================================
CREATE TABLE teacher_discipline (
    teacher_id VARCHAR(10),
    discipline_id VARCHAR(10),
    PRIMARY KEY (teacher_id, discipline_id),
    FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id)
        ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (discipline_id) REFERENCES discipline(discipline_id)
        ON DELETE CASCADE ON UPDATE CASCADE
);

-- =============================================
-- 6. Сессия
-- =============================================
CREATE TABLE session (
    session_id VARCHAR(10) PRIMARY KEY,         
    academic_year VARCHAR(9) NOT NULL,          
    semester INT NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE NOT NULL
);

-- =============================================
-- 7. Экзамен
-- =============================================
CREATE TABLE exam (
    exam_id INT AUTO_INCREMENT PRIMARY KEY,
    discipline_id VARCHAR(10) NOT NULL,
    teacher_id VARCHAR(10) NOT NULL,
    session_id VARCHAR(10) NOT NULL,
    exam_date DATE NOT NULL,
    exam_time TIME NOT NULL,
    auditorium VARCHAR(20),
    exam_type ENUM('Экзамен', 'Зачёт') NOT NULL,
    
    FOREIGN KEY (discipline_id) REFERENCES discipline(discipline_id)
        ON DELETE RESTRICT ON UPDATE CASCADE,
    FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id)
        ON DELETE RESTRICT ON UPDATE CASCADE,
    FOREIGN KEY (session_id) REFERENCES session(session_id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);

-- =============================================
-- 8. Оценка
-- =============================================
CREATE TABLE grade (
    student_id INT,
    exam_id INT,
    grade_value VARCHAR(20) NOT NULL,           
    grade_date DATE,
    form ENUM('Устно', 'Письменно', 'Тест') NOT NULL,
    
    PRIMARY KEY (student_id, exam_id),
    FOREIGN KEY (student_id) REFERENCES student(student_id)
        ON DELETE CASCADE ON UPDATE CASCADE,
    FOREIGN KEY (exam_id) REFERENCES exam(exam_id)
        ON DELETE CASCADE ON UPDATE CASCADE
);

-- =============================================
-- Индексы
-- =============================================
CREATE INDEX idx_student_group ON student(group_id);
CREATE INDEX idx_exam_discipline ON exam(discipline_id);
CREATE INDEX idx_exam_teacher ON exam(teacher_id);
CREATE INDEX idx_grade_student ON grade(student_id);