Pergunta

Eu tenho um site que estou construindo, é um aplicativo que cria mala direta (mais ou menos ...) com base em um par de preferências do usuário. Ele pode gerar Cartesian junta-se no valor de dados sem nenhum problema, mas em vem às necessidades da empresa para tornar a vida um pouco mais difícil ...

Eu tenho que construir o aplicativo para que, após a verificação zip códigos de funcionários remotos, cria-mails para alvos de mídia com base em quão longe do que o empregado o alvo da mídia é. Vamos dizer para os funcionários de instâncias são bem voluntários onde trabalham conhecido. A empresa quer enviar e-mail de mídia dentro de um raio de 5 milhas desses empregados uma mensagem sobre o trabalho que o funcionário está fazendo. Este é o lugar onde as coisas ficam confuso ... Eu tenho várias opções aqui, que vou descrever as tentativas e fracassos:

  1. A maior raio é de 20 milhas. I criar uma tabela de banco de dados que armazena os registros de cada código postal nos EUA, se juntaram a cada código postal dentro de 20 milhas de que CEP. O conjunto de dados é algo como (Os nomes são diferentes isso é para o bem do argumento):
    [SourceZip] | [City] | [Estado] | [CloseZip] | [City] | [Estado] | [Distância]
    Falha: Como exemplo, NY tem 350k registros do conjunto de dados acima (e outros estados são piores!). tempo médio de carregamento nessa página? 6 minutos ... Não vai acontecer. Verifiquei isso, definindo pontos de interrupção, isto é, durante a fase DataAdapter.Fill () que ocorre a desconexão.

  2. (Este nunca foi implementada devido a um problema de logística) I fazer uma conexão de banco de dados para cada zip empregado para a mídia alvo zips com uma distância de x ou menos. Só que os arquivos de origem e as metas de mídia combinadas podem alcançar mais de 34k e-mails individualizados. conexões 34k DB? mesmo se eu pudesse encontrar uma maneira de pesquisas reutilização de código zip, eu fiz algumas verificações de teste no DB e descobriu que há 500 CEPs distintos em NY, onde funcionários trabalhavam. 500 conexões db? Duvido que iria funcionar, mas eu poderia ser surpreendido.

  3. O meu mais recente esquema para contornar o problema está em que espera que o servidor web é executado um jogo melhor, em seguida, o objeto .net conjunto de dados, obtendo uma nova aparência do conjunto de dados como:
    [zip] | [Longitude] | [Latitude]
    Em seguida, fazendo uma fórmula de distância para descobrir se as obras de dados. Isso depende muito dos processadores no servidor web. É este um jogo que vale a pena, ou vou encontrar o mesmo dano tempo de carregamento em esta tentativa também?

    Existe uma maneira melhor?

    Eu aprecio qualquer entrada, mesmo que isso confirma meus medos que este projeto apenas pode não funcionar .

Notas adicionais :.. Eu não tenho o controle do servidor, e eu estou correndo SQL2K :( Eu estou programando o site no visual studio 2005, o quadro 2.0 pode ficar atualizado para SQL2005 e VS2008 dentro dos próximos meses embora.

Foi útil?

Solução

Se você tem um conjunto de dados para os seus funcionários, e um conjunto de dados para seus meios, e um terceiro conjunto de dados para a distância betweeen zips origem e de destino, você pode economizar um pouco de tempo juntando as 3 mesas juntos ...

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

Desta forma, você definir as relações entre o funcionário e mídia usando a Distância.

Outras dicas

Se você tem um banco de dados de CEP com longitude / latitude, você pode calcular a distância em tempo real com a minha função Haversine (Veja o meu resposta a esta pergunta ).

Este executa muito bem em aplicações web com todo os dados do código postal dos EUA.

A consulta seria parecido com algo semelhante a isto:

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

Você não iria aplicar isto ao endereço de cada destinatário, mas você iria determinar os CEPs dentro de seu raio de primeira (em uma consulta aninhada, ou com um CTE), e, em seguida, juntar-se em todos os endereços que você precisa enviar um e-mail a.

Editar Após investigação a resposta com a função Haversine é a rota que eu levaria ... não é tão intensa como a função de nossos usos db (que serão fixos:))

Você deve não calcular as distâncias de cada vez, é um cálculo pesado de long / lat para long / lat, e se você está fazendo isso mais de uma vez, é desnecessário.

Dito isto, não estou certo por que você escreveu off opção # 2 já. Estamos realmente fazendo algo semelhante a isto. Talvez eu esteja confuso com os números, mas o que você está mencionando deve ser nada para SQL2K de suor.

Mesmo se você calcular off-line a distância do zip para zip nos EUA, existem apenas ~ 2 bilhões de linhas. Sim, é muito, mas é roughtly estática, poderia ser Sharded se é lento, etc.

SELECT de 350K linhas (o seu exemplo para NY) não vai demorar 6 minutos se você pedir a mesa e índice por SOURCEZIP (ALTER TABLE .. ORDER BY (SOURCEZIP)) em MySQL. Ele só deve ter uma fração de segundo ... O ALTER vai levar um longo tempo (ou você poderia criar a tabela nessa ordem.) - mas uma vez que é uma tabela estática seria bem vale nada

Você está usando SQL 2008? Se assim for os novos recursos de dados espaciais pode ser apenas o que você está procurando aqui. Você pode encontrar as coordenadas dentro do alcance de um outro tão facilmente quanto usando uma comparação "como" em cordas.

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top