Как менять контент блока в зависимости от типа записи
При проектировании базы данных для системы управления контентом (CMS) часто возникает задача хранить блоки разного типа - например, текстовые описания и видео. Каждый блок должен содержать данные, соответствующие своему типу. Рассмотрим, как построить гибкую структуру таблиц и обеспечить целостность данных с помощью триггеров.
Структура таблиц для разделов и блоков
Допустим, у нас есть разделы (sections), внутри которых находятся блоки (blocks). Каждый блок имеет тип: 'description' или 'video'. В зависимости от типа, содержимое блока хранится в разных таблицах. Пример схемы:
- sections - таблица разделов (id, title, ...).
- blocks - таблица блоков (id, section_id, type, sort_order).
- block_descriptions - таблица для текстовых блоков (id, block_id, content TEXT).
- block_videos - таблица для видео-блоков (id, block_id, url, duration).
Проблема: как гарантировать правильный тип блока
При вставке данных в block_descriptions или block_videos нужно убедиться, что соответствующий блок в таблице blocks имеет правильный тип. Иначе данные окажутся в неверной таблице, что приведёт к ошибкам при выводе.
Решение: триггер на вставку
Создайте триггер, который перед вставкой проверяет тип блока. Например, для таблицы block_videos:
CREATE TRIGGER check_block_type_video
BEFORE INSERT ON block_videos
FOR EACH ROW
BEGIN
DECLARE block_type VARCHAR(20);
SELECT type INTO block_type FROM blocks WHERE id = NEW.block_id;
IF block_type != 'video' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Block type must be "video"';
END IF;
END;Аналогичный триггер создайте для block_descriptions с проверкой на 'description'.
Альтернативный подход: единая таблица с JSON-полем
Вместо нескольких таблиц можно хранить все блоки в одной таблице, а содержимое - в JSON-столбце. Тогда тип блока определяет структуру JSON. Это упрощает схему, но требует проверки на уровне приложения или триггера.
Вывод
Использование триггеров на вставку - надёжный способ сохранить целостность данных при работе с полиморфными блоками. Это предотвращает случайное сохранение видео в таблицу описаний и наоборот.