Проблемы с разбиением на страницы и сортировкой - PullRequest
7 голосов
/ 23 июня 2009

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

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

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

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

Так у вас есть еще вопросы, чтобы добавить в этот список?

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


Сложение:

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 23 июня 2009

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

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

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

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

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

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

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

И всегда, всегда, всегда соответствующим образом индексируйте базу данных.


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

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

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

3 голосов
/ 23 июня 2009

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

0 голосов
/ 23 июня 2009

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

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

0 голосов
/ 23 июня 2009

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

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

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

...