2012-04-01 2 views
11

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

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

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

+0

Эффект отправки 3000 записей любых значимых данных значительно замедлит работу браузера. Я бы разбивал страницы на сервер. – Brad

+0

Я не знаю, как большой набор данных влияет на производительность браузера. Выглядит нравится ваш ответ. 3000 или более записей будет сложно обрабатывать браузером. Это? –

+0

Вопрос: Какова вероятность/частота появления «следующих» 20 результатов? Если он низкий, укажите серверный сервер. Если умеренная, все еще серверная сторона, стоит штраф. Если высокая, STILL-серверная сторона с тех пор, как узкое место и обработка на стороне клиента, возможно, не стоят этого :) Вы всегда можете использовать OFFSET и LIMIT, чтобы узнать, какую страницу нужно извлечь :) – PhD

ответ

7

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

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

+1

Я не знаю, как большой набор данных влияет на производительность браузера. Выглядит нравится ваш ответ. 3000 или более записей будет сложно обрабатывать браузером. Является ли это? Также считаю, что я в основном рассматриваю только клиентов Deskop/laptop, которые сейчас не являются мобильными клиентами. –

+0

Браузер сможет обрабатывать данные (возможно), но имейте в виду, что скорость сети обычно является самой медленной частью вашего приложения, часто на несколько порядков. С учетом сказанного, дополнительные данные, которые вы отправляете, очень дороги. – Oleksi

+1

В этом случае запрос, respose будет медленнее только в первый раз (когда я отправляю 3000 записей вместе). Но это будет быстрее, когда пользователь перейдет на дальнейшие страницы, так как мы можем играть с данными на самой стороне клиента (нет необходимости переходить на сервер). Снова такой же вопрос :). Какой из них лучше клиентской или серверной (вероятно, это будет зависеть от сценария, когда пользователь вряд ли перейдет через несколько страниц, на которые мы можем пойти на серверную сторону, но если он, вероятно, пройдет через большое количество страниц, мы можем пойти на клиентов). На самом деле я ищу такой подробный анализ. –

1

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

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

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

Назад в слое Java, перебирать в результате идентификаторы этих запросов и создать свой List бобов путем вызова кэша. Если кеш пропустит, он вызовет ваш ORM для индивидуального запроса и загрузки этого компонента. Как только будет создан List, его можно обработать/сериализовать и отправить в пользовательский интерфейс.

1

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

+0

Твердый продукт. Даже если DT не используется, есть разные варианты использования и демонстрации, чтобы узнать, что непосредственно ответит на вопрос темы: «... и если вы работаете с серьезными большими базами данных, вам может потребоваться использовать параметры на стороне сервера, которые DataTables предоставляет. " Я опираюсь на теорию больших чисел для решения проблем масштабирования. В противном случае проверьте демонстрацию на стороне клиента. –

1

ИСПОЛЬЗУЙТЕ ПОСТАВКУ СЕРВЕРА!

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

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

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

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

+0

dana Спасибо за ответ. Похоже, что из всех ответов, что постраничная разбивка на сервер является лучшим вариантом. Но по-прежнему хочу пояснить, почему серверная сторона - хорошая практика, хотите знать, что будет иметь значение, если разбиение на страницы и сортировка на стороне клиента, а не на стороне сервера. Я имею в виду, почему его не хватает. Это потому, что для передачи таких огромных данных в сети или браузера потребуется больше времени, потому что из-за таких огромных данных будет медленным? –

+0

Я думаю, что где-то есть баланс. Подумайте о хэш-таблице и связанном списке. Для небольших наборов записей связанный список будет работать нормально. Но по мере увеличения размера набора записей хэш-таблица победит. То же самое верно для пейджинга. Работа на стороне клиента будет выполняться для небольших наборов записей, но по мере увеличения количества записей, вы отправляете все больше и больше данных, чтобы отображать только несколько записей. – dana

+1

Суть в том, что на стороне сервера пейджинг * SCALES *. Приложение может работать нормально, но с течением времени, когда ваша база данных будет получать больше записей, для передачи всей записи, установленной клиенту, потребуется больше времени и времени. Тем не менее, есть, конечно, ситуации, когда вы никогда не сможете получить слишком много записей, а постраничная разбивка на страницы всегда будет выполняться. Но если вы разработаете шаблон, который работает для вас с точки зрения серверного подкачки, это будет намного более гибким в долгосрочной перспективе. – dana

Смежные вопросы