Комментарии 28
Прошу раскрыть вопрос реализации данной технологии на уровне баз данных. Не гонять же на каждый пользовательский чих select count(*)
А может пользоваться SQL_CALC_FOUND_ROWS?
а может всё таки не пользоваться? www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
Я что-то очень сомневаюсь, что подобные серьезные компании будут использовать MySQL. А не серьезные и не заметят нагрузки на сервер базы данных при пересчетах.
что ж, у всех, такая не любовь к MySQL. В приведенных примерах, где 1 апдейт в секунду будет, поскольку слабо верится, что добавлением товаров занимаются тысячи людей, можно поставить десятки репликаций и все будет летать.
гугл ведь пользуется
А Facebook использует…
По-идее можно всё сильно кешировать. Естественно, будут проблемы с часто обновляющимися данными (вроде количества оставшихся билетов). Может, в таких случаях можно предупреждать: «Данные могут быть немного устаревшими».
А может один раз выбрать все необходимые метрики. Как пользователь выберет что-то тогда уже загрузить отдельно эту сущность из базы и показать актуальные данные.
Можно и сфинкс заюзать, если абсолютная точность данных не критична.
а вариантов других нет — или грузить всё и фильтровать на клиенте (допустимо только тогда, когда данных реально мало. как оптимизация для узких диапазонов — вполне) или делать аяксовые запросы.
да и COUNT(*) совсем не страшный, правда.
да и COUNT(*) совсем не страшный, правда.
(а) почему бы и не гонять? его стоимость на правильной базе невелика.
(б) если оказывается, что стоимость велика, можно кэшировать сабсет данных по поиску целиком, и в памяти делать выборки по нему.
(б) если оказывается, что стоимость велика, можно кэшировать сабсет данных по поиску целиком, и в памяти делать выборки по нему.
Объясните, почему эта статья — перевод, и почему ссылка на оригинал ведет не на статью?
Вещь действительно очень полезная и удобная… Где бы почитать про реализацию данной системы? Может кто-нить поделится ссылкой/опытом?
Да что там читать-то?
На примере kinobaza.tv/filter
Клиентская часть фильтра реализуется элементарно на JS созданием пяти классов (единичный выбор, множественный выбор, выбор диапазона + вспомогательные 2 класса). Затем для каждого критерия фильтра создается объект соответствующего класса, на события изменения объекта навешиваются обновления интерфейса (Observer)
Как было сказано в статье, если выборка долго выполняется, то ставим задержку (пол секунды достаточно). По истечении задержки, если больше изменений фильтра небыло, отправляем запрос на сервер. Обработкой фильтра и поиском подходящих результатов у нас занимается Sphinx. Он выдает id элементов, попавших под выборку. По этим id получаются записи из БД или кеша (в зависимости от наличия во втором).
Ну и финальный этап — генерация представления и вставка вместо уже существующего блока с результатами :)
На примере kinobaza.tv/filter
Клиентская часть фильтра реализуется элементарно на JS созданием пяти классов (единичный выбор, множественный выбор, выбор диапазона + вспомогательные 2 класса). Затем для каждого критерия фильтра создается объект соответствующего класса, на события изменения объекта навешиваются обновления интерфейса (Observer)
Как было сказано в статье, если выборка долго выполняется, то ставим задержку (пол секунды достаточно). По истечении задержки, если больше изменений фильтра небыло, отправляем запрос на сервер. Обработкой фильтра и поиском подходящих результатов у нас занимается Sphinx. Он выдает id элементов, попавших под выборку. По этим id получаются записи из БД или кеша (в зависимости от наличия во втором).
Ну и финальный этап — генерация представления и вставка вместо уже существующего блока с результатами :)
Если пользователь во время фильтрации изменил значение фильтра, race condition не возникает? И как с этим бороться кроме блокирования фильтров или синхронного аякс запроса?
Жаль только, что у МТС калькулятор на flash выполнен (для всего этого есть jQuery, притом из коробки), да еще и вылазит из верстки…
Каждый вариант имеет свои недостатки и достоинства, и универсального нету.
Месяц назад на хабре был обзор англоязычных статей про интерфейсы, очень понравилось первое решение. Вполне может посоревноваться с примером с Нокиа.
Интересная реализация получилась на Подбор подарка
Те же фильтры, они же представлены в виде теста, в любой момент предлагается выбрать значение одного фильтра, однако одним кликом можно перейти на любой другой фильтр.
Очень актуально, когда вариантов выбора всех значений для всех фильтров очень много.
В этой задачей это кажется лучшим вариантом, но, разумеется, не универсальным.
Хотя если бы и был какой-то универсальный, лучший механизм, внедренный повсеместно — привыкшие к такому интерфейсу пользователи не замечали бы его возможных недостатков.
Месяц назад на хабре был обзор англоязычных статей про интерфейсы, очень понравилось первое решение. Вполне может посоревноваться с примером с Нокиа.
Интересная реализация получилась на Подбор подарка
Те же фильтры, они же представлены в виде теста, в любой момент предлагается выбрать значение одного фильтра, однако одним кликом можно перейти на любой другой фильтр.
Очень актуально, когда вариантов выбора всех значений для всех фильтров очень много.
В этой задачей это кажется лучшим вариантом, но, разумеется, не универсальным.
Хотя если бы и был какой-то универсальный, лучший механизм, внедренный повсеместно — привыкшие к такому интерфейсу пользователи не замечали бы его возможных недостатков.
Как бы так сделать, чтобы при выборе другого региона, вся эта флэшина не заргужалась заново…
И у меня создалось впечатление, что Питер в явном игноре…
И у меня создалось впечатление, что Питер в явном игноре…
Безотносительно к паттерну и переводу. «Автор», каталог паттернов Quince — на три четверти тянут из книжки Тидвелл: designinginterfaces.com/
Красавцы.
Красавцы.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Построение интерфейса: описание паттерна «Активные фильтры» (Active Filtering)