-- =====================================================
-- Teacher Diary Database Schema
-- =====================================================
-- Таблица преподавателей
CREATE TABLE teachers (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
patronymic VARCHAR(100),
phone VARCHAR(20),
enabled BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
-- Таблица предметов (принадлежит преподавателю)
CREATE TABLE subjects (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
teacher_id BIGINT NOT NULL REFERENCES teachers(id) ON DELETE CASCADE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
UNIQUE(name, teacher_id)
);
-- Таблица групп
CREATE TABLE study_groups (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
grade_scale VARCHAR(20) NOT NULL DEFAULT 'FIVE_POINT',
teacher_id BIGINT NOT NULL REFERENCES teachers(id) ON DELETE CASCADE,
subject_id BIGINT NOT NULL REFERENCES subjects(id) ON DELETE RESTRICT,
active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
-- Таблица учеников
CREATE TABLE students (
id BIGSERIAL PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
patronymic VARCHAR(100),
phone VARCHAR(20),
birth_date DATE,
notes TEXT,
teacher_id BIGINT NOT NULL REFERENCES teachers(id) ON DELETE CASCADE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
-- Связь ученик-группа (many-to-many)
CREATE TABLE student_groups (
student_id BIGINT NOT NULL REFERENCES students(id) ON DELETE CASCADE,
group_id BIGINT NOT NULL REFERENCES study_groups(id) ON DELETE CASCADE,
joined_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
active BOOLEAN DEFAULT TRUE,
PRIMARY KEY (student_id, group_id)
);
-- Таблица родителей
CREATE TABLE parents (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255),
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
patronymic VARCHAR(100),
phone VARCHAR(20) NOT NULL,
enabled BOOLEAN DEFAULT FALSE,
teacher_id BIGINT NOT NULL REFERENCES teachers(id) ON DELETE CASCADE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
UNIQUE(email, teacher_id)
);
-- Связь родитель-ученик с типом родства
CREATE TABLE student_parents (
id BIGSERIAL PRIMARY KEY,
student_id BIGINT NOT NULL REFERENCES students(id) ON DELETE CASCADE,
parent_id BIGINT NOT NULL REFERENCES parents(id) ON DELETE CASCADE,
parent_type VARCHAR(20) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE(student_id, parent_type)
);
-- Расписание (слот времени для группы)
CREATE TABLE schedules (
id BIGSERIAL PRIMARY KEY,
group_id BIGINT NOT NULL REFERENCES study_groups(id) ON DELETE CASCADE,
day_of_week SMALLINT NOT NULL CHECK (day_of_week BETWEEN 1 AND 7),
start_time TIME NOT NULL,
end_time TIME NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
-- Уроки (проведённые занятия)
CREATE TABLE lessons (
id BIGSERIAL PRIMARY KEY,
schedule_id BIGINT REFERENCES schedules(id) ON DELETE SET NULL,
group_id BIGINT NOT NULL REFERENCES study_groups(id) ON DELETE CASCADE,
lesson_date DATE NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
topic VARCHAR(500),
homework TEXT,
notes TEXT,
status VARCHAR(20) NOT NULL DEFAULT 'SCHEDULED',
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP
);
-- Оценки и посещаемость
CREATE TABLE grades (
id BIGSERIAL PRIMARY KEY,
lesson_id BIGINT NOT NULL REFERENCES lessons(id) ON DELETE CASCADE,
student_id BIGINT NOT NULL REFERENCES students(id) ON DELETE CASCADE,
grade_value VARCHAR(20),
grade_text VARCHAR(50),
attended BOOLEAN DEFAULT TRUE,
comment TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP,
UNIQUE(lesson_id, student_id)
);
-- Токены для сброса пароля
CREATE TABLE password_reset_tokens (
id BIGSERIAL PRIMARY KEY,
token VARCHAR(255) NOT NULL UNIQUE,
user_email VARCHAR(255) NOT NULL,
user_type VARCHAR(20) NOT NULL,
expires_at TIMESTAMP NOT NULL,
used BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Токены приглашения родителей
CREATE TABLE parent_invite_tokens (
id BIGSERIAL PRIMARY KEY,
token VARCHAR(255) NOT NULL UNIQUE,
parent_id BIGINT NOT NULL REFERENCES parents(id) ON DELETE CASCADE,
expires_at TIMESTAMP,
used BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- Индексы для оптимизации
CREATE INDEX idx_students_teacher ON students(teacher_id);
CREATE INDEX idx_parents_teacher ON parents(teacher_id);
CREATE INDEX idx_groups_teacher ON study_groups(teacher_id);
CREATE INDEX idx_lessons_date ON lessons(lesson_date);
CREATE INDEX idx_lessons_group ON lessons(group_id);
CREATE INDEX idx_grades_student ON grades(student_id);
CREATE INDEX idx_grades_lesson ON grades(lesson_id);