Comment les adresses géographiques internationales soient stockées dans une base de données relationnelle?

StackOverflow https://stackoverflow.com/questions/1159756

  •  18-09-2019
  •  | 
  •  

Question

Étant donné la tâche de stocker les adresses géographiques internationales dans une table relationnelle, ce qui est le schéma le plus flexible? Au cas où toutes les parties de l'adresse être ventilés dans leurs propres champs, ou devrait-il être plus comme texte libre?

Y at-il sens à séparer l'adresse différemment formaté en différentes tables? Par exemple, une table pour USAAddress, CanadianAddress, UKAddress ...?

Était-ce utile?

La solution

Je vais résumer mes pensées de mon blog - Une leçon dans le stockage d'adresse .

Sur mon projet actuel [Je travaille pour une entreprise de logistique] nous sommes stocker des adresses internationales. Je l'ai fait des recherches sur les adresses partout dans le monde dans la conception de cette partie de la base de données. Il y a beaucoup de formats différents. Dans le monde occidental, nous avons tendance à utiliser un format assez uniforme - quelques différences, mais ils sont pour la plupart:

  • Numéro de rue - Numérique
  • Maison ou Nom du bâtiment - [VarChar - au Royaume-Uni quelques maisons / bâtiments sont identifiés par leur nom, et non par numéro]
  • Rue Numéro Suffixe [VarChar, bien que dans la plupart des cas, Char (1) suffirait]
    • A, B etc
  • Nom de la rue [VarChar]
  • Type de rue [VarChar ou Int si vous avez une table StreetTypes]
    • Jusqu'à présent, j'ai trouvé 262 types uniques dans le monde anglophone, il y a probablement plus, et ne pas oublier d'autres langues à savoir Strasse, rue etc.
  • Direction de la rue [VarChar (2)]
    • N, E, S, W, NE, SE, NW, SO
  • Type d'adresse [VarChar ou Int si vous avez une table AddressTypes]
    • PO Box
    • Appartement
    • Bâtiment
    • étage
    • Bureau
    • Suite
    • etc ...
  • Type d'adresse Identifier [VarChar]
    • i.e.. Box Nombre, Appartement Nombre, étage Nombre d'appartements se souvenir des numéros et des bureaux ont parfois informations alphanumériques - comme 1A
  • Municipalité locale [VarChar ou Int si vous avez une table de municipalités]
    • Par exemple, si votre hameau / village apparaît dans l'adresse avant la ville.
  • Ville / Ville [VarChar ou Int si vous avez une table Villes]
  • district d'administration [VarChar ou Int si vous avez une table de districts]
    • État (U.S.)
    • Province (Canada)
    • District fédéral (Mexique)
    • County (U.K.)
    • etc ...
  • Région postale [VarChar]
    • Zip (U.S.)
    • Code postal (Canada, Mexique)
    • Code postal (U.K.)
  • Pays [VarChar ou Int si vous avez une table de pays]

Cela semble couvrir la plupart des pays, mais l'ordre des champs peut être affiché différemment. Vous trouverez une liste des formats d'affichage à http: //www.bitboost. com / ref / adresse-formats.html-international # formats

Par exemple, dans de nombreux pays, le code postal tombe avant que le nom de la ville et le numéro de rue tombe après le nom de la rue. Au Canada, États-Unis et le R.U. le numéro de rue précède le nom de la rue et le code postal (ou ZIP) vient après le nom de la ville.

En réponse à votre question sur la séparation des adresses dans différents pays, je ne dirais pas, il sera tout simplement rendre la vie plus difficile dans d'autres domaines - par exemple des rapports. Le format que j'ai fourni couvre toutes les adresses dans notre base de données de la logistique qui couvre Etats-Unis, au Canada, au Mexique et au Royaume-Uni sans aucun problème. Il couvre également toutes nos adresses européennes, chinois, japonais et malaisiens. Je ne peux pas parler pour les autres pays, mais je ne l'ai pas encore eu à mémoriser une adresse d'un pays que ces champs ne supporteront pas.

