Meilleures pratiques pour stocker les adresses postales dans une base de données (SGBDR)?

106

Existe-t-il de bonnes références pour les meilleures pratiques de stockage des adresses postales dans un SGBDR? Il semble qu'il y ait beaucoup de compromis à faire et de nombreux avantages et inconvénients à évaluer pour chacun - cela a sûrement été fait maintes et maintes fois? Peut-être que quelqu'un a au moins écrit des leçons apprises quelque part?

Des exemples de compromis dont je parle sont le stockage du code postal sous forme d'entier par rapport à un champ de caractères, si le numéro de maison est stocké comme un champ séparé ou une partie de la ligne d'adresse 1, si les numéros de suite / appartement / etc doivent être normalisés ou simplement stockés sous forme de morceau de texte dans la ligne d'adresse 2, comment gérez-vous zip +4 (champs séparés ou un grand champ, entier vs texte)? etc.

Je suis principalement préoccupé par les adresses américaines à ce stade, mais j'imagine qu'il existe certaines meilleures pratiques pour vous préparer à l'éventualité de devenir mondial également (par exemple, nommer les champs de manière appropriée comme la région au lieu de l'état ou le code postal au lieu du code postal, etc.

John
la source
3
Dès le départ, le zip doit être un champ char - sinon certains codes postaux commençant par 0 deviendraient inexacts.
Menasheh
1
En règle générale, lorsque vous devez faire des calculs mathématiques avec le nombre, ce doit être un nombre entier. Si vous ne l'affichez que, cela devrait être char (téléphone, code postal, etc.)
Zikato

Réponses:

37

Pour une utilisation plus internationale, un schéma à considérer est celui utilisé par Drupal Address Field . Il est basé sur la norme xNAL et semble couvrir la plupart des cas internationaux. Un peu de fouille dans ce module révélera de belles perles pour interpréter et valider les adresses à l'international. Il a également un bel ensemble de zones administratives (province, état, oblast, etc.) avec des codes ISO.

Voici l'essentiel du schéma, copié à partir de la page du module:

country => Country (always required, 2 character ISO code)
name_line => Full name (default name entry)
first_name => First name
last_name => Last name
organisation_name => Company
administrative_area => State / Province / Region (ISO code when available)
sub_administrative_area => County / District (unused)
locality => City / Town
dependent_locality => Dependent locality (unused)
postal_code => Postal code / ZIP Code
thoroughfare => Street address
premise => Apartment, Suite, Box number, etc.
sub_premise => Sub premise (unused)

Une des leçons que j'ai apprises:

  • Ne stockez rien numériquement.
  • Enregistrez le pays et la zone administrative sous forme de codes ISO si possible.
  • Lorsque vous ne savez pas, soyez laxiste sur les champs obligatoires. Certains pays peuvent ne pas utiliser des champs que vous tenez pour acquis, même des éléments de base comme locality& thoroughfare.
Samm Cooper
la source
1
Puis-je demander à quoi sert "name_line"? Je ne trouve pas vraiment d'explication dans les Drupal Docs ou xNal Standard. Comment je le comprends, le nom_line sert à envoyer de vraies lettres ou des colis par courrier. Le prénom / nom n'est nécessaire que si vous souhaitez vous adresser directement au client, par exemple par e-mail ("Cher Monsieur <last_name>"). Ou y a-t-il un autre but / avantage?
luba
Lors de la livraison dans de (grands) locaux commerciaux, un nom est souvent nécessaire pour le système de distribution du courrier interne (pensez aux immeubles de bureaux avec salles de courrier)
Chris Browne
Le champ d'adresse a été remplacé par l' adresse . On dirait que les champs pourraient être un peu différents
Gavin Haynes
24

En tant qu'utilisateur «international», il n'y a rien de plus frustrant que de traiter avec un site Web orienté uniquement vers des adresses au format américain. C'est un peu impoli au début, mais devient un problème sérieux lorsque la validation est également trop zélée.

Si vous souhaitez devenir mondial, le seul conseil que j'ai est de garder les choses libres. Différents pays ont des conventions différentes - dans certains, le numéro de la maison vient avant le nom de la rue, dans certains il vient après. Certains ont des États, certaines régions, certains comtés, certaines combinaisons de ceux-ci. Ici au Royaume-Uni, le code postal n'est pas un code postal, c'est un code postal contenant à la fois des lettres et des chiffres.

