Est-ce une bonne idée d'utiliser une colonne entière pour stocker les codes postaux des États-Unis dans une base de données?

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

Question

De prime abord, il semblerait que j'ai deux choix de base pour le stockage codes postaux dans un table de base de données:

  1. Texte (probablement le plus courant), à savoir char(5) ou varchar(9) pour soutenir l'extension +4
  2. numérique, à savoir entier 32 bits

Les deux devraient satisfaire aux exigences des données, si l'on suppose qu'il n'y a pas de problèmes internationaux. Dans le passé, nous avons généralement juste pris le chemin de texte, mais je me demandais si quelqu'un fait le contraire? Juste de brève comparaison, il ressemble à la méthode entière a deux avantages évidents:

  • Il est, par sa nature, automatiquement limitée à chiffres uniquement (alors que sans validation le style de texte pourrait stocker des lettres et autres qui ne sont pas, à ma connaissance, jamais valable dans un code postal). Cette ne pas signifie que nous pourrions / serait / doit renoncer à valider l'entrée utilisateur comme d'habitude, bien!
  • Il faut moins d'espace, étant de 4 octets (ce qui devrait être beaucoup même pour 9 chiffres des codes postaux) au lieu de 5 ou 9 octets.

En outre, il semble que ce ne serait pas mal beaucoup de sortie d'affichage. Il est trivial de gifler un ToString() sur une valeur numérique, utilisez la manipulation de chaîne simple pour insérer un trait d'union ou de l'espace ou quel que soit le 4 extension, et utiliser le formatage de chaîne pour restaurer des zéros non significatifs.

Y at-il quelque chose qui découragerait l'utilisation int comme un type de données pour les États-Unis uniquement les codes ZIP?

Était-ce utile?

La solution

Un code postal numérique est - dans un petit chemin - trompeur.

Les chiffres doivent signifier quelque chose numérique . codes postaux ne pas ajouter ou soustraire ou participer à des opérations numériques. 12309 -. 12 345 ne calcule pas la distance du centre-ville Schenectady dans mon quartier

Accordé, pour les codes ZIP, n'est confus. Cependant, pour d'autres champs de numéro semblable, il peut être source de confusion.

Étant donné que les codes postaux ne sont pas des nombres - ils ont juste arriver à coder avec un alphabet restreint - je suggère d'éviter un champ numérique. L'économie de 1 octet ne vaut pas beaucoup. Et je pense que ce signifie est plus important que l'octet.


Modifier .

« Pour ce qui est des zéros non significatifs ... » est mon point. Les chiffres ne sont pas des zéros à gauche. La présence de zéros, significatifs sur les codes ZIP est une preuve qu'ils ne sont pas numériques.

Autres conseils

Êtes-vous allez stocker toujours les codes postaux non-américains? Le Canada est de 6 caractères avec des lettres. J'utilise généralement un champ de 10 caractères. L'espace disque est pas cher, avoir à retravailler votre modèle de données ne sont pas.

