Каков наилучший способ запроса базы данных для записей в течение миль почтового индекса? - PullRequest
6 голосов
/ 09 февраля 2009

У меня есть список записей в моей базе данных, и каждая запись связана с почтовым индексом.

Какова "наилучшая практика" для запроса всех записей в моей базе данных, чтобы найти все записи, которые находятся в пределах n миль от другого почтового индекса?

С каждым почтовым индексом в базе данных связан лат / лонг, поэтому я знаю, что мне придется это использовать. Тем не менее, я не могу себе представить какую-либо формулу расстояния для каждой пары почтовых индексов, конвертирование в мили и отклонение тех, которые находятся за пределами моего радиуса.

Это кажется ужасно дорогим в вычислительном отношении для такого распространенного запроса.

Я также подумал о том, чтобы выполнить предварительное вычисление для всех пар, но оно кажется слишком большим для рассмотрения. В США приблизительно 40 000 почтовых индексов. Таким образом, база данных всех пар каждого почтового индекса будет (40000) ^ 2 или 1,6 миллиарда записей.

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


Смежный вопрос: Получение всех почтовых индексов в радиусе (это мне не помогло)
Кроме того, я знаю об этом SourceForge проекте, но он заброшен и больше не используется.

Ответы [ 4 ]

7 голосов
/ 09 февраля 2009

Я бы запустил запрос, который возвращал бы все записи в квадратных скобках, заключенных в круговой круг поиска (minlat

Если вы хотите выглядеть модно, SQL-сервер поддерживает пространственные индексы .

3 голосов
/ 09 февраля 2009

Я запускаю сайт, который должен выполнять этот запрос примерно раз в секунду на пользователя , и вот что я узнал:

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

Начните с запроса ограничительной рамки, чтобы получить набор местоположений для работы. Затем рассчитайте расстояния по ним, сортируйте, и, если вам не нравится точность, отфильтруйте несколько.

Честно говоря, я бы не беспокоился о предварительных вычислениях. Как я уже сказал, я запускаю этот тип запроса к таблице местоположений с 6 000 000 записей, и она обычно возвращает результаты <50 мс. В зависимости от ваших потребностей это должно быть достаточно быстрым. </p>

Удачи!

0 голосов
/ 09 февраля 2009

Вы должны посмотреть на GeoNames.org . Вы можете запросить их webservice о том, что вы ищете, или вы можете добавить базу данных.

0 голосов
/ 09 февраля 2009

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

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

...