2009-02-09 4 views
6

Ich habe eine Liste von Datensätzen in meiner Datenbank und jeder Datensatz ist mit einer Postleitzahl verknüpft.Was ist der beste Weg, um eine Datenbank nach Datensätzen innerhalb von n Meilen von einer Postleitzahl abzufragen?

Was ist die "Best-Practice" für die Abfrage aller Datensätze in meiner Datenbank, um alle Einträge zu finden, die innerhalb von n Meilen einer anderen Postleitzahl liegen?

Jede Postleitzahl hat einen lat/long damit in der Datenbank, so dass ich weiß, dass ich das verwenden muss. Ich kann mir jedoch nicht vorstellen, für jedes Paar Postleitzahlen eine Entfernungsformel zu erstellen, die in Meilen umgerechnet wird und diejenigen zurückweist, die nicht in meinem Umkreis liegen.

Das scheint für eine solche allgemeine Abfrage sehr rechenintensiv zu sein.

Ich habe auch überlegt, eine Vorberechnung aller Paare zu machen, aber es scheint zu groß, um auch zu berücksichtigen. Es gibt ungefähr ~ 40.000 Postleitzahlen in den USA. Eine Datenbank mit allen Paaren jeder Postleitzahl wäre also (40.000)^2 oder 1,6 Milliarden Einträge.

Ich weiß, das ist ein häufiges Problem auf Websites, also hoffentlich kann mir jemand in die richtige Richtung für den besten Weg zeigen. Ich benutze SQL Server 2008 und wenn es vorgefertigte Lösungen da draußen dann groß, denn ich wirklich möchte nicht das Rad in diesem Fall neu erfinden.


Verwandte Frage: Getting all zip codes within radius (das hat mir nicht helfen)
Auch weiß ich, dieses SourceForge Projekt, aber es ist verfallenen und nicht mehr in Gebrauch.

Antwort

7

Ich würde eine Abfrage, die alle Datensätze in der quadratischen Hülle encompasing die radiale Suche Kreis klammert zurück (minlat < lat < MAXLAT und minlong < lange < maxlong) und dann nachbearbeiten dies nur die Punkte innerhalb der zurück Radiuskreis selbst (Stellen Sie sicher, dass Ihre Breiten- und Langfelder indiziert sind).

Wenn Sie Lust auf Phantasie haben, unterstützt SQL Server spatial indexes.

+0

dang: beat me to it! –

0

Dies ist in der Tat ein sehr schweres Problem zu lösen. Ich würde dir empfehlen, etwas zu mogeln, indem du eine Datenbank vorbereitest. Erstellen Sie ein Raster von beliebiger Art von Nähe, die Sie suchen müssen. Nehmen Sie zum Beispiel alle 10 Meilen in jede Richtung, fügen Sie einen Eintrag zur Datenbank für jede Postleitzahl für diesen Rasterpunkt und die Entfernung hinzu, und wenn eine Abfrage eingeht Übersetze zuerst den Abfragepunkt auf einen deiner Gitterpunkte. Jetzt können Sie die Entfernung ganz leicht nachschlagen.

Diese Lösung bedeutet im Grunde, dass Speicherplatz für die Zeit genutzt wird, damit Sie schnell eine recht große Datenbank erhalten. Die gute Nachricht ist: Es ist sehr einfach Daten zu indexieren.

+0

Eine Vorberechnung aller Paare wäre ziemlich groß. Aprox. 40.000 US-Postleitzahlen, also (40.000)^2 für jeden Bereich wären viele Datenbankeinträge. – mmcdole

+0

Das wären ungefähr ~ 1,6 Milliarden Einträge für jeden Bereich ... Ich weiß nicht, ob das eine Option wäre. – mmcdole

+0

Eigentlich schlägt Ola Bini vor, dass Sie die Anzahl der Einträge stark verkürzen können, wenn Sie die maximale Entfernung zwischen den Postleitzahlen begrenzen können (10 Meilen in seinem Beispiel) – tehvan

3

Ich betreibe a site that needs to run this query about once per second per user, und hier ist das, was ich gelernt habe:

Zunächst einmal sicher, dass Ihr Standort Tabellenindizes auf Lat und Lon hat. Das ist der Unterschied zwischen 20ms und 15s Antwortzeiten, wenn Sie Millionen von Datensätzen haben.

Beginnen Sie mit einer Bounding-Box-Abfrage, um eine Reihe von Standorten zu erhalten. Dann berechnen Sie Entfernungen auf diese, sortieren Sie, und wenn Sie pingelig Genauigkeit sind, filtern Sie ein paar aus.

Ehrlich gesagt, würde ich mir keine Sorgen machen, irgendetwas vorzurechnen.Wie ich schon sagte, führe ich diese Art von Abfrage für eine Standorttabelle mit 6.000.000 Einträgen aus und gibt normalerweise Ergebnisse in < 50ms zurück. Je nach Ihren Bedürfnissen sollte das wirklich schnell genug sein.

Viel Glück!

+0

Vielen Dank für Ihre persönlichen Informationen zu diesem Thema. Ich schätze es. – mmcdole

0

Sie sollten sich GeoNames.org ansehen. Sie können ihre webservice nach was Sie suchen, oder Sie können ihre Datenbank abfragen.

Verwandte Themen