142 lines
5.1 KiB
SQL
142 lines
5.1 KiB
SQL
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'
|
|
);
|