Je conseillerais simplement ~ 10 lignes de chaînes de longueur variable, avec un champ séparé pour un code postal (et faites attention à la façon dont vous le décrivez pour faire face aux sensibilités nationales). Laisser l'utilisateur / client décider comment écrire ses adresses.

Andrew Ferrier
la source
Pour ce que ça vaut, ce n'est pas pour un site Web, mais le point sur les adresses internationales est toujours bien compris.
John
47
Bien que je ne sois pas en désaccord avec le message, et en fait je vous félicite pour la position que vous adoptez, j'ai dû vous rejeter parce que je déteste le fait en tant que personne qui passe la grande majorité de mon temps à écrire des outils pour nettoyer les données d'adresse. de stockage des données d'adresse dans un format de forme libre. Les adresses peuvent être formatées différemment, mais les données sont toujours largement les mêmes. Le fait qu'un numéro de rue soit affiché avant ou après le nom de la rue n'a en grande partie aucune importance à des fins de stockage - uniquement à des fins d'affichage.
BenAlabaster
17

Vous devriez certainement envisager de stocker le numéro de la maison sous forme de champ de caractères plutôt que de nombre, en raison de cas particuliers tels que "demi-nombres", ou mon adresse actuelle, qui est quelque chose comme "129A" ​​- mais le A n'est pas considéré comme un appartement numéro pour les services de livraison.

Paul Fisher
la source
11

Je l'ai fait (modéliser rigoureusement les structures d'adresses dans une base de données), et je ne le referais plus jamais. Vous ne pouvez pas imaginer à quel point les exceptions sont folles que vous devrez prendre en compte en règle générale.

Je me souviens vaguement d'un problème avec les codes postaux norvégiens (je pense), qui étaient tous les 4 positions, sauf Oslo, qui en avait 18 environ.

Je suis convaincu qu'à partir du moment où nous avons commencé à utiliser les codes postaux géographiquement corrects pour toutes nos propres adresses nationales, un bon nombre de personnes ont commencé à se plaindre que leur courrier arrivait trop tard. Il s'est avéré que ces personnes vivaient près d'une frontière entre les zones postales, et malgré le fait que quelqu'un vivait vraiment dans la zone postale, disons 1600, en réalité, son courrier devrait être adressé à la zone postale 1610, car en réalité c'était cette zone postale voisine. qui le servait réellement, donc envoyer son courrier à sa bonne zone postale prendrait quelques jours de plus pour arriver à ce courrier, en raison de l'intervention indésirable qui était nécessaire dans le bon bureau de poste pour le transmettre à la mauvaise zone postale ...

