wake-up-neo.net

Ist es eine gute Idee, eine ganzzahlige Spalte zum Speichern von US-Postleitzahlen in einer Datenbank zu verwenden?

Auf den ersten Blick scheint es, als hätte ich zwei grundlegende Möglichkeiten, um Postleitzahlen in einer Datenbanktabelle zu speichern:

  1. Text (wahrscheinlich am häufigsten), d. H. char(5) oder varchar(9) zur Unterstützung der +4-Erweiterung
  2. Numerisch, d. H. 32-Bit-Ganzzahl

Beide würden den Anforderungen der Daten genügen, wenn wir davon ausgehen, dass es keine internationalen Bedenken gibt. In der Vergangenheit sind wir im Allgemeinen nur den Textweg gegangen, aber ich habe mich gefragt, ob jemand das Gegenteil tut. Schon im kurzen Vergleich sieht es so aus, als hätte die Ganzzahlmethode zwei klare Vorteile:

  • Es ist aufgrund seiner Art automatisch nur auf Numerik beschränkt (wohingegen der Textstil ohne Bestätigung Buchstaben und solche speichern könnte, die meines Wissens niemals in einer Postleitzahl gültig sind). Dieses nicht bedeutet, dass wir auf die Überprüfung der Benutzereingaben als normal verzichten könnten/würden/sollten.
  • Es benötigt weniger Platz, da es 4 Bytes ist (was selbst für 9-stellige Postleitzahlen ausreichend sein sollte) anstatt von 5 oder 9 Bytes.

Es scheint auch, als würde es der Display-Ausgabe nicht sehr schaden. Es ist trivial, eine ToString() auf einen numerischen Wert zu schlagen, eine einfache Zeichenfolgenmanipulation zu verwenden, um einen Bindestrich oder ein Leerzeichen oder was auch immer für die Erweiterung +4 einzufügen, und die String-Formatierung zum Wiederherstellen führender Nullen zu verwenden.

Gibt es etwas, das die Verwendung von int als Datentyp für US-amerikanische Postleitzahlen abschrecken würde?

47
Sean Hanley

Eine numerische Postleitzahl ist in gewisser Weise irreführend. 

Zahlen sollten etwas numerisch bedeuten. Postleitzahlen addieren oder subtrahieren keine numerischen Operationen. 12309 - 12345 berechnet nicht die Entfernung von der Innenstadt von Schenectady zu meiner Nachbarschaft.

Zugegeben, für Postleitzahlen ist niemand verwirrt. Bei anderen Zahlenfeldern kann es jedoch verwirrend sein.

Da Postleitzahlen keine Zahlen sind - sie werden nur mit einem eingeschränkten Alphabet codiert - empfehle ich, ein numerisches Feld zu vermeiden. Die Ein-Byte-Einsparung ist nicht viel wert. Und ich denke, dass bedeutung wichtiger ist als das Byte.


Bearbeiten .

"Was führende Nullen angeht ..." ist mein Punkt. Zahlen haben keine führenden Nullen. Das Vorhandensein bedeutungsvoller führender Nullen in Postleitzahlen ist ein weiterer Beweis dafür, dass sie nicht numerisch sind.

109
S.Lott

Werden Sie jemals Postleitzahlen außerhalb der USA speichern? Kanada ist 6 Zeichen mit einigen Buchstaben. Normalerweise verwende ich nur ein 10-Zeichen-Feld. Speicherplatz ist billig, das Datenmodell muss nicht überarbeitet werden.

24
Tom

Verwenden Sie eine Zeichenfolge mit Validierung. Postleitzahlen können mit 0 beginnen, daher ist numerisch kein geeigneter Typ. Dies gilt auch für internationale Postleitzahlen (z. B. Großbritannien mit bis zu 8 Zeichen). In dem unwahrscheinlichen Fall, dass Postleitzahlen ein Engpass sind, können Sie ihn auf 10 Zeichen begrenzen, aber überprüfen Sie zuerst Ihre Zielformate .

Hier sind Validierungsregeln für Großbritannien, USA und Kanada.


Ja, Sie können auffüllen, um die führenden Nullen zurückzubekommen. Sie werfen jedoch theoretisch Informationen weg, die im Fehlerfall hilfreich sein könnten. Wenn jemand 1235 in der Datenbank findet, ist das ursprünglich 01235 oder wurde eine andere Ziffer übersehen?

Best Practice sagt, Sie sollten sagen, was Sie meinen. Eine Postleitzahl ist ein Code, keine Nummer. Möchten Sie hinzufügen/subtrahieren/multiplizieren/dividieren Postleitzahlen? Aus praktischer Sicht ist es weitaus wichtiger, dass Sie längere Reißverschlüsse ausschließen.

17
Mark

Normalerweise würden Sie einen nicht-numerischen Datentyp verwenden, z. B. einen Varchar, der mehr Postleitzahlstypen zulässt. Wenn Sie keine Einstellung für 5-stellige [XXXXX] - oder 9-stellige [XXXXX-XXXX] -Ziffern haben, können Sie ein Zeichen (5) oder ein Zeichen (10) verwenden. Varchar ist die sicherste und vernünftigste Wahl.

Bearbeiten: Es sollte auch beachtet werden, dass Sie keinen numerischen Datentyp verwenden sollten, wenn Sie nicht vorhaben, numerische Berechnungen für das Feld durchzuführen. Die Postleitzahl ist keine Zahl in dem Sinne, dass Sie sie hinzufügen oder von ihr abziehen. Es handelt sich lediglich um eine Zeichenfolge, die normalerweise aus Zahlen besteht. Daher sollten Sie davon Abstand nehmen, numerische Datentypen zu verwenden.