Utilisez une chaîne avec la validation. Les codes postaux peuvent commencer par 0, donc numérique est un type approprié. Cela vaut également parfaitement aux codes postaux internationaux (par exemple au Royaume-Uni, qui est jusqu'à 8 caractères). Dans le cas peu probable que les codes postaux sont un goulot d'étranglement, vous pouvez limiter à 10 caractères, mais vérifier votre formats cibles premier.

Voici la validation regexes pour Royaume-Uni, des États-Unis et au Canada.


Oui, vous pouvez pad pour obtenir les zéros à gauche en arrière. Cependant, vous jetez théoriquement loin des informations qui pourraient aider en cas d'erreurs. Si quelqu'un trouve 1235 dans la base de données, est que l'origine 01235, ou a un autre chiffre manquant?

Les meilleures pratiques dit que vous devez dire ce que vous voulez dire. Un code est un code, pas de numéro. Est-ce que vous allez ajouter / soustraire / multiplier / diviser codes postaux? Et d'un point de vue pratique, il est beaucoup plus important que vous excluez zips étendues.

Normalement, vous devez utiliser un type de données non numérique comme un varchar qui permettrait plus de types de codes postaux. Si vous êtes bien décidés à 5 chiffres permettant seulement [XXXXX] ou 9 chiffres [XXXXX-XXXX] codes postaux, vous pouvez alors utiliser un char (5) ou char (10), mais je ne le recommanderais pas. Varchar est le choix le plus sûr et le plus sain d'esprit.

Edit: Il convient également de noter que si vous ne prévoyez pas de faire des calculs numériques sur le terrain, vous ne devriez pas utiliser un type de données numériques. Code postal est pas un numéro dans le sens que vous ajoutez ou soustrayez contre elle. Il est juste une chaîne qui se trouve être composée généralement de nombres, vous devriez vous abstenir d'utiliser des types de données numériques pour elle.

Du point de vue technique, certains points soulevés ici sont assez trivial. Je travaille avec le nettoyage des données d'adresse sur une par jour base - en particulier les données d'adresse de nettoyage de partout dans le monde. Ce n'est pas une tâche triviale, loin de l'imagination. En ce qui concerne les codes zip, vous pourrait les stocker sous forme d'entier, bien qu'il ne soit pas « sémantiquement » correcte. Le fait est, les données sont d'une forme numérique ou non, à proprement parler, il est numérique en valeur considérée.

Cependant, l'inconvénient très réel de les stocker en tant que types numériques est que vous perdez la possibilité de voir facilement si les données ont été saisies erronées (c.-à-a des valeurs manquantes) ou si le système supprimé des zéros à gauche menant à des opérations coûteuses à valider les codes postaux potentiellement invalides qui étaient par ailleurs correcte.

Il est également très difficile de forcer l'utilisateur à entrer des données correctes si l'une des répercussions est un retard de l'entreprise. Souvent, les utilisateurs ont pas la patience d'entrer des données correctes si ce n'est pas immédiatement évident. L'utilisation d'un regex est une façon de garantir des données correctes, si l'utilisateur entre une valeur qui ne se conforme pas et ils sont affichés une erreur, ils peuvent simplement omettent tout à fait cette valeur ou entrer dans quelque chose qui est conforme, mais autrement est incorrect. Un exemple [en utilisant les codes postaux canadiens] est que vous voyez souvent A0A 0A0 saisi qui est pas valide, mais est conforme à la regex pour les codes postaux canadiens. Plus souvent qu'autrement, ce sont entrées par les utilisateurs qui sont obligés de fournir un code postal, mais ils ne savent pas ce qu'elle est ou ne pas tout cela correct.

Une suggestion est de valider l'ensemble de l'entrée comme une unité de valider que le code postal est correct par rapport au reste de l'adresse. S'il est des codes postaux incorrecte, offrant de remplacement valides pour l'adresse sera plus facile pour eux d'entrer des données valides. De même, si le code est correct pour l'adresse de la rue, mais le numéro de rue ne relève pas du domaine de ce code, puis offrir d'autres numéros de rue pour ce code postal / combinaison de rue.

Sauf si vous avez un besoin d'affaires pour effectuer des calculs mathématiques sur les données de code postal, il n'y a pas de point à l'aide d'un INT. Vous êtes sur l'ingénierie.

Hope this helps,

Bill

Non, parce que

  • Vous ne faites jamais les fonctions mathématiques sur code
  • Peut contenir des tirets
  • pourrait commencer par 0
  • les valeurs NULL parfois interprétées comme des zéros dans le cas des types scalaires comme nombre entier (par exemple lorsque vous exportez les données en quelque sorte)
  • Code postal, même si elle est un numéro, est une désignation d'une zone, ce qui signifie que c'est un nom au lieu d'une quantité numérique de quoi que ce soit

Code postal est vraiment un espace de nom codé, si vous pensez à ce sujet. Traditionnellement chiffres, mais aussi des lettres de trait d'union et de capital:

"10022-SHOE"

http://www.saksfifthavenue.com/main/10022-shoe.jsp

De façon réaliste, beaucoup d'applications d'entreprise ne sera pas nécessaire de soutenir ce cas limite, même si elle est valide.

Integer est agréable, mais il ne fonctionne que dans les Etats-Unis, ce qui explique pourquoi la plupart des gens ne le font pas. En général, je viens d'utiliser un varchar (20) ou plus. Probablement surpuissant les paramètres régionaux.

Si vous deviez utiliser un entier pour US zips, vous voulez multiplier le rôle de premier plan par 10 000 et ajouter le +4. Le codage dans la base de données n'a rien à voir avec la validation d'entrée. Vous pouvez toujours besoin de l'entrée pour être valide ou non, mais le stockage est question de combien vous pensez que vos besoins ou l'USPS va changer. (Indice: vos besoins changement.)

Je appris récemment que Ruby une raison pour laquelle vous voulez éviter cela est parce qu'il ya des codes postaux qui commencent par des zéros non significatifs qui, si Stockée sous-entier seront automatiquement converties en octal.

De les docs :

  

Vous pouvez utiliser un préfixe spécial pour écrire les nombres en décimal, hexadécimal, octal ou formats binaires. Pour les nombres décimaux utiliser un préfixe 0d, pour les nombres hexadécimaux utilisent un préfixe 0x, pour les numéros de octal utilisent un préfixe 0 ou 0o ...

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