способ (на стороне клиента или на стороне сервера) пойти на нумерацию страниц / столбцы сортировки? - PullRequest
11 голосов
/ 01 апреля 2012

У меня 3000 записей в таблице сотрудников, которые я выбрал из своей базы данных одним запросом.Я могу показать 20 записей на странице.Таким образом, будет 150 страниц для каждой страницы, показывающей 20 записей.У меня есть два вопроса о разбиении на страницы и подходе к сортируемым столбцам:

1) Если я реализую простую нумерацию страниц без сортируемых столбцов, я должен отправить все 3000 записей клиенту и выполнить клиентскую часть нумерации страниц, используя javascript или jquery.Поэтому, если пользователь нажимает на вторую страницу, звонок не переходит на сторону сервера, и он будет быстрее. Хотя я не уверен, что скажется на отправке 3000 или более записей на стороне браузера / клиента?Итак, каков наилучший подход: либо отправлять все записи клиенту за один раз и выполнять сортировку там, либо по щелчку страницы отправлять вызов на сторону сервера, а затем просто возвращать результаты этой конкретной страницы?

2) В этом сценарии мне нужно предоставить нумерацию страниц вместе с сортируемыми столбцами (6 столбцов).Таким образом, здесь пользователь может щелкнуть любой столбец, например, имя сотрудника или название отдела, тогда имена должны быть расположены в порядке возрастания или убывания. Опять же, я хочу узнать лучший подход с точки зрения времени отклика / памяти?

Ответы [ 4 ]

7 голосов
/ 02 апреля 2012

Отправка данных вашему клиенту почти наверняка приведет к вашему узкому месту (особенно для мобильных клиентов), поэтому вы всегда должны стремиться посылать как можно меньше данных.С учетом вышесказанного, почти наверняка лучше сделать разбиение на страницы на стороне сервера.Это гораздо более масштабируемое решение.Вполне вероятно, что объем данных будет расти, поэтому в будущем безопаснее сделать пагинацию на сервере.

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

1 голос
/ 03 апреля 2012

ИСПОЛЬЗОВАНИЕ СЕРВЕРНОЙ СТРАНИЦЫ!

Конечно, вы могли бы избежать отправки массива JSON из 3000 элементов и использования JavaScript для постраничной сортировки на клиенте. Но хороший веб-программист должен знать, как разбивать и сортировать записи на сервере. (Они должны действительно знать пару способов). Так что думайте об этом как о хорошей практике:)

Если вам нужен гладкий пользовательский интерфейс, рассмотрите возможность использования компонента сетки JavaScript , который использует AJAX для извлечения данных. Как правило, эти компоненты возвращают следующие параметры (или какой-то их вариант):

  • Индекс начала записи
  • Количество возвращаемых записей
  • Сортировать столбец
  • Направление сортировки
  • Столбцы для выборки (иногда)

Разработчик должен реализовать обработчик или интерфейс, который возвращает набор результатов на основе этих входных параметров.

1 голос
/ 02 апреля 2012

Я знаю, что это не отвечает напрямую на нумерацию страниц на стороне сервера, но я бы порекомендовал использовать DataTables.net для отображения и разбивки на страницы ваших данных.Он обеспечивает очень хорошее отображение, позволяет сортировать и разбивать на страницы, встроенную функцию поиска и многое другое.В первый раз я использовал его для первого веб-проекта, над которым я работал, и я, будучи полным новичком, смог заставить его работать.Форумы также предоставляют очень хорошую информацию / помощь, и создатель ответит на ваши вопросы.DataTables могут использоваться как на стороне клиента, так и на стороне сервера, и могут поддерживать тысячи строк.Что касается скорости, у меня было всего несколько сотен строк, но я использовал обработку на стороне клиента и никогда не замечал задержки.

1 голос
/ 02 апреля 2012

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

Если вы этого еще не сделали, вам следует реализовать кэширование этих компонентов в вашем приложении. Это можно сделать локально, например, используя CacheBuilder в Guava, или удаленно, например, используя вызовы Memcached (последний будет необходим для нескольких серверов приложений / балансировки нагрузки). Кэш для этих bean-компонентов должен быть снабжен ключом с уникальным идентификатором, скорее всего, с отображением в столбце первичного ключа соответствующей таблицы.

Приступая к нумерации страниц: просто напишите свои запросы, чтобы вернуть только идентификаторы выбранных записей. Включите LIMIT и OFFSET или эквивалент вашего языка БД для разбивки на страницы. Вызывающий запрос также может фильтровать / сортировать по желанию, используя WHERE, ORDER BY и т. Д.

Вернувшись на уровень Java, выполните итерацию по полученным идентификаторам этих запросов и создайте List bean-компонентов, вызвав кэш. Если кеш отсутствует, он будет вызывать ваш ORM для индивидуального запроса и загрузки этого компонента. После создания List его можно обработать / сериализовать и отправить в пользовательский интерфейс.

...