Question

J'ai un site que je construis, il est une application qui crée publipostages (plus ou moins ...) basée sur quelques préférences de l'utilisateur. Il peut générer cartésien se joint à la valeur de données sans problème, mais vient les besoins de l'entreprise pour rendre la vie un peu plus difficile ...

Je dois construire l'application de telle sorte que, après avoir vérifié les codes postaux des employés distants, il crée des e-mails à des cibles des médias basés sur la distance de cet employé la cible des médias est. Disons que pour les employés d'exemple sont bien connus des bénévoles où ils travaillent. L'entreprise veut envoyer un courriel médias dans un rayon de 5 mile de ces employés un message sur le travail que l'employé est en train de faire. C'est là que ça devient désordre ... J'ai plusieurs choix ici, que je vais décrire les tentatives et les échecs:

  1. Le plus grand rayon est de 20 miles. Je crée une table de base de données contenant des enregistrements de chaque code postal aux États-Unis, se sont joints à chaque code postal à moins de 20 miles de ce code postal. L'ensemble de données ressemble à quelque chose comme (Les noms sont différents c'est pour les besoins du raisonnement):
    [SourceZip] | [City] | [État] | [CloseZip] | [City] | [État] | [Distance]
    Ne parvient pas: À titre d'exemple, NY a 350k enregistrements des données ci-dessus (et d'autres états sont pires!). temps de chargement sur cette page? 6 minutes ... pas le cas. Je vérifié cela en définissant des points d'arrêt, il est dans la phase DataAdapter.Fill () que la déconnexion se produit.

  2. (Celui-ci n'a jamais été mis en œuvre en raison d'un problème de logistique) Je fais une connexion de base de données pour chaque zip employé à zips cible des médias avec une distance de x ou moins. Sauf que les fichiers source et les cibles des médias combinés peuvent atteindre plus de 34k emails personnalisés. connexions 34k DB? même si je pouvais trouver un moyen de réutiliser des recherches de code postal, je l'ai fait quelques vérifications de test dans la base de données et a constaté qu'il ya 500 codes postaux distincts à New York où les employés travaillaient. 500 connexions db? Je doute que cela fonctionne, mais je pourrais être surpris.

  3. Mon dernier projet pour contourner le problème est que en espérant que le serveur Web exécute un meilleur jeu alors l'objet de jeu de données .net en obtenant un nouvel ensemble de données ressemble:
    [zip] | [Longitude] | [Latitude]
    faire ensuite une formule à distance pour savoir si les données fonctionne. Cela repose en grande partie sur les processeurs sur le serveur Web. Est-ce un pari vaut la peine, ou vais-je trouver les mêmes dégâts de temps de charge sur cette tentative aussi?

    Y at-il une meilleure façon?

    Je vous remercie de toute entrée, même si elle confirme mes craintes que ce projet juste ne fonctionne pas .

Notes complémentaires : Je n'ai pas le contrôle du serveur, et je suis en cours d'exécution SQL2K :( Je suis la programmation du site dans Visual Studio 2005, cadre 2.0 pourrait obtenir mis à niveau.. SQL2005 et VS2008 dans les prochains mois, mais.

Était-ce utile?

La solution

Si vous avez un ensemble de données pour vos employés, et un ensemble de données pour vos médias, et un troisième jeu de données pour la distance betweeen source et zips cible, vous pouvez économiser un peu de temps de rejoindre les 3 tables ensemble ...

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

De cette façon, vous définissez les relations entre les employés et les médias en utilisant la distance.

Autres conseils

Si vous avez une base de données de code postal de coordonnées longitude / latitude, vous pourriez calculer la distance à la volée avec ma fonction Haversine (voir mon réponse à cette question ).

fonctionne très bien dans les applications web avec l'ensemble des données de code postal des États-Unis.

La requête ressemblerait à quelque chose de similaire à ceci:

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

Vous ne l'appliquer à l'adresse de chaque destinataire, mais vous analyserez les codes ZIP dans votre premier rayon (dans une requête imbriquée, ou avec un CTE), puis se joindre à toutes les adresses que vous avez besoin d'envoyer un message à.

EDIT Après enquête, la réponse avec la fonction Haversine est la route que je prendrais ... ce n'est pas aussi intense que la fonction de nos utilisations db (qui seront fixées:))

Vous devez pas calculer les distances à chaque fois, il est un calcul lourd de latitude / longitude à latitude / longitude, et si vous faites plus d'une fois, il est inutile.

Cela étant dit, je ne suis pas sûr pourquoi vous avez écrit de l'option 2 déjà. Nous faisons en fait quelque chose de semblable à cela. Peut-être que je suis confus par les chiffres, mais ce que vous évoquez devrait être rien pour SQL2K à transpirer.

Même si vous calculez la distance hors ligne de zip zip aux Etats-Unis, il n'y a que ~ 2 milliards de lignes. Oui, il est beaucoup, mais il est roughtly statique, pourrait être si elle est fragmentées lent, etc.

SELECT de 350K lignes (votre exemple pour NY) ne prendra pas 6 minutes, si vous commandez la table et l'index par SOURCEZIP (ALTER TABLE .. ORDER BY (SOURCEZIP)) dans MySQL. Il ne devrait prendre une fraction de seconde ... Le ALTER prendre beaucoup de temps (ou vous pouvez créer la table dans cet ordre) -. Mais comme il est une table statique, il serait bien ne vaut rien

Utilisez-SQL 2008 vous? Dans ce cas les nouvelles fonctionnalités de données spatiales pourraient être juste ce que vous cherchez ici. Vous pouvez trouver des coordonnées à portée d'un autre aussi facilement en utilisant une comparaison « LIKE » sur les chaînes.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top