2013-11-15 3 views
0

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

Схожие вещи были заданы раньше, но я не нашел обсуждения, основанного на моих критериях для проблемного домена.

Вещи иметь в виду:

  • Начиная с нуля, я могу представить данные каким-либо образом (например, длинные & лат, и т.д.).
  • Любой набор результатов чувствительны ко времени, в котором это теряет срок действия в течение короткого периода времени (~ 5-15 минут), поэтому я не могу тайно кешировать
  • Я могу терпеть некоторые разумные погрешности в результатах, например, если местоположение немного вне порога или если строка в результирующем наборе совсем недавно истек
  • Язык агностик обсуждение является совершенным, но в случае, если это помогает, я использую C# MVC 3 и SQL Server 2012

Несколько первых мыслей:

  • Использование внешнего API, как Google, однако это вызовет тысячи запросов, а латентность будет плохой.
  • Используйте функцию Haversine, однако это выглядит дорого и поэтому должно выполняться на минимальном количестве кандидатов (возможно, в виде хранимой процедуры!)
  • Построить график почтовых индексов/zipcodes, так что из любого узла я могу f IND почтовые индексы и/Почтовые индексы, которые граничат его, однако это может включать в себя большое количество данных для хранения

Некоторые идеи оптимизации для быстрого снижения возможных кандидатов:

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

Я надеюсь, что ответ - это не просто исходная мощность процессора, и что есть некоторые подходы, о которых я не думал об этом может помочь мне?

Спасибо

ps. Извините, если я пропустил ранее заданные вопросы с полезными ответами, пожалуйста, дайте мне знать ниже.

+0

Ну, и SQL Server, и .NET имеют встроенную поддержку пространственных данных, почему бы вам не использовать это? Проверьте, например. [this] (http://msdn.microsoft.com/en-us/data/hh859721.aspx) или [это] (http://technet.microsoft.com/en-us/library/bb933811.aspx) – pentadecagon

+0

Интересные ссылки, я обязательно посмотрю на это сегодня вечером. Благодарю. пс. Ваш комментарий должен быть ответом, если он окажется решением – ComethTheNerd

ответ

1

А как насчет использования GeoHash? (см. http://en.wikipedia.org/wiki/Geohash)

+0

Это именно тот алгоритм, на который я надеялся, но не знал!Спасибо, позвольте мне поэкспериментировать с ним, и если это будет право на мое приложение, я обязательно отвечу на ваш ответ. – ComethTheNerd

+0

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

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