web-dev-qa-db-fra.com

Normalisation des adresses postales aux États-Unis (adresse, comté, ville, état, code postal)?

J'ai essayé de comprendre ces dernières années de notre façon de stocker des adresses. J'ai obtenu "normaliser tout le chemin" mais aussi "dénormaliser autant que tu peux" et je ne peux tout simplement pas me donner la tête pour décider de ce qui est bon pour mon projet.

Bientôt, mon projet impliquerait de nombreux utilisateurs (100K +) et tous les utilisateurs disposeront de 1 à 3 adresses stockées (personnelles, commerciales et facturation). Cela signifie que je peux avoir 100k + * 3 enregistrements pour les adresses. En outre, je vais faire beaucoup de regards par code postal (obtenir des utilisateurs qui ont des adresses enregistrées dans un code postal). Je n'aurai que des adresses américaines.

Je suis content des tables d'adresses de l'utilisateur et de leur relation pour mon projet. Cependant, les tables sans relations sont ce qui me motive des noix.

(Mes tables affichées dans l'image sont comme ça pour que je reçois une meilleure vue sur ce dont j'ai besoin et comment faire. Je sais qu'il y a beaucoup de champs redondants alors s'il vous plaît ne les prenez pas comme elles sont.)

Quelqu'un a-t-il des conseils sur la manière dont cela devrait-il être conçu?
[.____] Est-ce que quelqu'un a un lien ou quelque chose à un schéma ou un schéma similaire de quelles grandes entreprises utilisent (UPS, USPS, etc.)?

enter image description here

5
Cristian

Je pense que la réponse de Datagod est bonne, mais je le modifierais un peu basé sur vos exigences énoncées:

Table d'adresse

AddressLine1 varchar(255) -- If using SQL Server I would go with NVARCHAR instead. You don't seem to need unicode support but why not support it since things will often be converted to unicode in the application layer by default anyway, and storage is cheap.
AddressLine2 varchar(255)
City varchar(50)
ZipCodeID int -- FK to PostalCode table
County varchar(50)
State      varchar(50)

Comme vous pouvez le voir, ma recommandation est très similaire à celle de @ Datagnood. J'ai changé deux choses:

  1. Je me suis débarrassé du Country FK depuis que vous avez déclaré que vous n'avez besoin que d'adresses pour les États-Unis.
  2. J'ai fait ZipCode/PostalCode un fk. Je pense que cela vous permettra d'indexer des codes postaux plus efficacement.

En outre, j'ai l'impression que vous n'avez pas besoin de télécharger une liste maître externe des codes postaux, à moins que vous souhaitiez utiliser cette liste à des fins de validation des données ... Vous pouvez vérifier si ce code postal existe lorsque l'adresse est insérée et l'insère dans le Table de code postal si cela n'existe pas. Cela ajoutera des frais généraux sur insert, mais je ne pense pas que ce sera si bien que des codes postaux communs seront insérés assez rapidement.

Si vous allez déplacer International, j'ajouterais certainement la table Country comme suggéré par @DaTagod.

Normaliser la base de données jusqu'à la cite/comtés/rues, etc. Cela semble être exceptionnel pour moi à ce stade, à moins que l'un des éléments suivants ne s'applique:

  • Vous vous trouvez souvent interrogé par ces points de données et profiterais des index/normalisation
  • Vous devez faire une sorte de sécurité basée sur une région, c'est-à-dire que les ventes situées à Atlanta ne peuvent accéder à des informations en dehors de ces trois comtés.
  • Vous souhaitez utiliser ces listes comme validation de données pour vous assurer que les personnes ne vous donnent pas de mauvaises données. (Cela semble être un désordre à mettre en oeuvre, en fonction de la distance de votre choix.)
  • Une autre raison pour laquelle je n'ai pas pensé à cela rend une normalisation supplémentaire pour vous faciliter la vie.

Je n'ai pas l'expérience de @ Datagnon avec des millions d'enregistrements d'adresse, alors que mon conseil pourrait être clair, mais c'est l'approche que je prendrais.

