Fix database migration: merge V2 into V1 and remove V2 #9

Merged
Zuev merged 1 commits from department_dev into main 2026-03-19 01:32:07 +00:00
Showing only changes of commit dc1c343174 - Show all commits

View File

@@ -3,6 +3,31 @@
-- ========================================== -- ==========================================
CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE EXTENSION IF NOT EXISTS pgcrypto;
-- ===============================
-- Справочники высшего уровня
-- ===============================
CREATE TABLE IF NOT EXISTS departments (
id BIGSERIAL UNIQUE PRIMARY KEY NOT NULL,
name VARCHAR(255) NOT NULL,
code BIGINT UNIQUE NOT NULL
);
INSERT INTO departments (name, code) VALUES
('Кафедра ИБ', 1),
('Кафедра ВТ', 2),
('Кафедра КТ', 3);
CREATE TABLE IF NOT EXISTS specialties (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
specialty_code VARCHAR(255) NOT NULL
);
INSERT INTO specialties (name, specialty_code) VALUES
('Информационная безопасность', '10.03.01'),
('Информатика и вычислительная техника', '09.03.01'),
('Программная инженерия', '09.03.04');
-- ========================================== -- ==========================================
-- Пользователи и роли -- Пользователи и роли
-- ========================================== -- ==========================================
@@ -11,14 +36,17 @@ CREATE TABLE IF NOT EXISTS users (
username VARCHAR(50) UNIQUE NOT NULL, username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL,
role VARCHAR(20) NOT NULL DEFAULT 'STUDENT', role VARCHAR(20) NOT NULL DEFAULT 'STUDENT',
full_name VARCHAR(255) NOT NULL,
job_title VARCHAR(255) NOT NULL,
department_id BIGINT NOT NULL REFERENCES departments(id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
); );
-- Админ по умолчанию: admin / admin (bcrypt через pgcrypto) -- Админ по умолчанию: admin / admin (bcrypt через pgcrypto)
INSERT INTO users (username, password, role) INSERT INTO users (username, password, role, full_name, job_title, department_id)
VALUES ('admin', crypt('admin', gen_salt('bf', 10)), 'ADMIN'), VALUES ('admin', crypt('admin', gen_salt('bf', 10)), 'ADMIN', 'Иванов Админ Иванович', 'Доцент', 1),
('Тестовый преподаватель', '1234567890', 'TEACHER') ('Тестовый преподаватель', crypt('1234567890', gen_salt('bf', 10)), 'TEACHER', 'Петров Препод Петрович', 'Профессор', 2)
ON CONFLICT (username) DO NOTHING; ON CONFLICT (username) DO NOTHING;
-- ========================================== -- ==========================================
@@ -45,14 +73,15 @@ CREATE TABLE IF NOT EXISTS student_groups (
name VARCHAR(100) UNIQUE NOT NULL, name VARCHAR(100) UNIQUE NOT NULL,
group_size BIGINT NOT NULL, group_size BIGINT NOT NULL,
education_form_id BIGINT NOT NULL REFERENCES education_forms(id), education_form_id BIGINT NOT NULL REFERENCES education_forms(id),
department_id BIGINT NOT NULL REFERENCES departments(id),
course INT CHECK (course BETWEEN 1 AND 6), course INT CHECK (course BETWEEN 1 AND 6),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
); );
-- Тестовая базовая группа для работы -- Тестовая базовая группа для работы
INSERT INTO student_groups (name, group_size, education_form_id, course) INSERT INTO student_groups (name, group_size, education_form_id, department_id, course)
VALUES ('ИВТ-21-1', 25, 1, 3), VALUES ('ИВТ-21-1', 25, 1, 1, 3),
('ИБ-41м', 15, 2, 2) ('ИБ-41м', 15, 2, 1, 2)
ON CONFLICT (name) DO NOTHING; ON CONFLICT (name) DO NOTHING;
-- ========================================== -- ==========================================
@@ -75,23 +104,24 @@ CREATE TABLE IF NOT EXISTS subjects (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
name VARCHAR(200) UNIQUE NOT NULL, name VARCHAR(200) UNIQUE NOT NULL,
code VARCHAR(20), code VARCHAR(20),
department_id BIGINT NOT NULL REFERENCES departments(id),
description TEXT, description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
); );
INSERT INTO subjects (name) VALUES INSERT INTO subjects (name, department_id) VALUES
('Высшая математика'), ('Высшая математика', 1),
('Философия'), ('Философия', 1),
('Информатика'), ('Информатика', 1),
('Базы данных'), ('Базы данных', 1),
('Английский язык') ('Английский язык', 1)
ON CONFLICT (name) DO NOTHING; ON CONFLICT (name) DO NOTHING;
-- Типы занятий -- Типы занятий
CREATE TABLE IF NOT EXISTS lesson_types ( CREATE TABLE IF NOT EXISTS lesson_types (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
name VARCHAR(50) UNIQUE NOT NULL, name VARCHAR(50) UNIQUE NOT NULL,
color_code VARCHAR(7) DEFAULT '#3788d8', -- для цветовой индикации в календаре color_code VARCHAR(7) DEFAULT '#3788d8',
duration_minutes INT DEFAULT 90 duration_minutes INT DEFAULT 90
); );
@@ -145,7 +175,6 @@ CREATE TABLE IF NOT EXISTS classroom_equipments (
PRIMARY KEY (classroom_id, equipment_id) PRIMARY KEY (classroom_id, equipment_id)
); );
-- Заполнение привязок оборудования с использованием подзапросов
INSERT INTO classroom_equipments (classroom_id, equipment_id, quantity) INSERT INTO classroom_equipments (classroom_id, equipment_id, quantity)
SELECT c.id, e.id, SELECT c.id, e.id,
CASE CASE
@@ -164,7 +193,6 @@ ON CONFLICT (classroom_id, equipment_id) DO NOTHING;
-- Связи для преподавателей -- Связи для преподавателей
-- ========================================== -- ==========================================
-- Привязка преподавателей к дисциплинам
CREATE TABLE IF NOT EXISTS teacher_subjects ( CREATE TABLE IF NOT EXISTS teacher_subjects (
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
subject_id BIGINT NOT NULL REFERENCES subjects(id) ON DELETE CASCADE, subject_id BIGINT NOT NULL REFERENCES subjects(id) ON DELETE CASCADE,
@@ -173,7 +201,6 @@ CREATE TABLE IF NOT EXISTS teacher_subjects (
PRIMARY KEY(user_id, subject_id) PRIMARY KEY(user_id, subject_id)
); );
-- Какие типы занятий может вести преподаватель по дисциплине
CREATE TABLE IF NOT EXISTS teacher_lesson_types ( CREATE TABLE IF NOT EXISTS teacher_lesson_types (
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
subject_id BIGINT NOT NULL REFERENCES subjects(id) ON DELETE CASCADE, subject_id BIGINT NOT NULL REFERENCES subjects(id) ON DELETE CASCADE,
@@ -205,6 +232,28 @@ INSERT INTO lessons (teacher_id, group_id, subject_id, lesson_format, type_lesso
(2, 1, 5, 'Очно', 'Практическая работа', 2, 'Пятница', 'Верхняя', '15:00 - 16:30'), (2, 1, 5, 'Очно', 'Практическая работа', 2, 'Пятница', 'Верхняя', '15:00 - 16:30'),
(1, 1, 3, 'Онлайн', 'Лабораторная работа', 3, 'Суббота', 'Нижняя', '8:00 - 9:30'); (1, 1, 3, 'Онлайн', 'Лабораторная работа', 3, 'Суббота', 'Нижняя', '8:00 - 9:30');
-- ===============================
-- Создание таблицы данных расписания (schedule_data)
-- ===============================
CREATE TABLE IF NOT EXISTS schedule_data (
id BIGSERIAL PRIMARY KEY,
department_id BIGINT NOT NULL REFERENCES departments(id),
semester INT NOT NULL,
group_id BIGINT NOT NULL REFERENCES student_groups(id),
subjects_id BIGINT NOT NULL REFERENCES subjects(id),
lesson_type_id BIGINT NOT NULL REFERENCES lesson_types(id),
number_of_hours INT NOT NULL,
is_division BOOLEAN NOT NULL DEFAULT FALSE,
teacher_id BIGINT NOT NULL REFERENCES users(id),
semester_type VARCHAR(255) NOT NULL,
period VARCHAR(255) NOT NULL
);
INSERT INTO schedule_data (department_id, semester, group_id, subjects_id, lesson_type_id, number_of_hours, is_division, teacher_id, semester_type, period)
VALUES (1, 1, 1, 1, 3, 2, true, 1, 'Весенний', '2024/2025'),
(2, 4, 2, 3, 2, 1, false, 2, 'Осенний', '2025/2026'),
(3, 5, 1, 2, 1, 3, true, 1, 'Весенний', '2023/2024');
-- ========================================== -- ==========================================
-- Функция обновления timestamp -- Функция обновления timestamp
-- ========================================== -- ==========================================
@@ -216,7 +265,6 @@ BEGIN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- Триггеры для обновления updated_at
CREATE TRIGGER update_users_updated_at CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users BEFORE UPDATE ON users
FOR EACH ROW FOR EACH ROW
@@ -227,3 +275,112 @@ CREATE TRIGGER update_users_updated_at
-- ========================================== -- ==========================================
COMMENT ON TABLE users IS 'Пользователи системы (студенты, преподаватели, администраторы)'; COMMENT ON TABLE users IS 'Пользователи системы (студенты, преподаватели, администраторы)';
COMMENT ON TABLE lessons IS 'Основное расписание занятий'; COMMENT ON TABLE lessons IS 'Основное расписание занятий';
COMMENT ON TABLE departments IS 'Кафедры';
COMMENT ON TABLE specialties IS 'Специальности';
COMMENT ON TABLE schedule_data IS 'Данные к составлению расписания';
COMMENT ON COLUMN schedule_data.department_id IS 'Идентификатор кафедры';
COMMENT ON COLUMN schedule_data.semester IS 'Номер семестра';
COMMENT ON COLUMN schedule_data.group_id IS 'Идентификатор группы';
COMMENT ON COLUMN schedule_data.subjects_id IS 'Идентификатор предмета';
COMMENT ON COLUMN schedule_data.lesson_type_id IS 'Идентификатор типа занятия';
COMMENT ON COLUMN schedule_data.number_of_hours IS 'Количество часов';
COMMENT ON COLUMN schedule_data.is_division IS 'Является ли занятие разделенным';
COMMENT ON COLUMN schedule_data.teacher_id IS 'Идентификатор преподавателя';
COMMENT ON COLUMN schedule_data.semester_type IS 'Тип семестра (Весенний, Осенний)';
COMMENT ON COLUMN schedule_data.period IS 'Период занятий (год/год)';
COMMENT ON TABLE education_forms IS 'Формы обучения';
COMMENT ON TABLE subgroups IS 'Подгруппы';
COMMENT ON TABLE lesson_types IS 'Типы занятий';
COMMENT ON TABLE equipments IS 'Оборудование';
COMMENT ON TABLE classrooms IS 'Аудитории';
COMMENT ON TABLE classroom_equipments IS 'Привязка оборудования к аудиториям';
COMMENT ON TABLE teacher_subjects IS 'Привязка преподавателей к дисциплинам';
COMMENT ON TABLE teacher_lesson_types IS 'Типы занятий преподавателя';
COMMENT ON COLUMN users.id IS 'ID пользователя';
COMMENT ON COLUMN users.username IS 'Логин пользователя';
COMMENT ON COLUMN users.password IS 'Хэш пароля пользователя';
COMMENT ON COLUMN users.role IS 'Роль пользователя';
COMMENT ON COLUMN users.created_at IS 'Дата и время создания';
COMMENT ON COLUMN users.updated_at IS 'Дата и время последнего обновления';
COMMENT ON COLUMN users.full_name IS 'ФИО пользователя';
COMMENT ON COLUMN users.job_title IS 'Должность пользователя';
COMMENT ON COLUMN users.department_id IS 'ID кафедры';
COMMENT ON COLUMN education_forms.id IS 'ID формы обучения';
COMMENT ON COLUMN education_forms.name IS 'Название формы обучения';
COMMENT ON COLUMN education_forms.description IS 'Описание';
COMMENT ON COLUMN education_forms.created_at IS 'Дата и время создания';
COMMENT ON COLUMN student_groups.id IS 'ID учебной группы';
COMMENT ON COLUMN student_groups.name IS 'Название группы';
COMMENT ON COLUMN student_groups.group_size IS 'Количество студентов';
COMMENT ON COLUMN student_groups.education_form_id IS 'ID формы обучения, к которой относится группа';
COMMENT ON COLUMN student_groups.department_id IS 'ID кафедры';
COMMENT ON COLUMN student_groups.course IS 'Курс';
COMMENT ON COLUMN student_groups.created_at IS 'Дата и время создания';
COMMENT ON COLUMN subgroups.id IS 'ID подгруппы';
COMMENT ON COLUMN subgroups.group_id IS 'ID учебной группы, к которой относится подгруппа';
COMMENT ON COLUMN subgroups.name IS 'Название подгруппы';
COMMENT ON COLUMN subgroups.student_capacity IS 'Количество студентов в подгруппе';
COMMENT ON COLUMN subjects.id IS 'ID предмета';
COMMENT ON COLUMN subjects.name IS 'Название предмета';
COMMENT ON COLUMN subjects.code IS 'Код предмета';
COMMENT ON COLUMN subjects.department_id IS 'ID кафедры';
COMMENT ON COLUMN subjects.description IS 'Описание предмета';
COMMENT ON COLUMN subjects.created_at IS 'Дата и время создания';
COMMENT ON COLUMN lesson_types.id IS 'ID урока';
COMMENT ON COLUMN lesson_types.name IS 'Название типа урока';
COMMENT ON COLUMN lesson_types.color_code IS 'Цветовой код для типа урока';
COMMENT ON COLUMN lesson_types.duration_minutes IS 'Длительность урока в минутах';
COMMENT ON COLUMN equipments.id IS 'ID оборудования';
COMMENT ON COLUMN equipments.name IS 'Название оборудования';
COMMENT ON COLUMN equipments.description IS 'Описание оборудования';
COMMENT ON COLUMN equipments.inventory_number IS 'Инвентарный номер оборудования';
COMMENT ON COLUMN classrooms.id IS 'ID аудитории';
COMMENT ON COLUMN classrooms.name IS 'Название аудитории';
COMMENT ON COLUMN classrooms.capacity IS 'Вместимость аудитории';
COMMENT ON COLUMN classrooms.building IS 'Корпус';
COMMENT ON COLUMN classrooms.floor IS 'Этаж';
COMMENT ON COLUMN classrooms.is_available IS 'Доступность аудитории';
COMMENT ON COLUMN classrooms.description IS 'Описание аудитории';
COMMENT ON COLUMN classrooms.created_at IS 'Дата и время создания';
COMMENT ON COLUMN classroom_equipments.classroom_id IS 'ID аудитории';
COMMENT ON COLUMN classroom_equipments.equipment_id IS 'ID оборудования';
COMMENT ON COLUMN classroom_equipments.quantity IS 'Дата и время создания'; -- Так было в V2
COMMENT ON COLUMN classroom_equipments.notes IS 'Примечания к записи';
COMMENT ON COLUMN teacher_subjects.user_id IS 'ID преподавателя';
COMMENT ON COLUMN teacher_subjects.subject_id IS 'ID предмета';
COMMENT ON COLUMN teacher_subjects.qualification_level IS 'Уровень квалификации преподавателя';
COMMENT ON COLUMN teacher_subjects.experience_years IS 'Опыт преподавания';
COMMENT ON COLUMN lessons.id IS 'ID урока';
COMMENT ON COLUMN lessons.teacher_id IS 'Идентификатор преподавателя, который проводит урок';
COMMENT ON COLUMN lessons.group_id IS 'ID группы, в которой проходит урок';
COMMENT ON COLUMN lessons.subject_id IS 'ID предмета, который преподается';
COMMENT ON COLUMN lessons.lesson_format IS 'Формат урока';
COMMENT ON COLUMN lessons.type_lesson IS 'Тип урока';
COMMENT ON COLUMN lessons.classroom_id IS 'ID аудитории, в которой проходит урок';
COMMENT ON COLUMN lessons.day IS 'День недели, в который проходит урок';
COMMENT ON COLUMN lessons.week IS 'Номер недели, в которой проходит урок';
COMMENT ON COLUMN lessons.time IS 'Время урока';
COMMENT ON COLUMN departments.id IS 'ID кафедры';
COMMENT ON COLUMN departments.name IS 'Название кафедры';
COMMENT ON COLUMN departments.code IS 'Код кафедры';
COMMENT ON COLUMN specialties.id IS 'ID специальности';
COMMENT ON COLUMN specialties.name IS 'Название специальности';
COMMENT ON COLUMN specialties.specialty_code IS 'Код специальности';
COMMENT ON COLUMN teacher_lesson_types.user_id IS 'ID преподавателя';
COMMENT ON COLUMN teacher_lesson_types.subject_id IS 'ID предмета';
COMMENT ON COLUMN teacher_lesson_types.lesson_type_id IS 'ID типа занятия';