Как обойти множество JOIN в EAV ?

Задача разработать фильтр поиска товаров по типу яндекс.маркет.
Как пример, это фильтр поиска по кондиционерам: market.yandex.ua/guru.xml?CMD=-RR%3D5%2C0%2C0%2C0-...

в предыдущем своем вопросе я узнал про EAV структуру, почитал понял все минусы и плюсы. Еще я видел множество рекомендаций в сторону mongodb и sphinx. Я хочу попробовать скомбинировать это дело таким образом, чтобы избавиться от множество джоинов и связывающих таблиц в mysql.

Если следовать EAV, у нас есть следующие таблицы: Товары, Категории, Атребуты, Значение Атрибутов, Свзязь Товар Категория, Связь Товар Атрибуты, Связь Атрибут Значение.

В результате чего, если к примеру мы находимся в разделе Кондиционеры и нужно показать все кондиционеры цена которых от 1000 до 5000, производителя Самсунг и с Сенсором Движения.

Тоесть запрос будет примерно такой:
SELECT * FROM Товары
JOIN Категории WHERE Кондиционеры
JOIN  Связь Товар Атрибуты
JOIN Связь Атрибут Значение WHERE цена AND самсунг AND Сенсором Движения


Возможно джоинов будет даже больше. Все бы ничего, но на большой базе это будет печально. А товары будут заполняться быстро их будет много.

Я бы хотел убрать таблицы связей и оставить только следующие:
- Товары
- Категории
- Атрибуты
- Значения

Теперь собственно вопрос в котором я запутался, как можно использовать mongodb и sphinx для поиска товаров ?

Из прочтенных мной статей я понял, что в mongodb нужно хранить связи и выборку делать конкретно через mongodb.
Но вот какие именно связи там нужно хранить и как их записывать я не понял.

Также я не как не могу понять для чего нужен sphinx. Тоесть везде описывают что это крутой поисковой движок, у меня всегда складывалось впечатление, что это крутой аналог LIKE. Собственно подходит ли он для заметы JOIN ?
  • Вопрос задан
  • 3245 просмотров
Пригласить эксперта
Ответы на вопрос 3
@alexandre108
Хорошее описание варианта с Mongodb
habrahabr.ru/post/259219/#73
Ответ написан
Комментировать
nazarpc
@nazarpc
Open Source enthusiast
У вас реляционные данные, использовать для этого нужно реляционную БД (которой являются MySQL, PostgreSQL и многие другие), но никак не MongoDB.
Если вас не смущает 3-5 JOIN (не должны) - то используйте. У меня в одном проекте было около 8-10 JOIN, при правильном составлении запросов и кэшировании скорость в несколько милисекунд (около 10 в среднем, в зависимости от запроса) считаю приемлемой.
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
1. Монга как раз решает проблему таблицы связей. Собственно, потому ее тебе и рекомендуют, что она решает ту самую задачу, что ты сейчас описал - избавляет от связей. В ней можно тупо писать "цвет: красный, обогрев: есть, минимальная температура охлаждения: 16" - вот примерно так запрос и выглядит, в виде JSON. Но тут могут быть проблемы с индексами (индексируемых полей тысячи, столько индексов не напасешься), а перебором много не наищешь.

2. И тут приходит на помощь свинкс.
Самый тупой вариант - генерировать т е к с т. Сфинкс же полнотекстовый поиск? Ну вот и нагенерировать текст, такой же, как я выше написал, в котором перечислены все параметры. Ищет замечательно. Для более продвинутых вариантов гуглить sphinx faceted search
Ответ написан
Ваш ответ на вопрос

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

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