Схема БД для товаров с вариантами: одна или две таблицы

    При проектировании базы данных для интернет-магазина или каталога часто возникает дилемма: хранить все товары в одной таблице или разделить на основную таблицу продуктов и таблицу вариантов. Рассмотрим оба подхода на примере слонов (продуктов), у которых есть варианты: розовые и синие слоны. Также есть простые слоны без вариантов.

    Вариант 1: одна таблица с parent_id

    В этом подходе все продукты и их варианты хранятся в одной таблице products. Добавляются поля parent_id (ссылка на родительский продукт) и is_parent (флаг, является ли запись родительской).

    • Плюсы: простота запросов - все данные в одной таблице; легко добавить новый вариант; не нужно делать JOIN для получения всех характеристик.
    • Минусы: избыточность данных - общие поля (например, описание категории) дублируются для каждого варианта; сложнее поддерживать уникальность; при большом количестве вариантов таблица быстро растёт.

    Пример структуры

    CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(255), description TEXT, category_id INT, brand_id INT, parent_id INT NULL, is_parent BOOLEAN, FOREIGN KEY (parent_id) REFERENCES products(id) );

    Вариант 2: две таблицы - products и product_variants

    Основные продукты хранятся в products, а варианты - в отдельной таблице product_variants с внешним ключом на родителя.

    • Плюсы: нормализация данных - общие характеристики хранятся один раз; гибкость - можно добавлять специфические поля для вариантов; лучшая производительность при выборке только основных продуктов.
    • Минусы: сложность запросов - требуется JOIN для получения полной информации о варианте; необходимо продумать наследование атрибутов.

    Пример структуры

    CREATE TABLE products ( id INT PRIMARY KEY, name VARCHAR(255), description TEXT, category_id INT, brand_id INT ); CREATE TABLE product_variants ( id INT PRIMARY KEY, parent_id INT NOT NULL, name VARCHAR(255), description TEXT, FOREIGN KEY (parent_id) REFERENCES products(id) );

    Какой вариант выбрать?

    Выбор зависит от специфики вашего проекта. Если вариантов мало (до 5-10 на товар) и они отличаются только цветом или размером, подойдёт первая схема. Если вариантов много, у них разные характеристики (например, вес, материал) или вы планируете масштабирование - используйте две таблицы. Также учтите, что при наличии таблицы product_attribute_values для общих характеристик, вариант с двумя таблицами упрощает наследование: атрибуты родителя применяются к варианту, если не переопределены.

    Лучшие практики

    • Используйте одну таблицу для простых каталогов с малым числом вариантов.
    • Используйте две таблицы для сложных товаров (одежда, электроника) с множеством модификаций.
    • Для наследования атрибутов создайте триггер или логику на уровне приложения.
    • Индексируйте поля parent_id и is_parent для ускорения запросов.

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