Domanda

Ho un sito che sto costruendo, è un'applicazione che crea stampe unione (più o meno ...) basata su un paio di preferenze degli utenti. Può generare cartesiano si unisce vale la pena di dati senza un problema, ma nelle arriva alle esigenze delle aziende per rendere la vita un po 'più difficile ...

devo costruire l'applicazione in modo che, dopo aver verificato codici di avviamento postale di dipendenti remoti, crea messaggi di posta elettronica per gli obiettivi di media in base a quanto lontano da quello dipendente l'obiettivo dei media è. Diciamo che per i dipendenti di istanza sono ben volontari in cui lavorano noti. L'impresa vuole e-mail dei media entro un raggio di 5 miglia di questi dipendenti un messaggio relativo al lavoro il dipendente sta facendo. Questo è dove le cose si fanno disordinato ... ho diverse scelte qui, che mi illustrerà i tentativi e fallimenti:

  1. Il raggio più grande è di 20 miglia. Creo una tabella di database che contiene i record di tutti i codici di avviamento postale degli Stati Uniti, uniti per ogni codice di postale entro 20 miglia di quel codice di avviamento postale. Il set di dati simile a (i nomi sono diversi questo è per amor di discussione):
    [SourceZip] | [City] | [Stato] | [CloseZip] | [City] | [Stato] | [Distanza] Fallisce: A titolo di esempio, NY ha 350k record dal set di dati di cui sopra (e altri stati sono peggio!). tempo medio di caricamento in quella pagina? 6 minuti ... Non succede. Ho verificato questo impostando punti di interruzione, è durante la fase DataAdapter.Fill () che si verifica la disconnessione.

  2. (Questo è mai stato attuato a causa di un problema di logistica) Faccio una connessione al database per ogni dipendente zip zip di destinazione media con una distanza di x o meno. Solo che i file di origine e gli obiettivi dei media combinati può raggiungere verso l'alto di 34K email individualizzati. connessioni 34k DB? anche se ho potuto escogitare un modo per riutilizzare le ricerche di codici di avviamento postale, ho fatto alcuni controlli di prova nel DB e ha scoperto che ci sono 500 codici distinti zip a New York in cui i dipendenti lavoravano. 500 connessioni db? Dubito che avrebbe funzionato, ma potrei essere sorpreso.

  3. Il mio ultimo schema per aggirare il problema è in che spera il server Web viene eseguito un gioco migliore allora l'oggetto .NET dataset da ottenere un nuovo insieme di dati si presenta come:
    [zip] | [Longitudine] | [Latitudine] Poi facendo una formula della distanza per capire se i dati funziona. Questo si basa molto sui processori sul server web. Si tratta di una scommessa vale la pena, o dovrò trovare lo stesso danno tempo di caricamento su questo tentativo come pure?

    C'è un modo migliore?

    Apprezzo qualsiasi input, anche se conferma i miei timori che questo progetto semplicemente non potrebbe funzionare .

Note aggiuntive : non ho il controllo del server, e sto correndo SQL2K :( Sto programmando il sito in Visual Studio 2005, framework 2.0 potrebbe avere aggiornato a.. SQL2005 e VS2008 entro i prossimi mesi però.

È stato utile?

Soluzione

Se si dispone di un set di dati per i dipendenti, e un set di dati per i file multimediali, e un terzo set di dati per la distanza betweeen cerniere origine e di destinazione, è possibile salvare un po 'di tempo che unisce i 3 tavoli insieme ...

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

In questo modo si imposta il rapporto tra il dipendente e Media utilizzando la distanza.

Altri suggerimenti

Se si dispone di un database di CAP con coordinate di longitudine / latitudine, si potrebbe calcolare la distanza al volo con la mia funzione Haversine (Vedi la mia risposta a questa domanda ).

Questo comporta molto bene in applicazioni web con tutti gli Stati Uniti dati del codice di avviamento postale.

La query sarà simile qualcosa di simile a questo:

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

Non sarebbe applicare questa all'indirizzo di ciascun destinatario, ma si dovrebbe determinare i Codici di avviamento postale all'interno del vostro raggio prima (in una query nidificate, o con un CTE), e poi partecipare a tutti gli indirizzi che avete bisogno di inviare una mail a.

Modifica Dopo indagini la risposta con la funzione Haversine è l'itinerario vorrei prendere ... non è così intenso come la funzione nostri usi db (che verranno fissati:))

Si dovrebbe non calcolare le distanze ogni volta, si tratta di un calcolo pesante dalla lunga / lat-lungo / lat, e se si sta facendo più di una volta, è inutile.

Detto questo, io sono sicuro perché hai scritto fuori già opzione # 2. Stiamo facendo qualcosa di simile a questo. Forse sono confusi dai numeri, ma quello che stai citano dovrebbe essere nulla per SQL2K a sudare.

Anche se si calcola la distanza in linea da cerniera a zip negli Stati Uniti, ci sono solo ~ 2 miliardi di righe. Sì, è molto, ma è roughtly statico, potrebbe essere sharded se è lento, ecc.

SELECT 350K righe (il tuo esempio per NY), non avrà 6 minuti se si ordina la tabella e indice SOURCEZIP (ALTER TABLE .. ORDER BY (SOURCEZIP)) in MySQL. Si dovrebbero prendere solo una frazione di secondo ... L'ALTER vorrà un lungo periodo di tempo (o si potrebbe creare la tabella in questo ordine) -. Ma dal momento che si tratta di una tabella statica sarebbe valsa la pena nulla

Si sta utilizzando SQL 2008? Se è così le nuove funzionalità di dati spaziali potrebbero essere proprio quello che stai cercando qui. È possibile trovare le coordinate nel raggio d'azione di un altro facilmente come con un "come" il confronto sulle stringhe.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top