База данных/NoSQL — способ получения следующих данных с наименьшей задержкой

У меня есть заявка на недвижимость, а «дом» содержит следующую информацию:

house:
- house_id 
- address
- city 
- state
- zip
- price
- sqft
- bedrooms
- bathrooms
- geo_latitude
- geo_longitude

Мне нужно выполнить ЧРЕЗВЫЧАЙНО быстрое (с малой задержкой) извлечение всех домов в пределах поля геокоординат.

Что-то вроде SQL ниже (если бы я использовал базу данных):

SELECT * from houses 
WHERE latitude IS BETWEEN xxx AND yyy
AND longitude IS BETWEEN www AND zzz

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


person Nickb    schedule 09.05.2010    source источник
comment
Это все равно, что спросить, что мне нужно добраться до ближайшего Walmart быстрее всего, не упоминая, как далеко это находится? Какие автомобили у вас есть? и Развиты ли дороги там, где вы живете? Трудно ответить на ваш вопрос. то есть Memcached может быть самым быстрым, но как вы запускаете на нем запросы. Такого рода общие вопросы не могли иметь ответа, кроме обсуждения. Добавьте больше информации в свой вопрос   -  person mamu    schedule 10.05.2010
comment
Это похоже на дубликат stackoverflow.com/questions/2796575/.   -  person kristina    schedule 10.05.2010


Ответы (3)


Это типичный запрос для приложения географической информационной системы (ГИС). Многие из них решаются с помощью дерева квадрантов или аналогичных пространственных индексов. Упомянутая мозаика - это то, как они часто в конечном итоге реализуются.

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

person Pekka    schedule 06.06.2010

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

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

person Nick Gerakines    schedule 11.05.2010

Я собираюсь предположить, что вы выполняете гораздо больше операций чтения, чем записи, и вам не нужно распределять базу данных по десяткам машин. Если это так, вам следует выбрать базу данных, оптимизированную для чтения, такую ​​​​как sqlite (мое личное предпочтение) или mysql, и использовать именно тот SQL-запрос, который вы предлагаете.

Большинство (не все) баз данных NoSQL оказываются чрезмерно сложными для запросов такого рода, поскольку они лучше ищут точные значения в своих индексах, а не в диапазонах.

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

person apenwarr    schedule 07.06.2010