TOP [N] Records Group By по запросу пользователя в лучшем виде - PullRequest
0 голосов
/ 25 июня 2018

Сегодня я столкнулся с интересной проблемой:

Предположим, что выполнены следующие условия

1.Количество пользователей n

2.Система собирает GPS-координаты каждого водителя при его движении

3.Мы должны запросить последние 10 записей GPS-координат на пользователя, отсортированные по LAST_UPDATE_DATE в порядке убывания

4.В таблице более 1982008 записей

Я решил эту проблему, запросив последние {(10 + [пороговое значение]) * n} записей, и расположил их в java, используяHashMap, где пользователь имеет значение Key, а список соответствующих координат - значения

. Это не лучшее решение, так как оно может выбирать случайные записи и может не покрывать 10 записей на пользователя,

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

Кто-нибудь может подсказать, что было бы наилучшим возможным решением для этого с использованием данных Spring JPA, я тожеоткрыт для использования обычного JDBC в случае, если данные Spring JPA не могут решить эту проблему

Я использую данные Spring JPA, Mysql, Java 8 для этого

Вот команда создания таблицы для этого

@ RaymondNijland Хорошо, конечно, вот команда создания таблицы

CREATE TABLE `gps_coordinate` (
    `ID` BIGINT(50) NOT NULL AUTO_INCREMENT,
    `user_id` VARCHAR(255) NULL DEFAULT '0',
    `driver_id` INT(20) NULL DEFAULT '0',
    `latitude` VARCHAR(50) NULL DEFAULT '0.00000000',
    `longitude` VARCHAR(50) NULL DEFAULT '0.00000000',
    `distance_in_miles` VARCHAR(50) NULL DEFAULT '0.00',
    `distance_in_kms` VARCHAR(50) NULL DEFAULT '0.00',
    `device_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `created_by` VARCHAR(50) NULL DEFAULT 'Anonymous',
    `created_date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_by` VARCHAR(50) NULL DEFAULT 'Anonymous',
    `updated_date` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`ID_HUB`),
    INDEX `user_fk` (`user_id`),
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=208445
;

1 Ответ

0 голосов
/ 25 июня 2018

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

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

Для решения в MySql прочитайте эту статью .

Для базы геоданных вы также можете использовать MySql.Здесь ссылка на типы пространственных данных , поддерживаемые MySql.

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