Ответы пользователя по тегу EAV
  • Как использовать свою модель хранения данных в Doctrine?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ну по сути doctrine предоставляет вам только хранилище данных, логика должна реализовываться в сервисном слое. Но вообще, в контексте EAV все довольно просто. У ваших сущьностей должны быть методы аля "addAttribute" и т.д., которые работают со связями. И все.

    Валидация данных - это уже другой компонент и другая сфера ответственности, и тут так же не проблема реализовать.
    Ответ написан
    4 комментария
  • Yii, EAV, производительность?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    вы используете вот эту штуку? Просто выкиньте и перепишите с inner/left join-нами для выборок.
    Ответ написан
    5 комментариев
  • Альтернатива EAV, структура базы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Обычно для интернет-магазинов EAV структура приблизительно следующая:
    Категория (* — *) Опция ( 1 — *) Значение ( * — 1 ) Продукт
    Поиск товаров допустим реализуется через INNER JOIN и создает довольно большие накладные расходы. Это единственный, и довольно существенный минус этого подхода. Решается он использованием вьюх в базе данных, или же NoSQL решений. Так же есть варианты использовать фасеточный поиск, например через Sphinx. Но гибкость разработки как по мне довольно большой плюс.

    В вашем случае, если реализовать ваш вариант с таблицей дескриптеров, получается такая структура:
    Товар (* — *) Значение ( 1 — * ) Дескриптер.
    Причем, если значения дескриптеров вам известны, то логично вынести это скажем в ENUM или еще как. По сути это не есть паттрен EAV, это просто одна из тех самых альтернатив.

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