Я что-то очень сомневаюсь, что подобные серьезные компании будут использовать MySQL. А не серьезные и не заметят нагрузки на сервер базы данных при пересчетах.
что ж, у всех, такая не любовь к MySQL. В приведенных примерах, где 1 апдейт в секунду будет, поскольку слабо верится, что добавлением товаров занимаются тысячи людей, можно поставить десятки репликаций и все будет летать.
По-идее можно всё сильно кешировать. Естественно, будут проблемы с часто обновляющимися данными (вроде количества оставшихся билетов). Может, в таких случаях можно предупреждать: «Данные могут быть немного устаревшими».
А может один раз выбрать все необходимые метрики. Как пользователь выберет что-то тогда уже загрузить отдельно эту сущность из базы и показать актуальные данные.
а вариантов других нет — или грузить всё и фильтровать на клиенте (допустимо только тогда, когда данных реально мало. как оптимизация для узких диапазонов — вполне) или делать аяксовые запросы.
(а) почему бы и не гонять? его стоимость на правильной базе невелика.
(б) если оказывается, что стоимость велика, можно кэшировать сабсет данных по поиску целиком, и в памяти делать выборки по нему.
Клиентская часть фильтра реализуется элементарно на JS созданием пяти классов (единичный выбор, множественный выбор, выбор диапазона + вспомогательные 2 класса). Затем для каждого критерия фильтра создается объект соответствующего класса, на события изменения объекта навешиваются обновления интерфейса (Observer)
Как было сказано в статье, если выборка долго выполняется, то ставим задержку (пол секунды достаточно). По истечении задержки, если больше изменений фильтра небыло, отправляем запрос на сервер. Обработкой фильтра и поиском подходящих результатов у нас занимается Sphinx. Он выдает id элементов, попавших под выборку. По этим id получаются записи из БД или кеша (в зависимости от наличия во втором).
Ну и финальный этап — генерация представления и вставка вместо уже существующего блока с результатами :)
Если пользователь во время фильтрации изменил значение фильтра, race condition не возникает? И как с этим бороться кроме блокирования фильтров или синхронного аякс запроса?
прерываем текущий активный запрос и иннициируем новый, благо XmlHttpRequest позволяет. Этому конечно же предверяем отложенную загрузку с учетом что пользователь мог изменить фильтр случайно и решил исправиться.
Каждый вариант имеет свои недостатки и достоинства, и универсального нету.
Месяц назад на хабре был обзор англоязычных статей про интерфейсы, очень понравилось первое решение. Вполне может посоревноваться с примером с Нокиа.
Интересная реализация получилась на Подбор подарка
Те же фильтры, они же представлены в виде теста, в любой момент предлагается выбрать значение одного фильтра, однако одним кликом можно перейти на любой другой фильтр.
Очень актуально, когда вариантов выбора всех значений для всех фильтров очень много.
В этой задачей это кажется лучшим вариантом, но, разумеется, не универсальным.
Хотя если бы и был какой-то универсальный, лучший механизм, внедренный повсеместно — привыкшие к такому интерфейсу пользователи не замечали бы его возможных недостатков.
Построение интерфейса: описание паттерна «Активные фильтры» (Active Filtering)