@ssrdop

Как правильно поступить с EAV архитектурой, где для каждого типа значения своя таблица?

Я решил использовать для интернет магазина, а точнее для хранения характеристик товаров EAV архитектуру.
Самые простой способ хранить все значения в строковых форматах. Но это долго и не совсем правильно. В интернете вычитал, что для каждого типа значения нужно создавать свою таблицу, например, stringAttrValue, intAttrValue, textAreaAttrValue.
Соответственно, у нас должна быть таблица типа - id, attr_id, attr_type. Самая проблема именно в поле attr_type, а точнее в каком виде хранить тип значения - либо, как я прочитал, int, textarea, string, либо создать еще таблицу со списком типов значений и уже брать id типа значения.
И после этого придется писать очень много join'ов, чтобы получить все значения из каждой таблицы типа значения характеристики?
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
dubr
@dubr
пыхарь
Вместо дополнительных таблиц под каждый тип можно создавать дополнительные столбцы.

entity_id       # INT, ссылка на объект, которому принадлежит свойство
attribute_id    # INT, ссылка на инфу о свойстве
value_int       # INT, значение целочисленное
value_varchar   # VARCHAR, короткий текст
value_text      # TEXT, длинный текст
value_whatever  # и так далее: DATETIME, ENUM, DECIMAL


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

Отдельная таблица на тип создается, например, в Magento (опять же надо проверить, но раньше было так, и вряд ли они радикально меняли схему). Можете посмотреть, какие запросы генерирует их ORM.

Ну и вообще поковыряйте разные e-commerce продукты, EAV в каком-то виде реализован у всех.

Если вас пугает именно написание джойнов - зря пугаетесь, один фиг завернете их в какой-то API, потому что писать такое руками - утомительно и ведет к ошибкам.

Если вас пугает производительность схемы - ну, в идеале надо тестировать на ваших данных с вашими сценариями. Если лень или пока нет ни данных, ни сценариев ;) погуглите бандл / модуль для своего фреймворка и пляшите от него.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы