Как получить динамические атрибуты, сохраняя при этом четкие и эффективные запросы - PullRequest
3 голосов
/ 13 февраля 2012

Я пытаюсь придумать дизайн базы данных / модели для продукта и связанных с ним динамических атрибутов продукта. Однако в части моделирования я боюсь, что делаю что-то «не так», так как в итоге я использую МНОГО СУСТАВОВ. По сути, я надеюсь получить некоторую информацию о том, как добиться желаемой функциональности, возможно, с более простым дизайном. Если кто-то со стажем почувствует, что я упустил что-то важное, тогда, пожалуйста, просветите меня:)

Примеры динамических атрибутов товара:

  • Размер
  • Цвет
  • Производитель
  • Вес

Атрибут « 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, которые должны быть относительно простыми. Я мог бы разделить это на более мелкие запросы, но я не уверен, что будет наиболее эффективным - при этом сопоставляя и сохраняя «динамические» свойства атрибутов.

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Я бы предложил NoSQL решение, такое как MongoDB .Это значительно упростит разработку вашего приложения, поскольку вы можете представлять свои продукты простыми парами имя-значение (как в JSON).

Если вы придерживаетесь SQL, я думаю, вы обнаружите, что ваше приложение и база данных становятсянеуправляемый.

0 голосов
/ 13 февраля 2012

Хотя NoSQL DB, такой как MongoDB, определенно лучше подходит, если вы должны использовать SQL, я рекомендую вам пройтись по шаблону EAV и изучить структуру базы данных Magento Commerce.

http://www.magentocommerce.com/wiki/2_-_magento_concepts_and_architecture/magento_database_diagram#the_magento_eav_data_model

Это дало бы реальное представление о том, как это было успешно реализовано в производственных системах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...