Вопрос проверяет понимание проектирования полиморфных связей в реляционных базах данных и методов обеспечения ссылочной целостности.
Полиморфная связь возникает, когда одна таблица (например, comments) может ссылаться на несколько других таблиц (например, posts и videos) через два поля: target_id (идентификатор записи) и target_type (тип таблицы). Это удобно для разработки, но создаёт проблемы с целостностью данных, так как стандартные внешние ключи не могут ссылаться на несколько таблиц одновременно.
1. Использование триггеров — самый распространённый подход. Триггер проверяет, существует ли запись с указанным ID в таблице, соответствующей target_type.
CREATE TRIGGER check_comment_target
BEFORE INSERT ON comments
FOR EACH ROW
BEGIN
IF NEW.target_type = 'post' THEN
IF NOT EXISTS (SELECT 1 FROM posts WHERE id = NEW.target_id) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Post not found';
END IF;
ELSEIF NEW.target_type = 'video' THEN
IF NOT EXISTS (SELECT 1 FROM videos WHERE id = NEW.target_id) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Video not found';
END IF;
END IF;
END;2. Промежуточные таблицы — создание отдельных таблиц для каждого типа связи (например, post_comments, video_comments). Это полностью решает проблему целостности, но усложняет запросы.
3. Использование наследования таблиц — в PostgreSQL можно создать общую таблицу-родитель и наследовать от неё конкретные типы. Тогда внешний ключ может ссылаться на родительскую таблицу.
Полиморфные связи удобны для быстрой разработки, но создают риски для целостности данных. Лучший способ — избегать их в реляционных базах данных, используя отдельные связующие таблицы. Если полиморфизм необходим, обязательно применяйте триггеры или ограничения на уровне приложения для проверки ссылочной целостности.
Уровень
Рейтинг:
4
Сложность:
6
Навыки
Postgres
SQL
Ключевые слова
Подпишись на Python Developer в телеграм