Моделирование блога: пользователи, публикации, комментарии
Нарисуйте ER-диаграмму, определите сущности и связи и преобразуйте их в нормализованную схему SQL
«Моделирование блога: пользователи, публикации, комментарии» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Предметная область
Простой блог: пользователи пишут публикации, а другие пользователи комментируют их. Превратим это в схему.
Сущности
Три основные сущности:
- Пользователь — идентификатор, электронная почта, имя
- Публикация — идентификатор, автор, заголовок, текст, время публикации
- Комментарий — идентификатор, автор, публикация, к которой он относится, текст
Связи
Кардинальности:
- Пользователь 1 ── ∞ Публикация (пользователь пишет много публикаций)
- Пользователь 1 ── ∞ Комментарий
- Публикация 1 ── ∞ Комментарий
Таблица пользователей
Начните с пользователей — на них ссылаются другие таблицы:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
full_name VARCHAR(100) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);Таблица публикаций
Внешний ключ к таблице пользователей:
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
author_id BIGINT NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
title VARCHAR(200) NOT NULL,
body TEXT NOT NULL,
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);Таблица комментариев
Два внешних ключа:
CREATE TABLE comments (
id BIGSERIAL PRIMARY KEY,
post_id BIGINT NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
author_id BIGINT NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
body TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);Зачем ON DELETE CASCADE у комментариев?
Если публикацию удалить, её комментарии теряют смысл — пусть база данных автоматически удалит их.
Зачем ON DELETE RESTRICT у автора?
Не удаляйте содержимое молча, когда пользователь исчезает. Сначала заставьте приложение выполнить мягкое удаление пользователя или переназначить это содержимое.
Добавление тегов: многие ко многим
Добавьте теги с помощью таблицы связей:
CREATE TABLE tags (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE post_tags (
post_id BIGINT REFERENCES posts(id) ON DELETE CASCADE,
tag_id BIGINT REFERENCES tags(id) ON DELETE CASCADE,
PRIMARY KEY (post_id, tag_id)
);Вложенные комментарии
Самоссылочные комментарии для ответов:
ALTER TABLE comments
ADD COLUMN parent_id BIGINT REFERENCES comments(id) ON DELETE CASCADE;Мягкое и физическое удаление
Для блога мягкое удаление публикаций часто предпочтительнее — неработающие ссылки не исчезают из истории пользователя. Добавьте deleted_at TIMESTAMPTZ и фильтруйте по WHERE deleted_at IS NULL в каждом запросе.
Диаграмма ER словами
users (1) -< (∞) posts (1) -< (∞) comments
Также: users (1) -< (∞) comments, posts (∞) >-< (∞) tags.
Итоги
Проектирование схемы начинается с сущностей, связей и кардинальностей.
- Суррогатный PK в каждой таблице
- Внешние ключи объявляют связи
- CASCADE и RESTRICT должны соответствовать бизнес-логике
- Связь многие ко многим = таблица связей
Проверка знаний
Где находится внешний ключ при связи «один ко многим» между публикациями и комментариями?
Часто задаваемые вопросы
Урок «Моделирование блога: пользователи, публикации, комментарии» бесплатный?
Да — полный текст урока «Моделирование блога: пользователи, публикации, комментарии» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Моделирование блога: пользователи, публикации, комментарии»?
Нарисуйте ER-диаграмму, определите сущности и связи и преобразуйте их в нормализованную схему SQL Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Моделирование блога: пользователи, публикации, комментарии»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Моделирование блога: пользователи, публикации, комментарии
- Выбор ключей и типов
- Индексы для распространённых запросов
- Заполнение базы данных тестовыми данными