Frage

Ich habe eine Website, die ich Baue, es ist eine Anwendung zur Erstellung von Serienbriefen (mehr oder weniger...), basierend auf einem paar von Benutzer-Präferenzen.Es können kartesische joins Wert von Daten, ohne ein problem, aber kommt die Bedürfnisse von Unternehmen zu machen das Leben ein bisschen mehr schwierig...

Ich habe um die Anwendung zu erstellen, so dass, nach der überprüfung des zip-codes für remote-Mitarbeiter, schafft es E-Mails media-Ziele basierend auf, wie weit aus, dass Mitarbeiter der media-Ziel ist.Lassen Sie uns zum Beispiel sagen Mitarbeiter sind gut bekannt Freiwilligen, wo Sie arbeiten.Das Unternehmen will E-Medien innerhalb eines 5-Meile radius dieser Mitarbeiter eine Nachricht über die Arbeit der Mitarbeiter zu tun.Dies ist, wo alles Durcheinander...Ich habe mehrere Möglichkeiten zur Auswahl, die ich skizzieren, die versuche und das scheitern:

  1. Der größte radius von 20 Meilen.Ich erstellen Sie eine Datenbank-Tabelle, die hält Aufzeichnungen über jede Postleitzahl in den USA, zusammengetan, um jedem zip-code innerhalb von 20 Meilen von der zip-code.Der Datensatz sieht so etwas wie (Die Namen sind anders ist dies um des Arguments Willen):
    [SourceZip] | [Stadt] | [Land] | [CloseZip] | [Stadt] | [Land] | [Abstand]
    Fehl:Als ein Beispiel, NY 350k Datensätze aus den oben genannten datasets (und andere Staaten sind noch schlimmer!).Durchschnittliche Ladezeit auf dieser Seite?6 Minuten...Nicht passiert.Ich überprüfte dies, indem Sie Haltepunkte festlegen, ist es in der dataadapter.fill() der Bühne, die das trennen erfolgt.

  2. (Dieser wurde nie umgesetzt durch ein Logistik problem) ich habe eine Datenbank-Verbindung für jeden Mitarbeiter zip media target Reißverschlüsse mit einem Abstand von x oder weniger.Außer, dass die source-Dateien und Medien Ziele kombiniert werden, können erreichen die nach oben 34k individualisierte E-Mails.34k DB-verbindungen?selbst wenn ich könnte erarbeiten einen Weg, um die Wiederverwendung von zip-code sucht, habe ich einige test-Prüfungen in die DB und festgestellt, dass es 500 verschiedene Postleitzahlen in New York, wo die Mitarbeiter gearbeitet.500 db-verbindungen?Ich bezweifle, dass das funktionieren würde, aber ich könnte mich überrascht.

  3. Meine neueste Regelung zu umgehen, ist das problem in der Hoffnung, dass der web-server läuft, ein besseres Spiel dann das .net-dataset-Objekt, indem man einen neuen Datensatz sieht wie folgt aus:
    [zip] | [Breitengrad] | [Breitengrad]
    Dann tut einem Abstand Formel, um herauszufinden, ob die Daten, die funktioniert.Diese stützt sich stark auf die Prozessoren auf dem web-server.Ist dies ein lohnendes Glücksspiel, oder finde ich die gleiche Ladezeit Schäden an diesem Versuch auch?

    Gibt es einen besseren Weg?

    Ich freue mich über jede Eingabe, auch, wenn es bestätigt meine Befürchtung, dass dieses Projekt nur funktionieren möglicherweise nicht.

Zusätzliche Hinweise:Ich habe nicht Kontrolle über den server und ich bin mit SQL2k :(.Ich bin der Programmierung der Website in visual studio 2005, framework 2.0.Möglicherweise aktualisiert, um SQL2005 und VS2008 innerhalb der nächsten paar Monate obwohl.

War es hilfreich?

Lösung

Wenn Sie ein dataset für Ihre Mitarbeiter und ein dataset für Ihre Medien, und eine Dritte dataset für den Abstand zwischen Quell-und Ziel-Reißverschlüsse, Sie können ein wenig sparen Zeit Eintritt in die 3 Tabellen zusammen...

SELECT *
FROM Employees_List
   INNER JOIN 
       (Media_List INNER JOIN Distance_List ON Media_List.Zip = Distance_List.Target_Zip)
   ON Employees_List.Zip = Distance_List.Source_Zip
WHERE distance_Miles <=5

Auf diese Weise legen Sie die Beziehungen zwischen Mitarbeitern und Medien mit der Entfernung.

Andere Tipps

Wenn Sie eine ZIP-code-Datenbank mit Längen - /Breitengrad-Koordinaten, könnten Sie berechnen Sie die Entfernung auf der fliege mit meinem Haversine-Funktion (Siehe meine die Antwort auf diese Frage).

Dies führt sehr gut in web-apps mit dem gesamten US-ZIP-code-Daten.

Die Abfrage Aussehen würde, so etwas wie dies:

select * from zip where 
   dbo.udf_Haversine(zip.lat,zip.long, @lat, @lon) < 20   -- (miles)

Sie würde nicht dieses, um jede Empfänger-Adresse, aber Sie bestimmen die Postleitzahlen in Ihrem radius erste (in eine verschachtelte Abfrage, oder mit einem CTE), und treten Sie dann in alle Adressen, die Sie brauchen, um eine E-mail senden.

BEARBEITEN Nach der Untersuchung wird die Antwort mit der Haversine-Funktion ist die route, die ich nehmen würde...es ist nicht so intensiv, wie die Funktion unserer db verwendet wird behoben :))

Sollten Sie nicht Berechnung der Entfernungen jedes mal, es ist eine schwere Berechnung von long/lat-long/lat, und wenn Sie es tun, mehr als einmal, es ist unnötig.

Dass gesagt wird, ich bin mir nicht sicher, warum Sie schrieb aus option #2 schon.Wir sind tatsächlich etwas tun, ähnlich wie diese.Vielleicht bin ich verwirrt durch die zahlen, aber was du erwähnen sollte nichts für SQL2k zu Schwitzen.

Auch wenn Sie berechnen offline die Distanz von zip in-zip in den USA, es sind nur ~2 Mrd Zeilen.Ja, es ist eine Menge, aber es ist roughtly statische, könnte sharded wenn es ist langsam, etc.

WÄHLEN Sie von 350K Zeilen (Ihr Beispiel für New York) wird nicht nehmen Sie 6 Minuten, wenn Sie, um die Tabelle & index SOURCEZIP ("ALTER TABLE ..ORDER BY (SOURCEZIP) ) in MySQL.Es dauert nur einen Bruchteil einer Sekunde ...Das ALTER wird eine lange Zeit dauern (oder können Sie die Tabelle in dieser Reihenfolge) -- aber da es ist eine statische Tabelle, es wäre auch nichts Wert.

Verwenden Sie SQL 2008?Wenn so die neue räumliche Daten Funktionen könnten genau das sein, was Sie suchen für hier.Finden Sie Koordinaten in die Reichweite des anderen so einfach wie mit einem "WIE" - Vergleich für Zeichenfolgen.

http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top