Проверяет понимание иерархических связей в реляционных базах данных на примере хранения вложенных комментариев.
Наиболее распространённый способ хранения связи комментария с родительским комментарием — использование самоссылающегося внешнего ключа. В таблицу комментариев добавляется столбец parent_id, который ссылается на id той же таблицы. Для корневых комментариев (не имеющих родителя) значение parent_id устанавливается в NULL. Эта модель называется списком смежности (adjacency list).
CREATE TABLE comments (
id SERIAL PRIMARY KEY,
content TEXT NOT NULL,
parent_id INTEGER REFERENCES comments(id) ON DELETE CASCADE,
created_at TIMESTAMP DEFAULT NOW()
);Для получения всех комментариев, включая вложенные, используется рекурсивный запрос. Пример для PostgreSQL:
WITH RECURSIVE comment_tree AS (
SELECT id, content, parent_id, 1 AS level
FROM comments
WHERE parent_id IS NULL
UNION ALL
SELECT c.id, c.content, c.parent_id, ct.level + 1
FROM comments c
JOIN comment_tree ct ON c.parent_id = ct.id
)
SELECT * FROM comment_tree ORDER BY level, id;Модель списка смежности с parent_id — самый простой и интуитивно понятный способ для хранения иерархии комментариев. Она подходит для большинства приложений, особенно если глубина вложенности невелика. Для глубоких иерархий или частых запросов поддеревьев стоит рассмотреть таблицу замыканий.