Я пытаюсь придумать дизайн базы данных / модели для продукта и связанных с ним динамических атрибутов продукта. Однако в части моделирования я боюсь, что делаю что-то «не так», так как в итоге я использую МНОГО СУСТАВОВ. По сути, я надеюсь получить некоторую информацию о том, как добиться желаемой функциональности, возможно, с более простым дизайном.
Если кто-то со стажем почувствует, что я упустил что-то важное, тогда, пожалуйста, просветите меня:)
Примеры динамических атрибутов товара:
- Размер
- Цвет
- Производитель
- Вес
Атрибут « dynamic » охватывает два аспекта, один из которых имеет одно значение, например вес, равный некоторому значению, или другой пример цвета, который содержит множество различных значений.
В дополнение к значениям атрибутов каждый атрибут также имеет уникальные языковые настройки. Например. ключ / значение атрибута может меняться в зависимости от языка клиента.
Структура моих табелей:
Product
- id
- created
- modified
Product_variants
- id
- product_id
- quantity
- price
Attribute
- id
- visible
- required
- comparable
Attribute_group
- id
- type
Attribute_groups_attributes
- attribute_group_id
- attribute_id
Attribute_group_languages
- id
- attribute_group_id
- name
- locale
Attribute_languages
- id
- attribute_id
- name
- value
- locale
Product_attribute
- product_id
- attribute_id
- group
- variant
Пример запроса
Чтобы получить новейшие продукты и соответствующие атрибуты, я выполняю неприятный запрос ниже:
SELECT pv.price, pv.special_price, pv.overlay_id, p.id, pv.id variant, pl.url_key, pl.name, UNIX_TIMESTAMP(p.created) created, al.value color_value, a.id color_id,al.name color_name
FROM x_product_attribute pa
INNER JOIN x_attribute_group ag
ON pa.attribute_id = ag.id AND pa.group = 1 AND pa.variant = 0 AND ag.type LIKE 'color%'
INNER JOIN x_attribute_group_languages agl
ON agl.attribute_group_id = ag.id AND agl.locale = :locale
INNER JOIN x_attribute_groups_attributes aga
ON aga.attribute_group_id = pa.attribute_id
INNER JOIN x_product_attribute pa2
ON aga.attribute_id = pa2.attribute_id AND pa2.variant = 1 AND pa2.group = 0
INNER JOIN product_variants pv
ON pa2.product_id = pv.id
INNER JOIN x_attribute_languages al
ON al.attribute_id = pa2.attribute_id AND al.locale = :locale
INNER JOIN x_attribute a
ON a.id = pa2.attribute_id
INNER JOIN products p
ON p.id = pa.product_id
INNER JOIN product_languages pl
ON pl.product_id = p.id
INNER JOIN shop_products sp
ON sp.shop_id = :shop_id AND sp.product_id = pa.product_id
GROUP BY p.id,a.id
ORDER BY p.created DESC,a.sort ASC, p.id DESC
Как уже упоминалось, в запросе много JOINS, которые должны быть относительно простыми. Я мог бы разделить это на более мелкие запросы, но я не уверен, что будет наиболее эффективным - при этом сопоставляя и сохраняя «динамические» свойства атрибутов.