Je ne suggère pas aller avec le Adresse1, Adresse2, le format Address3 suggéré par d'autres et vu dans de nombreuses bases de données, car l'analyse des informations d'adresse sur une chaîne alphanumérique n'est pas aussi simple qu'il n'y paraît - surtout si les données n » t est entré correctement, en raison de la désinformation, faute de frappe, etc. Si vous faute d'orthographe séparez vos champs, vous pouvez utiliser distaalgorithmes nce pour vérifier les sens, utiliser des probabilités pour vérifier le nom de la rue contre le code postal et numéro de rue ou de vérifier la province et la ville contre le nom de la rue, etc. Essayez de faire tout cela lorsque vous avez une chaîne indiquant toute votre adresse. Ce n'est pas une mince affaire, loin de l'imagination.

QA sur une base de données d'adresses est un mal de tête, période. La meilleure façon de vous simplifier la vie dans ce domaine est de vous assurer que tous les champs ne détiennent qu'une seule pièce d'information qui peut être automatiquement vérifiée comme correcte au moment de l'entrée. Probabilité, les algorithmes de distance et les expressions régulières peuvent vérifier la validité d'entrée et fournir une rétroaction à l'utilisateur à ce que leur erreur était et suggérer des corrections appropriées.

Une mise en garde à prendre en compte est les routes avec des noms qui sont aussi des types rue - si vous couvrez Canada, vous devez être au courant de « Avenue Road » à Toronto qui vous fera trébucher grand temps si vous utilisez la Adresse1, 2, 3 format. Cela se produit probablement dans d'autres endroits, même si je ne suis pas au courant d'entre eux - Cette seule instance me suffisait de crier WTF

Autres conseils

Veillez à ne pas trop analyser les formats d'adresse. Lorsque vous le faites, vous êtes tout à fait susceptibles de se retrouver avec une spécification la plupart des utilisateurs devront travailler autour , en les forçant à utiliser efficacement les champs mal, ou en remplissant uniquement les champs primaires et en ignorant les champs supplémentaires .

Gardez les choses simples.

A StreetType comme mentionné par BenAlabaster causera des problèmes lorsque vous commencez à travailler avec des langues différentes d'isoler langues comme l'anglais ou l'espagnol.

Pour vous montrer à quel point les choses peuvent obtenir dans la nature: la « Henriette Roland Holststraat » à Amsterdam, construit à partir de « Henriette » + « Roland Holst » + « straat », qui peut être abrégé en tant que « Roland Holststraat » ou "Roland Holststr.", ou mal orthographié comme "HRHolststr." ou "Henriette Roland-Holst straat", en fonction du temps. Sauf si vous avez une mise à jour registre de rue pour chaque pays sur la terre, vous allez aller nulle part.

Et enfin, veiller à ce que dans certains pays multilingues, les noms peuvent être différents d'une langue à une autre! Par exemple à Bruxelles, où de nombreuses rues ont à la fois un Français et un nom néerlandais: « Avenu du Port » et « Havenlaan », selon la langue préférée du destinataire. (Google Maps les deux noms montre tour à tour, juste pour être du bon côté.)

Vous pouvez essayer de concevoir toutes sortes de trucs intelligents, mais sont les représentants des ventes. va comprendre cela?

Cela dépend de ce que vous voulez faire.

Je l'ai trouvé toujours plus facile d'utiliser des adresses à d'autres fins (telles que la vérification par rapport aux données USPS ou d'obtenir des tarifs d'expédition de UPS / FEDEX) s'ils sont séparés.

Voici ce que j'utilise habituellement pour les adresses:

  • Adresse ligne 1
  • Adresse ligne 2
  • Adresse ligne 3
  • Ville
  • Région
  • Code postal
  • Comté
  • Pays

En réponse à la modifier: Pour la plupart des situations, je ne vois pas l'utilisation. Le tableau I énuméré ci-dessus a assez de champs (et est assez générique) pour les adresses de la plupart des pays.

Adresse

