Сортировать локально или по запросу? - PullRequest
2 голосов
/ 08 августа 2011

Я занимаюсь разработкой Java-приложения, которое будет графически изображать и организовывать сотни объектов.Каждый из этих объектов загружается из базы данных SQL для использования в этой программе.

Пользователь сортирует эти данные, чтобы получить информацию о наборе данных, и я (как программист) нашел три различных метода для этого:

  1. Использование отдельных запросов SQLвернуть предварительно отсортированные данные в программу.
  2. Используйте алгоритм сортировки локально для сортировки всего набора данных.
  3. Используйте локальную базу данных SQLite, чтобы скопировать весь набор данных, а затем запросите сортировку в локальной базе данных.

Что было бы предпочтительнее, или есть какие-то другие решения, которые я мог упустить?

Ответы [ 5 ]

2 голосов
/ 08 августа 2011

В целом все решения могут работать, это зависит от конкретных требований - мои мысли:

1. Используйте отдельные SQL-запросы для возврата предварительно отсортированных данных в программу

Хорошо работает, если пользователь заранее определяет критерии сортировки. Что если она захочет прибегнуть к помощи после поиска данных (приводит к # 2)? Может иметь смысл определить сортировку по умолчанию для каждого запроса или параметр, влияющий на последовательность сортировки, на основе определенных критериев, таких как роль пользователя.

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

Как указано выше, комбинация # 1 и # 2 может быть тем, что вам нужно.

3. Используйте локальную базу данных SQLite, чтобы скопировать весь набор данных, а затем запросите сортировку в локальной базе данных

Абсолютно другая стратегия, несколько вещей, о которых вам нужно заботиться:

  1. синхронизация данных
  2. безопасность; работая на крупных предприятиях, я знаю, что некоторые специалисты по безопасности (например, аудиторы) сходят с ума, говоря о локальной репликации данных
  3. автономные возможности (преимущество)
  4. локальное хранилище

Персональный вариант: я бы выбрал комбинацию № 1 и № 2. Кроме того, я бы попытался определить интерфейс способом, поддерживающим прокрутку (например, «получить строки №20-100»).

Не точный ответ, но мое мнение основано на фактах, которые вы предоставили ...

0 голосов
/ 08 августа 2011

Я чувствую, что подход SQLite будет лучшим решением.

  • Написание собственного алгоритма может быть недостаточно хорошим, как в SQLite.

  • Кэширование недостаточно хорошее по сравнению с SQLlite.

0 голосов
/ 08 августа 2011

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

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

0 голосов
/ 08 августа 2011

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

0 голосов
/ 08 августа 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...