web-dev-qa-db-fra.com

Est-ce une bonne idée d’utiliser une colonne d’entier pour stocker les codes zip américains dans une base de données?

À première vue, il semblerait que j’ai deux choix de base pour stocker les codes postaux dans une table de base de données:

  1. Texte (probablement le plus courant), c'est-à-dire char(5) ou varchar(9) pour prendre en charge l'extension +4
  2. Numérique, c'est-à-dire entier 32 bits

Les deux satisferaient aux exigences des données si l’on supposait qu’il n’y avait pas de problèmes internationaux. Dans le passé, nous avons généralement choisi la voie du texte, mais je me demandais si quelqu'un faisait l'inverse. Une brève comparaison montre que la méthode des entiers présente deux avantages évidents:

  • Il est, de par sa nature, automatiquement limité aux seules valeurs numériques (alors que sans validation, le style du texte pourrait stocker des lettres et des caractères qui, à ma connaissance, ne sont jamais valables dans un code postal). Ceci ne signifie pas que nous pourrions/voudrions/devrions renoncer à valider la saisie de l'utilisateur comme d'habitude!
  • Il prend moins d’espace, c’est 4 octets (ce qui devrait être suffisant même pour les codes postaux à 9 chiffres) au lieu de 5 ou 9 octets.

En outre, il semble que cela ne nuirait pas beaucoup à l'affichage. Il est facile de placer une ToString() sur une valeur numérique, d'utiliser une simple manipulation de chaîne pour insérer un trait d'union ou un espace quelconque pour l'extension +4, et d'utiliser le formatage de chaîne pour restaurer les zéros non significatifs.

Y a-t-il quelque chose qui découragerait l'utilisation de int comme type de données pour les codes postaux américains uniquement?

47
Sean Hanley

Un code postal numérique est - dans une petite mesure - trompeur. 

Les chiffres doivent avoir une signification numérique. Les codes postaux ne pas ajouter ou soustraire ou participer à des opérations numériques. 12309 - 12345 ne calcule pas la distance entre le centre-ville de Schenectady et mon quartier.

Certes, pour les codes postaux, personne n'est confus. Cependant, pour d'autres champs semblables à des nombres, cela peut être déroutant.

Étant donné que les codes postaux ne sont pas des nombres - ils sont juste codés avec un alphabet restreint - je suggère d'éviter un champ numérique. L'enregistrement sur 1 octet ne vaut pas grand chose. Et je pense que ce signification est plus important que l'octet.


Modifier .

"En ce qui concerne les zéros ..." est ce que je veux dire. Les nombres n'ont pas de zéros en tête. La présence de zéros significatifs sur les codes postaux est une preuve supplémentaire qu'ils ne sont pas numériques.

109
S.Lott

Allez-vous stocker des codes postaux non américains? Canada est composé de 6 caractères avec quelques lettres. D'habitude, je n'utilise qu'un champ de 10 caractères. L'espace disque est bon marché, il n'est pas nécessaire de retravailler votre modèle de données.

24
Tom

Utilisez une chaîne avec validation. Les codes postaux peuvent commencer par 0, le type numérique ne convient donc pas. Cela s'applique également parfaitement aux codes postaux internationaux (par exemple, le Royaume-Uni, qui peut comporter jusqu'à 8 caractères). Dans le cas peu probable où les codes postaux sont un goulot d'étranglement, vous pouvez le limiter à 10 caractères, mais vérifiez d'abord vos formats target .

Voici les expressions rationnelles de validation pour le Royaume-Uni, les États-Unis et le Canada.


Oui, vous pouvez utiliser les touches pour récupérer les zéros à gauche. Cependant, vous êtes théoriquement en train de jeter des informations qui pourraient aider en cas d’erreurs. Si quelqu'un trouve 1235 dans la base de données, s'agit-il à l'origine de 01235 ou un autre chiffre a-t-il été oublié?

La meilleure pratique dit que vous devriez dire ce que vous voulez dire. Un code postal est un code, pas un nombre. Allez-vous ajouter/soustraire/multiplier/diviser codes postaux? Et d’un point de vue pratique, il est bien plus important d’exclure les zips étendus.

17
Mark

Normalement, vous utiliseriez un type de données non numérique, tel que varchar, qui autoriserait davantage de types de code Zip. Si vous ne définissez que des codes Zip à 5 chiffres [XXXXX] ou à 9 chiffres [XXXXX-XXXX], vous pouvez utiliser un caractère (5) ou un caractère (10), mais je ne le recommande 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 d'effectuer de calculs numériques sur le terrain, vous ne devez pas utiliser un type de données numérique. Code postal n'est pas un nombre dans le sens où vous ajoutez ou soustrayez-le. C'est simplement une chaîne qui se compose généralement de nombres, vous devriez donc vous abstenir d'utiliser des types de données numériques.