Edit : Deux réponses sont désormais normalisant le code postal maintenant, donc je pourrais négliger un point de douleur parce que je ne l'ai pas vécu.

1
Erik

Je traite de millions d'adresses internationales existantes. La conception suivante fonctionne pour mon projet:

Table d'adresse

AddressLine1 varchar(255)
AddressLine2 varchar(255)
City varchar(50)
PostalCode varchar(20)
State      varchar(50)
CountryID  int  (FK to Country table)

Évitez la tentation de normaliser les codes postaux et les états, sauf si vous avez vraiment une liste principale mise à jour fréquemment.

Les pays sont plus faciles à gérer, ils appartiennent donc à leur propre table de recherche. liste maîtres peut être trouvé en ligne facilement.

3
datagod

J'ai essayé un moment pour normaliser les codes postaux, et cela ne fonctionne pas vraiment, car il peut y avoir plusieurs codes postaux pour une ville. Ainsi, alors que vous pouvez normaliser la ville et l'état, le code postal doit juste être mis dans la table.

Je suppose que vous pourriez normaliser sur la ville + code postal, de telle sorte que vous pourriez avoir une table avec quelque chose comme 1 | "Indianapolis 46422", et 2 | "Indianapolis 46421" dedans.

Ce que vous devez regarder, cependant, est le coût vs bénéfice. Croyez-moi, je suis un gros stickler pour les bases de données 3NF dans ma boutique, mais la normalisation basée sur la ville et le code postal serait si fastidieuse que je peux percevoir aucun avantage qui l'emporterait sur le coût.

2
stubsthewizard

Pour ce que cela vaut, l'USPS dispose de bases de données disponibles qui peuvent être utilisées pour désabiguimer et vérifier les adresses de ce pays - que les codes postaux couvrent quelles villes dans lesquelles l'État, dans laquelle existent les rues (et les adresses de rue) dans chaque code postal, jusqu'à présent. à quel côté de la rue l'adresse est allumée et dans laquelle le bloc, et ces jours probablement une approximation lat/longue. Il s'agit des sociétés de base de données utilisées pour vérifier les adresses postales et font partie des informations que les systèmes de mappage tels que les unités GPS de la voiture utilisent pour déterminer où une adresse est réellement.

Je ne sais pas si ces données sont disponibles gratuitement, ou s'il y a des frais d'achat et de la mise à jour; La dernière fois que j'ai regardé cela, ils étaient toujours la postaux sur des cassettes et, évidemment, les économies sont très différentes maintenant. Ce n'était pas trop cher, même alors; L'USPS ne veut pas vraiment traiter avec des trucs envoyés aux adresses brouillées.

1
keshlam

Ce n'est pas tellement une réponse que certains commentaires sur la raison pour laquelle votre question est si difficile à avoir raison. Notez que je suis en Australie, où l'adressage est similaire, mais pas exactement le même.

La clé de la base de données est qu'elle représente données, pas informations, qui est beaucoup plus complexe. Les données suivent des règles simplistes qui ne reflètent pas toujours la vie réelle.

Prenez, par exemple des villes, des états et des codes postaux. Les états sont uniques, mais les villes ne le sont pas. Les codes postaux sont censés résoudre ce problème, mais au moins en Australie, plusieurs villes peuvent avoir le même code postal et, à l'occasion, une ville peut avoir plusieurs codes postaux. Et, de temps en temps, les villes peuvent avoir des codes postaux de la gamme de l'état adjacent.

Cela signifie que chaque ville fait vraiment partie d'une combinaison de code ville/état/postal. Bien que le service postal ait une sorte de notion de relation entre eux, ce n'est pas très strict, et il existe de nombreuses exceptions (partielles).

Pour cette raison, je pense qu'il est préférable de représenter des villes comme une table séparée et de considérer la ville, l'état et le code postal comme des colonnes distinctes de données et négligent la relation entre eux qui défierait la normalisation.

Vous pouvez considérer la combinaison comme clé primaire, même si je préfère toujours une clé primaire distincte et simplement faire une clé unique hors de la combinaison du reste.

Je ne sais pas où les comtés entrent, car nous ne les utilisons pas ici.

0
Manngo