Как менять контент блока в зависимости от типа записи

    При проектировании базы данных для системы управления контентом (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. Это упрощает схему, но требует проверки на уровне приложения или триггера.

    Вывод

    Использование триггеров на вставку - надёжный способ сохранить целостность данных при работе с полиморфными блоками. Это предотвращает случайное сохранение видео в таблицу описаний и наоборот.

    Часто задаваемые вопросы