En face polaire à l'excellente @BenAlabaster de réponse a fourni, vous pouvez simplement avoir:

address       TEXT(300)
postal_code   VARCHAR(15)
country_code  VARCHAR(2)

Vos mises en page de formulaire côté client peut encore être aussi complexe que bon vous semble (ou utilisez une entrée multi-ligne où l'utilisateur peut saisir manuellement leur adresse). Vous pouvez ensuite ajouter les sauts de ligne dans l'adresse si nécessaire.

Pays

Votre table de pays regarderait comme suit:

country_code  VARCHAR(2)
country_name  VARCHAR(255)

De plus, vous pourriez avoir un des éléments suivants:

postal_code_required  TINYINT(1)
postal_code_regex     VARCHAR(255) NULL DEFAULT NULL

Ensuite, utilisez les listes suivantes pour concevoir votre table de pays:

Voici une anecdote pour tous ceux qui trébuche sur cette question:

Je parle en tant que personne qui a vécu et travaillé sur beaucoup de continents (Europe, Asie, Amérique du Nord). Dans mon expérience, et l'expérience des gens avec lesquels je travaille, il a été beaucoup plus facile pour nous d'utiliser des systèmes qui suit:

  1. Fournir trois lignes dans lesquelles je tapera une adresse. Passer ces trois lignes à votre service postal local que je les saisis, mot pour mot. Permettez-moi d'utiliser un ensemble de caractères que je veux; utiliser UTF-8 ou quelque chose de mieux.
  2. Si votre système a des exigences d'affaires qui ont besoin de moi pour indiquer des informations particulières (telles que le code postal, préfecture, état, etc.), demander que séparément. Par besoins d'affaires, je veux dire des choses comme l'analyse; ces éléments d'information ne doivent pas être partagés avec votre service postal local (à moins que je aussi écrire par hasard les mêmes informations dans l'une des trois lignes du point 1, ci-dessus).
  3. Avoir un menu déroulant qui me demande de spécifier l'emplacement catégorique d'adresse que je fournis dans les lignes de point 1 ci-dessus, peut-être pays.
  4. Si vous devez analyser les renseignements fournis dans les lignes de point 1, utilisez ma réponse au point 3 pour sélectionner regex. Exécuter que regex contre les informations contenues dans le point 1 pour l'analyser. Essayez de remplir les éléments d'interface utilisateur du point 2 en utilisant la sortie de votre regex. Si je raison que les informations autofilled - utiliser le fait que je l'ai changé pour améliorer votre regex. De même, autant que possible, me donner l'occasion d'examiner et de corriger la sortie de votre regex:. Personne ne sait mieux ce que je voulais communiquer que moi

Systèmes construits comme ça, je trouve, rendent ma vie plus facile. En particulier, quand je suis l'envoi de courrier à un système postal dont votre entreprise a pratiquement aucune connaissance interne fonctionnelle.

Si votre entreprise ne dispose des connaissances internes sur les systèmes postaux particuliers, utilisez ma sélection au point 3 pour informer que vous me voir afficher. Beaucoup de gens savent ce que le système postal américain attend sur l'emballage; si je sélectionne US au point 3, ne hésitez pas à faire le point de vue semble approprié pour une adresse américaine. Si je sélectionne un pays dont votre entreprise ne sait rien - afficher un trois lignes génériques et laissez-moi faire le reste; ne me forcez pas à utiliser ASCII.

Et soyons réalistes ici - la construction d'une complète, la base de données encyclopédique de tous les systèmes postaux mondiaux (publics et privés) est une tâche herculéenne au mieux, si pas impossible. Il existe, par exemple, les systèmes postaux dans lequel seul le transporteur local, dernier-mile sait vraiment où une adresse est située. Parfois, être en mesure de passer des notes à ce transporteur sur l'emballage est extrêmement utile. Et cartographier les connaissances locales de chaque support de boîtier de bord dans votre base de données est en effet une tâche impossible.

Il suffit de demander Gödel. (Et puis demandez-vous si vous essayez d'utiliser un système axiomatique pour modéliser un univers du discours, donner ou prendre une sorte de l'arithmétique comme la théorie des ensembles ou l'algèbre relationnelle.)

Commentaire de la réponse de Ben Albâtre: Pour formater les adresses en fonction du pays, vous pouvez utiliser une table de mise en forme qui a l'ordre des colonnes pour chaque pays sous forme de lignes séparées.

  • AddressFormat (CountryCode, FieldName, FieldOrder)

L'ordre des champs peut être codé à utiliser des mises en réseau complexes aussi.

Il n'y a pas de point à séparer les adresses par pays. Ce sera chaotique que le nombre de pays augmente et vous atterrira en difficulté si vous voulez trouver toutes les adresses de mot, un client international. Avoir un type d'adresse suggérée par Ben pourrait également conduire à des ambiguïtés lorsque vous avez une adresse qui a à la fois un numéro de bâtiment et un numéro d'appartement. Je pourrais être dans un complexe d'appartements où chaque bâtiment a un nom différent. Ceci est très fréquent en Inde.

J'utilise https://github.com/commerceguys/addressing bibliothèque pour formater les adresses internationales et ils utiliser ces éléments:

Country
Administrative area
Locality (City)
Dependent Locality (in: BR, CN, IR, MY, MX, NZ, PH, KR, ZA, TH)
Postal code
Sorting code
Address line 1
Address line 2
Organization
Recipient

Cette aide doen't si vous voulez analyser la rue (nom, numéro de la maison, ...).

BTW. si vous êtes à la recherche d'une liste de pays multilangue: https://github.com/umpirsky/country-list

La seule façon est de les diviser à:

Name varchar,
Title varchar,
StreetAddress varchar,
StreetAddressLine2 varchar,
zipCode varchar,
City varchar,
Province varchar,
Country lookup

depuis presque tous les pays a sa propre norme pour avoir des données d'adresse, et le pays Evey a un format différent de codes postaux.
Vous pouvez avoir un petit échantillon de problèmes dans mon post d'une question similaire.

Cela ne devrait pas donner un sens à des adresses distinctes pour tous les pays, car il y a des pays où vous avez quelques conventions d'adresse. Certaines conventions populaires comprennent ne pas avoir rues dans de petits villages, seulement le nom du village et le nombre, alors que les rues sont dans les adresses des plus grandes villes. J'ai appris que dans la capitale de la Hongrie - Budapest, il y a peu de rues portant le même nom (vous distingue les par le numéro du district de la ville), alors que d'autres villes ne sont pas ces adresses (une personne de Hongrie peut effectivement confirmer que cela est vrai). Ainsi, le nombre total de formats d'adresse sera numer_of_countries multiplié par le nombre de formats d'adresse dans ce pays ... Peut être fait avec des tables différentes, mais ce sera le travail horrible à faire.

Je sais que c'est un sujet très ancien qui est déjà répondu, mais je pensais que je jetterais mes deux cents aussi bien. Tout dépend de ce que vos objectifs du projet et la façon dont vous vous attendez à vos utilisateurs cibles pour entrer les adresses. La suggestion de Ben vous permettra d'analyser avec précision les adresses, mais d'autre part pourrait faire pour une plus longue (et peut-être plus frustrant) processus de saisie des données utilisateur. La suggestion de Stephen Wrighton est plus simple, et pourrait être plus facile pour les utilisateurs d'entrer des adresses en conséquence.

Je l'ai vu aussi certains modèles qui avaient simplement une colonne « Adresse » qui capturerait un nombre typique de la rue, le type, le nom de la rue, l'unité / numéro d'appartement, etc. en une seule colonne, tout en gardant Ville, Pays, Région , etc. dans les autres colonnes. Similaire au modèle de Stephen, à l'exception Adresse1, Address2 et Address3 toutes consolidées en une seule colonne.

Mon opinion est que les modèles les plus flexibles ont tendance à être ceux qui sont moins restrictives, selon votre interprétation de flexibilité.

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