Meilleures pratiques pour stocker les adresses postales dans une firebase database (SGBDR)?

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

Les exemples de compromis dont je parle sont le stockage du code postal sous la forme d’un nombre entier par rapport à un champ de caractères, si le numéro de maison est stocké dans la ligne 1, les numéros de suite / appartement / etc. 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 des États-Unis à ce stade, mais j’imagine qu’il existe certaines bonnes pratiques pour se préparer à l’éventualité d’une mondialisation (par exemple, nommer des champs comme une région au lieu d’un code postal au lieu d’un code postal). etc.

Pour un usage plus international, un schéma à prendre en compte 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 creuser dans ce module révélera quelques belles perles pour interpréter et valider les adresses à l’échelle internationale. Il possède également un ensemble de zones administratives (province, État, oblast, etc.) avec des codes ISO.

Voici l’essentiel du schéma, copié depuis 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 / Dissortingct (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) 

Des leçons que j’ai apsockets:

  • Ne stockez rien numériquement.
  • Stocker le pays et la zone administrative en tant que codes ISO lorsque cela est possible.
  • Lorsque vous ne savez pas, ne soyez pas trop exigeant en ce qui concerne les champs. Certains pays peuvent ne pas utiliser les champs que vous prenez pour acquis, même les choses de base comme la locality et la thoroughfare .

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

Si vous êtes concerné par la mondialisation, le seul conseil que je puisse vous donner est de garder la forme libre. 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 cas, il vient après. Certains ont des États, des régions, des comtés, des combinaisons de ceux-ci. Ici, au Royaume-Uni, le code postal n’est pas un code postal, mais un code postal contenant à la fois des lettres et des chiffres.

Je conseille simplement 10 lignes de chaînes de longueur variable, ainsi qu’un champ séparé pour un code postal (et soyez attentif à la façon dont vous décrivez cela pour faire face aux sensibilités nationales). Laissez l’utilisateur / client décider comment écrire ses adresses.

Si vous avez besoin d’informations complètes sur la façon dont les autres pays utilisent les adresses postales, voici un très bon lien de référence (Université Columbia):

Guide compulsif de Frank pour les adresses postales
Adressage efficace pour le courrier international

Vous devriez certainement envisager de stocker le numéro de maison comme un champ de caractère plutôt qu’un nombre, en raison de cas particuliers tels que les “demi-numéros” ou mon adresse actuelle, quelque chose comme “129A” ​​- mais le A n’est pas considéré comme un appartement nombre de services de livraison.

Je l’ai fait (modéliser rigoureusement les structures d’adresses dans une firebase database) et je ne le ferais plus jamais. Vous ne pouvez pas imaginer à quel point les exceptions doivent être sockets en compte.

Je me souviens vaguement d’un problème avec les codes postaux norvégiens (je pense), qui étaient tous les 4 postes, à l’exception d’Oslo, qui en comptait 18 environ.

Je suis persuadé qu’à partir du moment où nous avons commencé à utiliser les codes postaux géographiquement corrects pour toutes nos adresses nationales, plusieurs personnes ont commencé à se plaindre que leur courrier était arrivé trop tard. Il s’est avéré que ces personnes vivaient à proximité des zones postales et que, même si une personne vivait vraiment dans une zone postale, par exemple 1600, son courrier devrait en réalité être envoyé à la zone postale 1610, car en réalité cela lui a réellement servi, alors envoyer son courrier dans sa zone postale correcte prendrait ce courrier quelques jours de plus pour arriver, à cause de l’intervention indésirable requirejse dans le bon bureau de poste pour le transférer dans la zone postale incorrecte …

(Nous avons fini par enregistrer les personnes ayant une adresse à l’étranger dans le pays avec le code ISO «ZZ».)

À moins que vous ne fassiez des calculs sur les numéros de rue ou les codes postaux, vous ne faites qu’inviter à souffrir en les stockant sous forme numérique.

Vous pouvez économiser quelques octets ici et là, et peut-être obtenir un index plus rapide, mais que décidez-vous lorsque US postal, ou quel que soit le 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…

Vous devriez certainement consulter ” Est-ce un bon moyen de modéliser les informations d’adresse dans une firebase database relationnelle “, mais votre question ne constitue pas une réplique directe.

Il y a sûrement beaucoup de réponses préexistantes (consultez les exemples de modèles de données dans DatabaseAnswers , par exemple). Un grand nombre des réponses préexistantes sont défectueuses dans certaines circonstances (ne pas sélectionner les réponses DB).

Un problème majeur à considérer est la scope des adresses. Si votre firebase database doit traiter des adresses internationales, vous devez être plus flexible que si vous n’avez à traiter que des adresses dans un pays.

À mon avis, il est souvent judicieux (ce qui ne signifie pas toujours ) d’enregistrer à la fois l’image d’étiquette d’adresse de l’adresse et d’parsingr 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 parsingur et un formateur qui traitent les excensortingcités de différents pays (par exemple, les adresses américaines ont 2 ou 3 lignes; en revanche, les adresses britanniques peuvent en contenir beaucoup plus). Mais il peut être plus facile de faire l’parsing et le formatage par les humains et de laisser le SGBD stocker les données.

En ajoutant à ce que @ Jonathan Leffler et @ Paul Fisher ont dit

Si vous prévoyez avoir des adresses postales pour le Canada ou le Mexique ajoutées à vos exigences, le stockage du postal-code tant que chaîne est indispensable. Le Canada a des codes postaux alphanumériques et je ne me rappelle plus à quoi ressemble le Mexique.

J’ai trouvé que la liste la plus simple était de lister tous les champs possibles de la plus petite unité discrète à la plus grande. Les utilisateurs rempliront les champs qui leur conviennent. Ma table d’adresses ressemble à ceci:

 ********************************* Field Type ********************************* address_id (PK) int unit ssortingng building ssortingng street ssortingng city ssortingng region ssortingng country ssortingng address_code ssortingng ********************************* 

Où est le “compromis” dans le stockage du ZIP en tant que 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 vous devez renoncer à certains avantages pour en obtenir d’autres.

À moins que la sum des zips ait un sens, Zips comme numéro n’est pas utile.

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 un traitement d’adresse spécifique à un pays à l’aide de deux tables: Une table générique avec 10 colonnes VARCHAR2, 10 colonnes Nombre, une autre table qui associe ces champs aux invites et une colonne de pays liant une structure d’adresse à un pays.

Si vous devez vérifier une adresse ou l’utiliser pour traiter les 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 commun permettant de valider les transactions par carte de paiement sans utiliser l’adresse complète. Ayez donc un champ séparé et de taille généreuse pour cela (au moins 10 caractères).

Inspiré par des réponses de firebase database

 Line1 Line2 Line3 City Country_Province PostalCode CountryId OtherDetails 

Je voudrais simplement regrouper tous les champs dans un grand champ NVARCHAR (1000), avec un élément textarea pour que l’utilisateur puisse saisir la valeur (sauf si vous souhaitez effectuer une parsing sur, par exemple, les codes postaux). Toutes ces entrées ligne 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).