2010-05-09 6 views
5

Ich habe eine Immobilien-Anwendung und ein „Haus“ enthält die folgenden Informationen abrufen:Datenbank/NoSQL - Niedrigste Latenz Art und Weise folgende Daten

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

Ich muß führe ein extrem schnelles (niedrige Latenz) Retrieval aller Häuser innerhalb eines Geokoordinatenkasten.

So etwas wie die SQL unten (wenn ich eine Datenbank verwenden war):

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

Frage: Was der schnellste Weg für mich wäre, diese Informationen zu speichern, so dass ich den schnellsten Abruf durchführen kann von Daten basierend auf Breite & Länge? (z. B. Datenbank, NoSQL, Memcache usw.)?

+1

Dies ist wie fragen, ich muss zum nächsten Walmart schnellsten Weg gehen, ohne zu erwähnen, wie weit es ist? Welche Fahrzeuge hast du? Und sind Straßen wo du lebst bereits entwickelt? Es ist schwer, Ihre Frage zu beantworten. d. h. Memcached könnte am schnellsten sein, aber wie führen Sie Abfragen darauf aus? Diese Art von allgemeinen Fragen konnte keine andere Antwort als die Diskussion haben. Fügen Sie weitere Informationen in Ihre Frage – mamu

+1

Dies scheint wie ein Duplikat von http://stackoverflow.com/questions/2796575/nosql-how-to-retrieve-a-house-based-on-lat-long. – kristina

Antwort

0

ThereMongoDB unterstützt Geospatial-Indizes, aber es gibt Möglichkeiten, die Berechnungszeit für solche Dinge zu reduzieren. Je nachdem, wie Ihre Daten angeordnet sind, können Sie Häuser in identifizierbare "Kacheln" platzieren und dann alle Häuser für eine bestimmte Kachel abrufen und aus diesem reduzierten Datensatz basierend auf der Entfernung von Ihren Koordinaten sortieren.

Je nachdem, wie viele Kacheln vorhanden sind, können Sie Bitmasken verwenden, um Häuser zu finden, die sich in der Nähe mehrerer Kacheln befinden oder diese überlappen.

1

Dies ist eine typische Abfrage für eine Geographische Informationssystem (GIS) -Anwendung. Viele von diesen werden gelöst, indem Quadbaum- oder ähnliche räumliche Indizes verwendet werden. Die erwähnten Fliesen sind, wie diese oft am Ende umgesetzt werden.

Wenn ein Index, der die Koordinaten enthält, in den Speicher passen könnte und das DBMS einen anständigen Optimierer hätte, dann könnte ein Tabellenscan einen kartesischen Abstand von jedem Punkt von Interesse mit einem ziemlich geringen Overhead bereitstellen. Wenn dies zu langsam ist, könnte die Abfrage vorab gefiltert werden, indem jede Koordinatenachse separat verglichen wird, bevor die vollständige Abstandsberechnung durchgeführt wird.

0

Ich gehe davon aus, dass Sie viel mehr Lesevorgänge als Schreibvorgänge ausführen und Ihre Datenbank nicht auf Dutzende von Computern verteilt sein muss. Wenn ja, sollten Sie eine leseoptimierte Datenbank wie sqlite (meine persönliche Präferenz) oder mysql verwenden und genau die von Ihnen vorgeschlagene SQL-Abfrage verwenden.

Die meisten (nicht alle) NoSQL-Datenbanken sind für Abfragen dieser Art zu kompliziert, da sie genauere Werte in ihren Indizes als in Bereichen suchen.

Es ist schön, dass Sie statt kartesischer Entfernung eine Begrenzungsbox suchen; Letzteres wäre schwieriger für eine SQL-Datenbank zu optimieren (obwohl Sie es auf eine Bounding-Box beschränken könnten, dann tun Sie die langsamere kartesische Distanzberechnung).