-- 1. Таблица пользователей
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(150) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role VARCHAR(20) DEFAULT 'student' CHECK (role IN ('student', 'author', 'admin')),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 2. Таблица категорий (IT, Дизайн и т.д.)
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
slug VARCHAR(50) UNIQUE NOT NULL -- для красивых ссылок (например, /catalog/it)
);
-- 3. Таблица курсов
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
author_id INT REFERENCES users(id) ON DELETE CASCADE,
category_id INT REFERENCES categories(id) ON DELETE SET NULL,
title VARCHAR(150) NOT NULL,
description TEXT,
status VARCHAR(20) DEFAULT 'draft' CHECK (status IN ('draft', 'moderation', 'published')),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 4. Таблица слайдов (уроков внутри курса)
CREATE TABLE slides (
id SERIAL PRIMARY KEY,
course_id INT REFERENCES courses(id) ON DELETE CASCADE,
title VARCHAR(150) NOT NULL,
content TEXT,
media_url VARCHAR(255), -- ссылка на картинку или видео
slide_order INT NOT NULL -- порядковый номер слайда (1, 2, 3...)
);
-- 5. Таблица прогресса (кто какой курс проходит)
CREATE TABLE progress (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id) ON DELETE CASCADE,
course_id INT REFERENCES courses(id) ON DELETE CASCADE,
current_slide_id INT REFERENCES slides(id) ON DELETE SET NULL,
is_completed BOOLEAN DEFAULT FALSE,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, course_id) -- Пользователь может иметь только 1 запись прогресса на курс
);
-- 6. Таблица комментариев
CREATE TABLE comments (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id) ON DELETE CASCADE,
course_id INT REFERENCES courses(id) ON DELETE CASCADE,
text TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 7. Таблица рейтингов (звездочки)
CREATE TABLE ratings (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id) ON DELETE CASCADE,
course_id INT REFERENCES courses(id) ON DELETE CASCADE,
score INT CHECK (score >= 1 AND score <= 5),
UNIQUE(user_id, course_id) -- Один пользователь = одна оценка на курс
);
-- 8. Таблица избранного
CREATE TABLE favorites (
user_id INT REFERENCES users(id) ON DELETE CASCADE,
course_id INT REFERENCES courses(id) ON DELETE CASCADE,
PRIMARY KEY (user_id, course_id)
);