Здравствуйте, KRA, Вы писали:
KRA>Здравствуйте, Аноним, Вы писали:
А>>Есть задача реализовать удобный поиск в системе. Нашел очень удачное решение на сайте mobile.de:
А>>нажмите кнопку "показать" и см. закладку слева "Ограничить поиск"
KRA>Почему-то не работает ссылка, поэтому не совсем понятно.
А>>Суть примерно такова, что есть 1 млн записей в базе данных, быстрый поиск по данным записям возможен по примерно 15 категориям. В некоторых категориях может быть до 100 и более значений.
А>>Каждое значение категории имеет подсказку количества значений если будет выбрана данная категория.
KRA>Правильно ли я понимаю, что нужно по сути для 15 категорий находить количество товаров? Если так, то лучше их считать тригером при добавлении товара в категорию.
А>>Делать насчет по общей таблицы записей не представляется возможным во вразумительное время.
А>>Для разбора данной ситуации предлагаю упрощенный вариант с четырьмя измерениями (Бренд, Категория, Модель, Продавец), для решения данной задачи предлагается создать суммирующую таблицу, в которую будут помещаться конечные "предрассчитаные" значения поиска.
А>>А>>-- creating table
А>>CREATE TABLE PRT_SEARCH_HELPER (
А>> COUNT_ INTEGER,
А>> BRAND_ID NUMERIC(18,0),
А>> CATEGORY_ID NUMERIC(18,0),
А>> MODEL_ID NUMERIC(18,0),
А>> SELLER_ID NUMERIC(18,0)
А>>);
А>>
KRA>Правильно ли я понимаю, что по модели тоже нужен поиск аля "сколько штук такой-то модели у такого то продавца"?
KRA>Если нет, зачем тут поле MODEL_ID?
А>>А>>select h.category_id, sum(h.count_) from prt_search_helper h where
А>>h.brand_id=ххх
А>>and h.seller_id=ххх
А>>group by
А>>h.category_id
А>>
А>>для того, чтобы запрос работал быстро необходимо сдлеать составной индекс по brand_id и seller_id.
KRA>и category_id
А>>Чтобы грубо оценить объем данных в этой таблице необходимо перемножить количества возможных значения измерений, это покроет все комбинации данных значений допустим
А>>брендов у нас 100
А>>моделей 1000
А>>продавцов 100
А>>категорий 100
А>>получается, около 1 млрд записей, допустим я сделал избыточной данную информацию и часть записей будет с нулевым количеством записей, их можно выкинуть, пусть останется 5-10 млн записей, но это все равно многовато. При 5 млн записей приведный выше запрос отрабатывает за 300мс на машине класса Core 2 Duo 2.5 Ггц, а таких запросов надо делать столько сколько категорий. В итоге получается все равно медленно, ообенно на нагруженной системе.
KRA>Не ясно почему нужно будет делать по запросу на категорию. Запрос же сразу считает количество для всех категорий.
KRA>Не уверен, что правильно интерпретирую сущности,
KRA>1. разве может одна модель относяться больше чем к 2-3 категориям?
KRA>2. может одна модель соответсвовать аж 100 разных брендов?
KRA>Это я к тому, что, возможно, оценка в 1 млрд сильно завышена.
А>>Уважамые коллеги, конибудь решал подобного рода задачи, если решали то в каком направлении дальше можно оптимизировать данную стуктуру поисковой таблицыее наполнения, построения запросов?
KRA>Я решал подобную задачу путём денормализации данных. Грубо говоря, заранее готовил данные в удобном для запросов виде (так чтоб при запросе использовалась только фильтрация и не использовались групировки). Давненько это было, но по памяти на рабочей системе данных было миллионов 10. На подобного класса машине запросы работалы довольно шустро, порядка 0.1 сек вместе с рендерингом веб страницы.
Я не совсем четко описал всю проблему, поэтому постараюсь подробнее описать:
Поиск заключается в более хитром механизме и многоступенчатом изменении значений для одного и того же параметра при различных условиях поиска.
Конкретно про приведенный сайт, если не ограничивать поиск то он выдаст примерно такие реузльтаты
Марка
* VW (187951)
* Mercedes-Benz (122658)
* BMW (105710)
* Opel (98532)
* Audi (97912)
* Расширить выборку
Тип топлива
* Бензиновый (613303)
* Дизельный (482332)
* Сжиженный нефтяной газ (9039)
* Расширить выборку
Категория
* Лимузин (417215)
* Универсал (250705)
* Минивэн/микроавтобус (120663)
* Расширить выборку
Подкатегория
* Демонстрационное транспортное средство (53773)
* Служебный автомобиль (36418)
* Предварительная регистрация (8268)
* Расширить выборку
Мощность
* 74 кВт — 86 кВт (166183)
* 85 кВт — 97 кВт (95409)
* 96 кВт — 111 кВт (186828)
* 110 кВт — 148 кВт (164748)
* 147 кВт — 185 кВт (77247)
* Расширить выборку
....
это первый шаг. Вот если выбрать хоть что то из этого, то все остальные пересчитаются с учетом этого!
то есть если выбрать лимузин, то значение остальных будут совсем другими.
понаблюдать все это можно на сайте
www.mobile.de если попробовать поискать автомобиль.