9
TheTXI

Aus technischer Sicht sind einige Punkte, die hier angesprochen wurden, ziemlich trivial. Ich arbeite mit der Adressdatenbereinigung auf einer täglichen Basis - insbesondere der Adressdatenbereinigung aus aller Welt. Es ist keine triviale Aufgabe für alle Bereiche der Vorstellungskraft. Wenn es sich um Postleitzahlen handelt, speichern Sie könnten sie als Ganzzahl, obwohl sie möglicherweise nicht "semantisch" korrekt ist. Tatsache ist, dass die Daten numerisch sind, unabhängig davon, ob is als numerisch betrachtet wird oder nicht.

Der eigentliche Nachteil des Speicherns als numerische Typen besteht jedoch darin, dass Sie die Möglichkeit verlieren, leicht zu erkennen, ob die Daten falsch eingegeben wurden (dh fehlende Werte haben) oder ob das System führende Nullen entfernt hat, was zu kostspieligen Operationen führt, um möglicherweise ungültig zu validieren Ansonsten korrekte Postleitzahlen.

Es ist auch sehr schwierig, den Benutzer zur Eingabe korrekter Daten zu zwingen, wenn eine der Auswirkungen eine Verzögerung des Geschäfts darstellt. Benutzer haben oft nicht die Geduld, korrekte Daten einzugeben, wenn dies nicht sofort offensichtlich ist. Die Verwendung eines regulären Ausdrucks ist eine Möglichkeit, korrekte Daten zu garantieren. Wenn der Benutzer jedoch einen Wert eingibt, der nicht konform ist und ein Fehler angezeigt wird, kann er diesen Wert ganz weglassen oder einen Wert eingeben, der konform ist, ansonsten jedoch falsch ist. Ein Beispiel [mit kanadischen Postleitzahlen] ist, dass häufig A0A 0A0 eingegeben wird, das nicht gültig ist, jedoch dem Regex für kanadische Postleitzahlen entspricht. In den meisten Fällen wird dies von Benutzern eingegeben, die gezwungen sind, eine Postleitzahl anzugeben, aber sie wissen entweder nicht, was es ist oder haben nicht alles richtig.

Ein Vorschlag ist, den gesamten Eintrag als eine Einheit zu bestätigen, die bestätigt, dass die Postleitzahl im Vergleich zur restlichen Adresse korrekt ist. Wenn dies nicht der Fall ist, erleichtert das Angebot alternativer gültiger Postleitzahlen für die Adresse die Eingabe gültiger Daten. Wenn die Postleitzahl für die Adresse der Straße korrekt ist, die Straßennummer jedoch außerhalb der Domäne dieser Postleitzahl liegt, bieten Sie ebenfalls alternative Straßennummern für die Kombination aus Postleitzahl und Straße an.

7
BenAlabaster

Wenn Sie keine Geschäftsanforderung haben, mathematische Berechnungen für Postleitzahlendaten durchzuführen, ist die Verwendung eines INT sinnlos. Du bist über das Engineering hinaus.

Hoffe das hilft,

Rechnung

2
V'rasana Oannes

Nein, weil

  • Sie führen niemals mathematische Funktionen für die Postleitzahl aus
  • Könnte Bindestriche enthalten
  • Könnte mit 0 beginnen 
  • NULL-Werte werden bei skalaren Typen manchmal als Null interpretiert like integer (z. B. wenn Sie die Daten irgendwie exportieren)
  • Postleitzahl, selbst wenn es sich um eine Zahl handelt, ist eine Bezeichnung eines Bereichs.... Dies bedeutet, dass es sich um einen Namen handelt und nicht um eine numerische Menge von irgendetwas.
2
kexx

Postleitzahl ist wirklich ein kodierter Namespace, wenn Sie darüber nachdenken. Traditionell Ziffern, aber auch Bindestrich und Großbuchstaben:

"10022-SCHUH"

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

Realistisch ist, dass viele Geschäftsanwendungen diesen Edge-Fall nicht unterstützen müssen, selbst wenn er gültig ist.

1
benc

Ganzzahl ist Nizza, funktioniert aber nur in den USA, weshalb die meisten Leute es nicht tun. Normalerweise verwende ich nur einen Varchar (20) oder so. Wahrscheinlich übertrieben für jedes Gebiet.

0
Eric Petroelje

Ich kürzlich gelernt , dass Sie in Ruby einen Grund dafür vermeiden möchten, weil es einige Postleitzahlen gibt, die mit führenden Nullen beginnen, die, wenn sie als Ganzzahl gespeichert werden, automatisch in Oktal umgewandelt werden.

Von die Dokumente :

Sie können ein spezielles Präfix verwenden, um Zahlen im Dezimal-, Hexadezimal-, Oktal- oder Binärformat zu schreiben. Verwenden Sie für Dezimalzahlen ein Präfix von 0d, für Hexadezimalzahlen ein Präfix von 0x, für Oktalzahlen ein Präfix von 0 oder 0o.

0
therealrodk

Wenn Sie eine Ganzzahl für US-Zips verwenden, sollten Sie den führenden Teil mit 10.000 multiplizieren und +4 hinzufügen. Die Kodierung in der Datenbank hat nichts mit der Eingabevalidierung zu tun. Sie können immer verlangen, dass die Eingabe gültig ist oder nicht. Die Speicherung hängt jedoch davon ab, wie viel Ihrer Meinung nach Ihre Anforderungen oder der USPS ändern. (Hinweis: Ihre Anforderungen werden ändern.)

0
Steve