(Nous avons fini par enregistrer ces personnes avec une adresse à l'étranger dans le pays avec le code ISO `` ZZ ''.)


la source
8

Vous devriez certainement consulter " Est-ce un bon moyen de modéliser les informations d'adresse dans une base de données relationnelle ", mais votre question n'en est pas une copie directe.

Il y a sûrement beaucoup de réponses préexistantes (consultez les exemples de modèles de données sur DatabaseAnswers , par exemple). Bon nombre des réponses préexistantes sont défectueuses dans certaines circonstances (pas du tout de sélection sur DB Answers).

Un problème majeur à considérer est la portée des adresses. Si votre base de données doit traiter des adresses internationales, vous devez être plus flexible que si vous ne devez traiter que des adresses dans un seul pays.

À mon avis, il est souvent (ce qui ne veut pas dire toujours ) judicieux à la fois d'enregistrer «l'image d'étiquette d'adresse» de l'adresse et d'analyser séparément le contenu. Cela vous permet de gérer les différences entre le placement des codes postaux, par exemple, entre différents pays. Bien sûr, vous pouvez écrire un analyseur et un formateur qui gèrent les excentricités de différents pays (par exemple, les adresses américaines ont 2 ou 3 lignes; en revanche, les adresses britanniques peuvent en avoir beaucoup plus; une adresse à laquelle j'écris périodiquement a 9 lignes). Mais il peut être plus facile de demander aux humains de faire l'analyse et le formatage et de laisser le SGBD stocker simplement les données.

Jonathan Leffler
la source
7

À moins que vous ne fassiez des calculs sur les numéros de rue ou les codes postaux / postaux, vous invitez simplement à la douleur future en les stockant sous forme de chiffres.

Vous pourriez économiser quelques octets ici et là, et peut-être obtenir un index plus rapide, mais que faites-vous lorsque la poste américaine, ou tout autre pays avec lequel vous traitez, décide d'introduire des alphas dans les codes?

Le coût de l'espace disque sera beaucoup moins cher que le coût de sa réparation plus tard ... y2k quelqu'un?

seanb
la source
7

En plus de ce que @ Jonathan Leffler et @ Paul Fisher ont dit

Si jamais vous prévoyez d'ajouter des adresses postales pour le Canada ou le Mexique à vos besoins, le stockage postal-codesous forme de chaîne est un must. Le Canada a des codes postaux alphanumériques et je ne me souviens pas de ce à quoi ressemble le Mexique.

Ken Gentle
la source
7

J'ai trouvé que lister tous les champs possibles, de la plus petite unité discrète au plus grand, est le moyen le plus simple. Les utilisateurs rempliront les champs qui leur conviennent. Ma table d'adresses ressemble à ceci:

*********************************
  Field              Type
*********************************
  address_id (PK)    int
  unit               string
  building           string        
  street             string
  city               string
  region             string
  country            string
  address_code       string
*********************************
Gaz_Edge
la source
Comment stockez-vous les boîtes postales?
Jowen
ajoutez simplement une autre colonne PO_box Si vous devez le faire rétrospectivement, cela signifie qu'aucune des adresses précédentes n'a besoin d'une boîte postale, donc elle peut être définie sur null
Gaz_Edge
2

Où est le "compromis" dans le stockage du ZIP sous forme de NUMBER ou VARCHAR? C'est juste un choix - ce n'est pas un compromis à moins qu'il y ait des avantages pour les deux et que vous deviez renoncer à certains avantages pour en obtenir d'autres.

À moins que la somme des zips n'ait de sens, les zips en tant que nombre ne sont pas utiles.


la source
Un compromis pourrait être la taille de la base de données. Dans mysql 5, une ligne mediumint ne prendrait que 3 octets par ligne alors qu'un varchar (5) en prendrait deux fois plus. Je pensais aussi que les recherches numériques étaient plus rapides que les recherches textuelles, mais je ne suis pas sûr de cela.
gpojd
4
il faut utiliser un varchar. Le code postal canadien utilise un codage alphanumérique, qui ne rentre pas bien dans un nombre.
EvilTeach
1
Bien que je comprenne la logique «compatible vers l'avant» derrière l'utilisation de varchar dans ce sens, l'affirmation selon laquelle «zips en tant que nombre n'est pas utile» est un peu trop dogmatique. Si vous savez que vous allez travailler avec des codes postaux uniquement aux États-Unis, il est logique de stocker les codes postaux sous forme d'entiers, tout comme lorsque vous écrivez dans une langue strictement typée, vous ne définissez pas tout comme type String ... Si vous sachez que ça va être un nombre, pourquoi ne pas s'appuyer sur la vérification de type de la base de données / langage de programmation et l'appeler ce que c'est - un entier?
rinogo
1
@rinogo un argument pour utiliser varchar est que les codes postaux ne sont pas numériques au sens mathématique; cela n'a pas de sens de faire une addition ou une soustraction sur eux; ils sont simplement codés avec un jeu de caractères restreint. stackoverflow.com/a/893489/48659
Steve Folly
1
@SteveFolly Et en plus de la prise en charge des codes postaux en tant que chaînes, les caractères principaux ont une signification particulière: en.wikipedia.org/wiki/ZIP_Code#Primary_state_prefixes Si l'on va implémenter une logique comme "quels sont les caractères les plus à gauche de la valeur ? " alors cela ressemble plus à une chaîne qu'à un entier.
David Aldridge
2

Cela peut être excessif, mais si vous avez besoin d'une solution qui fonctionnerait avec plusieurs pays et que vous devez traiter par programme des parties de l'adresse:

vous pouvez avoir une gestion des adresses spécifiques au pays à l'aide de deux tables: une table générique avec 10 colonnes VARCHAR2, 10 colonnes Number, une autre table qui mappe ces champs à des invites et a une colonne country liant une structure d'adresse à un pays.

Shanmu
la source
J'ai en fait considéré cela moi-même. En plus, ou peut-être à la place d'un tableau qui mappe les colonnes à des invites basées sur le pays, je pensais créer des vues modifiables pour chaque format d'adresse spécifique. Je n'ai pas encore appuyé sur la gâchette, mais j'y ai pensé.
Andrew Steitz
1

Si jamais vous devez vérifier une adresse ou l'utiliser pour traiter des paiements par carte de crédit, vous aurez au moins besoin d'une petite structure. Un bloc de texte de forme libre ne fonctionne pas très bien pour cela.

Le code postal est un champ facultatif courant pour valider les transactions par carte de paiement sans utiliser l'adresse complète. Ayez donc un champ séparé et généreusement dimensionné pour cela (au moins 10 caractères).

Ted Bigham
la source
-1

Je voudrais simplement mettre tous les champs ensemble dans un grand champ NVARCHAR (1000), avec un élément textarea pour que l'utilisateur entre la valeur (à moins que vous ne souhaitiez effectuer une analyse sur, par exemple, les codes postaux). Toutes ces entrées de ligne d'adresse 1, ligne d'adresse 2, etc. sont tellement ennuyeuses si vous avez une adresse qui ne correspond pas bien à ce format (et, vous savez, il y a d'autres pays que les États-Unis).

Erikkallen
la source
3
Quelle horrible idée! Il n'y a pas assez d'espace dans un "Commentaire" pour décrire le cauchemar que cela invite. Mieux vaut passer un peu plus de temps à le concevoir correctement que d'essayer de démêler le désordre par la suite. Voir la réponse de Samm Cooper. Je pense que je n'ai voté contre une seule autre réponse ici sur SO, mais celle-ci a certainement mérité un vote contre moi.
Andrew Steitz
Quel gâchis? Pourquoi avez-vous besoin des données? Souvent, vous n'en avez besoin que pour le transmettre directement à une imprimante d'étiquettes ou similaire, puis vous pouvez simplement le traiter comme une goutte de texte. D'autres fois, vous pourriez vous soucier des villes et des codes postaux (mais vous feriez mieux de vous assurer que vous n'avez que des clients dans les pays pris en charge alors)
erikkallen
2
OP n'a pas mentionné "seulement avoir besoin de le transmettre à une imprimante d'étiquettes" et à chaque travail que j'ai jamais eu, nous avons utilisé l'adresse comme "données", en exécutant des rapports, en collectant les taxes (taxe de vente du Colorado pour les appareils mis dans une nouvelle maison varient d'un côté de la rue à l'autre), attribuant des prospects aux vendeurs, satisfaisant aux exigences de conformité du gouvernement, la liste s'allonge encore et encore. "Détruire" des données (en écrasant des éléments distincts dans un champ ou en ne capturant pas les données disponibles) est un "péché" dans mon livre et s'est toujours avéré être le cauchemar dont je mettais en garde lorsque les gens m'ignoraient.
Andrew Steitz
Si vous découvrez par la suite que vous n'avez pas besoin d'une donnée, vous pouvez toujours la "détruire" plus tard. "Créer" des données, va du cauchemar (diviser les informations en champs séparés) à l'impossible (capturer des données après coup). Si l'OP avait dit, "il suffit de l'envoyer à l'imprimante d'étiquettes", j'aurais applaudi et voté à la hausse votre réponse. Cependant, sans mention spécifique de quelque chose comme ça, une suggestion de "détruire" des données, l'OMI, est au bord de l'irresponsabilité ou même de la méchanceté.
Andrew Steitz
Là où j'ai travaillé (principalement le commerce électronique), nous avons tendance à les stocker dans 5 à 6 champs différents, mais nous ne faisons jamais, jamais, quoi que ce soit d'autre avec les informations que de les envoyer à la livraison.
erikkallen