Проблемы с разбивкой на страницы и сортировкой

Я изучаю ситуации в веб-приложениях, ориентированных на базы данных, когда следует полагаться на сортировку таблиц на стороне клиента, а не на сортировку на стороне сервера. Одна конкретная ситуация, которая меня беспокоит, - это разбиение на страницы.

При попытке разбить на страницы большую таблицу (скажем, 10000 строк), а также отсортировать ее по определенному столбцу, какой подход будет лучше всего?

Я понимаю, что с этим связаны следующие проблемы:

  • Я не могу вернуть всю таблицу на клиентскую сторону за один раз
  • Я не могу отсортировать до 10000 записей с помощью javascript
  • Сортировка таблицы будет включать сортировку строк на всех страницах, а не только на текущей странице.

Итак, есть ли у вас еще проблемы, которые можно добавить в этот список?

Какой подход приведет к хорошему сочетанию взаимодействия на стороне клиента и на стороне сервера, чтобы минимизировать нагрузку на сервер?


ДОБАВЛЕНИЕ:

Хорошо, сортировка по базе данных и возврат запрашиваемой страницы, предыдущей страницы и следующей страницы кажутся лучшим выбором.

Теперь рассмотрим это:

Пользователь находится на странице (3 из 10) таблицы, отсортированной по порядковому номеру. Теперь пользователь щелкает заголовок с именем «имя пользователя», желая отсортировать таблицу по имени пользователя.

Вопрос: должен ли конечный результат быть «страница (1 из 10) отсортирована по имени пользователя» или это должна быть «страница (3 из 10), отсортированная по имени пользователя»?

Я знаю, что это очень субъективный вопрос, но что вы порекомендуете и почему?


person jrharshath    schedule 23.06.2009    source источник
comment
хороший вопрос. Вы, наверное, могли бы сказать, что я недавно столкнулся с этой [проблемой.   -  person Jeff Meatball Yang    schedule 23.06.2009


Ответы (4)


На стороне клиента лучше всего сохранять простоту: сортировка / разбивка по страницам Javascript предназначена только для очень маленьких наборов результатов - достаточно малых, чтобы пользователь не заметил снижения производительности.

На стороне сервера вы можете оптимизировать нагрузку на сервер:

Загрузка может происходить в виде частых запросов на добавление дополнительных страниц, большого количества строк / столбцов на странице и частых запросов на пересмотр. (Мы даже не говорили о фильтрации)

Поэтому в зависимости от ваших пользователей и фактического использования вам может потребоваться какая-то форма кеширования. Обратите внимание: это предложения на время ПОСЛЕ того, как вы узнаете, что делают ваши пользователи:

  • Для частых запросов страниц подумайте о том, чтобы некоторые запросы Ajax предварительно загружали следующие несколько (и предыдущие) страницы, а затем меняли строки (через Javascript) на таблицу по запросу пользователя.

  • Для страниц большого размера рассмотрите возможность хранения строк в кэше «последнего использованного» приложения (памяти), чтобы базе данных не требовалось снова и снова выплевывать одни и те же огромные фрагменты данных.

  • Для частого обращения хороший подход - хранить кеш-таблицу в SQL только с результатами.

И всегда, всегда, всегда правильно индексируйте базу данных.


Дополнительный ответ:

Мой очень субъективный ответ таков: пользователь (я) хочет отсортировать данные с произвольной страницы. Пусть им (мне). Нет ничего более раздражающего, чем оказаться там, где вы хотите быть, и наличие приложения вернет вас в начало списка.

Еще одно соображение - несколько уровней сортировки: хотите ли вы реализовать сортировку по серийному номеру, а затем по имени пользователя? Подумайте, что делает Microsoft Excel или любое другое приложение, с которым ваши пользователи знакомы. Ваши пользователи, вероятно, будут довольны тем, к чему они привыкли, в том числе возвращением на страницу 1.

person Jeff Meatball Yang    schedule 23.06.2009

Базы данных - настоящие звери при сортировке и отборе данных. Поэтому лучше всего, чтобы клиент сказал серверу: «Мне нужна страница X с Y строками, отсортированными по Z». Затем база данных делает свое дело, и клиент показывает результат. Чтобы повысить производительность, вы можете сделать свой клиент кеширующим результаты, и, кроме того, вы можете сделать так, чтобы ваш код запрашивал следующую и предыдущую страницы после того, как текущая была извлечена, чтобы их можно было мгновенно отображать по запросу.

person Blixt    schedule 23.06.2009

Лучшим подходом было бы выполнить сортировку и разбиение на страницы на уровне базы данных и вернуть только подмножество исходных данных, которые будут отображаться только на экране. В этом сценарии нет javascript.

Если по каким-либо причинам вы не можете сортировать и подстраивать страницы на уровне базы данных, вам следует сделать это с помощью скрипта на стороне сервера. В этом сценарии тоже нет javascript.

И наихудшим подходом было бы выполнять сортировку и разбиение на страницы с помощью javascript, что, конечно, не рекомендуется вообще по понятным причинам.

person Darin Dimitrov    schedule 23.06.2009

Попросите базу данных отсортировать то, что попадает на конкретную страницу на экране. Это почти всегда будет быстрее, кэшироваться и облегчить такую ​​нагрузку на браузер.

Если хотите, разрешите на стороне клиента разрешить дальнейшую подсортировку с помощью javascript и т. д., если данные достаточно подробны и могут извлечь из этого пользу. Вы можете сохранить, какие функции подсортировки выбраны, чтобы они запоминаются между страницами.

person Jas Panesar    schedule 23.06.2009