CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE TABLE IF NOT EXISTS users ( id BIGSERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, role VARCHAR(20) NOT NULL DEFAULT 'STUDENT' ); -- Админ по умолчанию: admin / admin (bcrypt через pgcrypto) INSERT INTO users (username, password, role) VALUES ('admin', crypt('admin', gen_salt('bf', 10)), 'ADMIN') ON CONFLICT (username) DO NOTHING; CREATE TABLE IF NOT EXISTS education_forms ( id BIGSERIAL PRIMARY KEY, name VARCHAR(100) UNIQUE NOT NULL ); INSERT INTO education_forms (name) VALUES ('Бакалавриат'), ('Магистратура'), ('Специалитет') ON CONFLICT (name) DO NOTHING; CREATE TABLE IF NOT EXISTS student_groups ( id BIGSERIAL PRIMARY KEY, name VARCHAR(100) UNIQUE NOT NULL, education_form_id BIGINT NOT NULL REFERENCES education_forms(id) ); -- ========================================== -- Справочники -- ========================================== -- Дисциплины CREATE TABLE IF NOT EXISTS subjects ( id BIGSERIAL PRIMARY KEY, name VARCHAR(200) UNIQUE NOT NULL ); INSERT INTO subjects (name) VALUES ('Высшая математика'), ('Философия'), ('Информатика'), ('Базы данных'), ('Английский язык') ON CONFLICT (name) DO NOTHING; -- Типы занятий CREATE TABLE IF NOT EXISTS lesson_types ( id BIGSERIAL PRIMARY KEY, name VARCHAR(50) UNIQUE NOT NULL ); INSERT INTO lesson_types (name) VALUES ('Лекция'), ('Практика'), ('Лабораторная работа') ON CONFLICT (name) DO NOTHING; -- Оборудование CREATE TABLE IF NOT EXISTS equipments ( id BIGSERIAL PRIMARY KEY, name VARCHAR(50) UNIQUE NOT NULL ); INSERT INTO equipments (name) VALUES ('Проектор'), ('ПК'), ('Лаборатория'), ('Интерактивная доска') ON CONFLICT (name) DO NOTHING; -- Аудитории CREATE TABLE IF NOT EXISTS classrooms ( id BIGSERIAL PRIMARY KEY, name VARCHAR(50) UNIQUE NOT NULL, capacity INT NOT NULL, is_available BOOLEAN DEFAULT TRUE ); INSERT INTO classrooms (name, capacity) VALUES ('101 Ленинская', 120), ('202 IT Lab', 20), ('303 Обычная', 30) ON CONFLICT (name) DO NOTHING; -- Привязка оборудования к аудиториям (Many-to-Many) CREATE TABLE IF NOT EXISTS classroom_equipments ( classroom_id BIGINT NOT NULL REFERENCES classrooms(id) ON DELETE CASCADE, equipment_id BIGINT NOT NULL REFERENCES equipments(id) ON DELETE CASCADE, PRIMARY KEY (classroom_id, equipment_id) ); -- Заполнение привязок оборудования (на основе ID базовых данных) -- '101 Ленинская' -> Проектор (1), Интерактивная доска (4) INSERT INTO classroom_equipments (classroom_id, equipment_id) VALUES (1, 1), (1, 4), -- '202 IT Lab' -> ПК (2), Проектор (1), Лаборатория (3) (2, 2), (2, 1), (2, 3) -- '303 Обычная' -> ничего ON CONFLICT DO NOTHING; -- ========================================== -- Связи для преподавателей и студентов -- ========================================== -- Подгруппы (например: "ИВТ-21-1 Подгруппа 1") CREATE TABLE IF NOT EXISTS subgroups ( id BIGSERIAL PRIMARY KEY, group_id BIGINT NOT NULL REFERENCES student_groups(id) ON DELETE CASCADE, name VARCHAR(100) NOT NULL, UNIQUE(group_id, name) ); -- Тестовая базовая группа для работы INSERT INTO student_groups (name, education_form_id) VALUES ('ИВТ-21-1', 1) ON CONFLICT (name) DO NOTHING; -- Привязка преподавателей к дисциплинам CREATE TABLE IF NOT EXISTS teacher_subjects ( user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, subject_id BIGINT NOT NULL REFERENCES subjects(id) ON DELETE CASCADE, PRIMARY KEY(user_id, subject_id) ); -- ========================================== -- Основная таблица Расписания (Lessons) -- ========================================== CREATE TABLE IF NOT EXISTS lessons ( id BIGSERIAL PRIMARY KEY, teacher_id BIGINT NOT NULL REFERENCES users(id), subject_id BIGINT NOT NULL REFERENCES subjects(id), lesson_type_id BIGINT NOT NULL REFERENCES lesson_types(id), classroom_id BIGINT NOT NULL REFERENCES classrooms(id), group_id BIGINT NOT NULL REFERENCES student_groups(id), -- первичная группа subgroup_id BIGINT REFERENCES subgroups(id), -- необязательно (если делим группу) day_of_week INT NOT NULL CHECK (day_of_week BETWEEN 1 AND 7), -- 1=Понедельник, 7=Воскресенье is_even_week BOOLEAN NOT NULL, -- Четная/нечетная неделя start_time TIME NOT NULL, -- Напр. '08:00:00' end_time TIME NOT NULL -- Напр. '09:30:00' );