2013-08-02 3 views
0

У нас есть объекты с латами и длинными рекордами. Также каждый объект имеет дату создания.Как реализовать быструю сортировку по результату функции?

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

Допустим, у нас есть объекты в Нью-Йорке и Джерси. Если вы выходите из Нью-Йорка, вы должны увидеть объекты Нью-Йорка наверху, а затем Jersey. Но тем не менее, очень старые объекты new-york должны быть ниже, чем новые предметы трикотажа.

Мы можем аппроксимировать функцию F = < объект свежести в день> + < расстояния от текущей точки пользователя, чтобы объект места в км>

Мы используем PostGreSQL для хранения данных, и мы можем на самом деле просто сортировать по такой функции и получить то, что нам нужно. Проблема в том, что мы боимся, что это будет работать довольно медленно, потому что мы планируем достичь таких объектов 1k-10k и 100-300 мест, и приложение должно быстро вернуть результат (потому что это похоже на самое важное в приложении)

Пользователи будут добавлять объекты из разных мест.

Есть ли у вас идеи, как повысить производительность такого запроса?

ответ

1

Вместо этого вы можете сортировать по: расстоянию - object_creation_time. Вам не нужно переоценивать эту функцию каждый раз, когда вы сортируете, потому что ее значение не изменится.

+0

извините, не понял, в соответствии с чем? Ну функция будет принимать два аргумента < lat, long > текущего пользователя. И «свежесть» объектов будет меняться каждый день. –

+0

@ user909291 Не могли бы вы объяснить более подробно, как реализовано <>? Является ли это несколько числовых или столбцов даты/времени в таблице? Что вы подразумеваете под «свежемостью меняется каждый день», есть ли работа, выполняемая каждый день (или ночь), которая вычисляет новый <> и обновляет всю таблицу? – krokodilko

+0

Нет, нет. Во-первых, это еще не реализовано, мы просто думаем об этом. Говоря «Свежесть», я имею в виду количество дней, прошедших с даты создания. У нас будет поле даты и времени (дата создания). Но мы можем создавать задания, независимо от того, имеет ли смысл –

-1

В Postgres индексы не обязательно должны находиться только в столбце или кортеже столбцов ... Вы можете создать индекс для своей функции, как описано в Postgres documentation.. Если вы запрашиваете по той же функции, индекс должен использоваться.

+0

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

+0

Вы правы - я пропустил, что это было для текущего местоположения пользователя, а не только для произвольной фиксированной точки. BLEH. – dcsohl

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