Calculer la distance entre les Codes postaux... ET les utilisateurs.

C'est plus une question de quelque chose que j'ai besoin de toute urgence, afin de ne pas passer toute la journée sur les gars.

J'ai construit un site de rencontres (disparu depuis longtemps) en 2000, et l'un des défis était de calcul de la distance entre les utilisateurs, de sorte que nous pourrions présenter votre "correspond" à l'intérieur d'un X mile radius. Simplement d'exposer le problème, compte tenu de la suite de schéma de base de données (environ):

TABLE UTILISATEUR
UserId
Nom d'utilisateur
Code postal

CODE POSTAL DE LA TABLE
Code postal
Latitude
Longitude

Avec l'UTILISATEUR et code POSTAL d'être rejoint sur l'UTILISATEUR.Cp = CP.Code postal.

Quelle approche vous prendre pour répondre à la question suivante: Quels sont les autres utilisateurs vivent dans des Codes postaux qui sont à moins de X km de l'utilisateur du Code Postal.

Nous avons utilisé le Données du recensement de 2000, qui a des tables de codes postaux et de leurs approximative de la latitude et de la longitude.

Nous avons également utilisé la Haversine Formule pour le calcul des distances entre deux points sur une sphère... assez simple math vraiment.

La question, au moins pour nous, être à l'âge de 19 ans, les étudiants du collège nous avons été, est vraiment devenu la façon la plus efficace de calculer et/store distances de tous les membres de tous les autres membres. Une approche (celui que nous avons utilisé) serait d'importer toutes les données et de calculer la distance DE chaque code postal POUR tous les autres code postal. Alors vous feriez stocker et indexer les résultats. Quelque chose comme:

SELECT  User.UserId
FROM    ZipCode AS MyZipCode
        INNER JOIN ZipDistance ON MyZipCode.ZipCode = ZipDistance.MyZipCode
        INNER JOIN ZipCode AS TheirZipCode ON ZipDistance.OtherZipCode = TheirZipCode.ZipCode
        INNER JOIN User AS User ON TheirZipCode.ZipCode = User.ZipCode
WHERE   ( MyZipCode.ZipCode = 75044 )
        AND ( ZipDistance.Distance < 50 )

Le problème, bien sûr, est que le ZipDistance table va avoir BEAUCOUP de lignes. Il n'est pas complètement impraticable, mais il est vraiment très grand. Aussi il nécessite de pré-travail sur l'ensemble du jeu de données, qui n'est pas ingérable, mais pas nécessairement souhaitable.

De toute façon, je me demandais ce que l'approche de certains gourous pourrait prendre quelque chose de ce genre. Aussi, je pense que c'est un problème commun des programmeurs s'attaquer de temps en temps, surtout si vous considérez les problèmes qui sont juste avec des algorithmes similaires. Je suis intéressé par une solution complète qui comprend au moins des CONSEILS sur tous les morceaux pour le faire très rapidement en fin de manière efficace. Merci!

InformationsquelleAutor Eric Burcham | 2010-10-21