9
TheTXI

D'un point de vue technique, certains points soulevés ici sont assez triviaux. Je travaille avec le nettoyage des données d'adresse sur une base {quotidienne} - en particulier le nettoyage des données d'adresse du monde entier. Ce n'est pas une tâche triviale par un effort d'imagination. En ce qui concerne les codes postaux, vous les stockez sous la forme d'un entier pourrait bien que cela ne soit pas "sémantiquement" correct. Le fait est que les données ont une forme numérique, qu’elles soient ou non à proprement parler est considérées comme numériques en valeur.

Cependant, le très réel inconvénient de les stocker en tant que types numériques est que vous perdrez la possibilité de voir facilement si les données ont été saisies incorrectement (c'est-à-dire si des valeurs sont manquantes) ou si le système a supprimé les zéros non significatifs menant à des opérations coûteuses pour valider des valeurs potentiellement non valides. Codes postaux qui étaient par ailleurs corrects.

Il est également très difficile de forcer l'utilisateur à saisir des données correctes si l'une des conséquences est un retard des travaux. Les utilisateurs n'ont souvent pas la patience d'entrer les données correctes si elles ne sont pas immédiatement évidentes. L'utilisation d'une expression régulière est un moyen de garantir des données correctes. Toutefois, si l'utilisateur entre une valeur non conforme et qu'une erreur est affichée, il peut simplement omettre cette valeur ou saisir un élément conforme mais incorrect. Un exemple [en utilisant les codes postaux canadiens] est que vous voyez souvent A0A 0A0 entré qui n'est pas valide mais est conforme à la regex des codes postaux canadiens. Le plus souvent, il est saisi par les utilisateurs qui sont obligés de fournir un code postal, mais ils ne savent pas ce que c'est ou ne l'ont pas tout à fait correct.

Une suggestion est de valider l'ensemble de l'entrée comme une unité validant que le code postal est correct par rapport au reste de l'adresse. S'il est incorrect, proposer d'autres codes postaux valides pour l'adresse facilitera leur saisie de données valides. De même, si le code postal est correct pour l'adresse de la rue, mais que le numéro de rue ne relève pas du domaine de ce code postal, proposez d'autres numéros de rue pour cette combinaison code postal/rue.

7
BenAlabaster

À moins que vous ne deviez effectuer des calculs mathématiques sur des données de code postal, il n’est pas utile d’utiliser un INT. Vous êtes sur l'ingénierie.

J'espère que cela t'aides,

Facture

2
V'rasana Oannes

Non parce que

  • Vous ne faites jamais de fonctions mathématiques sur code postal
  • Pourrait contenir des tirets
  • Pourrait commencer par 0 
  • Les valeurs NULL sont parfois interprétées comme égales à zéro dans le cas de types scalaires Entier (par exemple, lorsque vous exportez les données d'une manière ou d'une autre)
  • Le code postal, même s’il s’agit d’un numéro, désigne une région, , Ce qui signifie qu’il s’agit d’un nom et non d’une quantité numérique
2
kexx

Le code postal est vraiment un espace de noms codé, si vous y réfléchissez. Traditionnellement des chiffres, mais aussi un trait d'union et des lettres majuscules:

"10022-CHAUSSURE"

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

De manière réaliste, de nombreuses applications d'entreprise n'auront pas besoin de prendre en charge ce cas Edge, même s'il est valide.

1
benc

Integer est Nice, mais cela ne fonctionne qu'aux États-Unis, raison pour laquelle la plupart des gens ne le font pas. Habituellement, je viens d'utiliser un varchar (20) ou plus. Probablement exagéré pour n'importe quel lieu.

0
Eric Petroelje

J'ai récemment appris que Ruby est une des raisons pour éviter cela, car certains codes Zip commençant par des zéros non significatifs sont convertis automatiquement en octal s'ils sont stockés sous la forme d'un entier.

De les docs :

Vous pouvez utiliser un préfixe spécial pour écrire des nombres aux formats décimal, hexadécimal, octal ou binaire. Pour les nombres décimaux, utilisez le préfixe 0d, pour les nombres hexadécimaux, le préfixe 0x, pour les nombres octaux, le préfixe 0 ou 0o…

0
therealrodk

Si vous deviez utiliser un entier pour US Zips, vous voudriez multiplier la partie principale par 10 000 et ajouter le +4. Le codage dans la base de données n'a rien à voir avec la validation des entrées. Vous pouvez toujours exiger que les entrées soient valides ou non, mais le stockage dépend de combien vous pensez que vos exigences ou l'USPS changeront. (Astuce: vos exigences vont changer.)

0
Steve