Best Practices zum Speichern von Postanschriften in einer Datenbank (RDBMS)?


106

Gibt es gute Referenzen für Best Practices zum Speichern von Postanschriften in einem RDBMS? Es scheint, dass es viele Kompromisse gibt und viele Vor- und Nachteile für jeden zu bewerten sind - sicherlich wurde dies immer wieder getan? Vielleicht hat jemand zumindest einige Lektionen geschrieben, die er irgendwo gelernt hat?

Beispiele für die Kompromisse, über die ich spreche, sind das Speichern der Postleitzahl als Ganzzahl gegenüber einem Zeichenfeld, sollte die Hausnummer als separates Feld oder Teil der Adresszeile 1 gespeichert werden, sollten Suite- / Apartment- / usw.-Nummern normalisiert oder nur als gespeichert werden Textblock in Adresszeile 2, wie gehen Sie mit zip +4 um (separate Felder oder ein großes Feld, Ganzzahl vs. Text)? etc.

An dieser Stelle beschäftige ich mich hauptsächlich mit US-Adressen, aber ich stelle mir vor, dass es einige bewährte Methoden gibt, um sich auf die Möglichkeit vorzubereiten, auch global zu werden (z. B. Felder wie Region anstelle von Bundesland oder Postleitzahl anstelle von Postleitzahl entsprechend zu benennen). etc.


3
Die Postleitzahl muss von Anfang an ein Zeichenfeld sein - andernfalls würden bestimmte Postleitzahlen, die mit 0 beginnen, ungenau werden.
Menasheh

1
Als Faustregel gilt, wenn Sie mathematische Berechnungen mit der Zahl durchführen müssen, sollte diese eine Ganzzahl sein. Wenn Sie es nur anzeigen, sollte es char sein (Telefon, Postleitzahl usw.)
Zikato

Antworten:


37

Für eine internationalere Verwendung ist ein Schema zu berücksichtigen, das vom Drupal-Adressfeld verwendet wird . Es basiert auf dem xNAL-Standard und scheint die meisten internationalen Fälle abzudecken. Wenn Sie sich ein wenig mit diesem Modul befassen, werden Sie einige schöne Perlen für die internationale Interpretation und Validierung von Adressen entdecken. Es gibt auch eine Reihe von Verwaltungsbereichen (Provinz, Bundesland, Gebiet usw.) mit ISO-Codes.

Hier ist der Kern des Schemas, das von der Modulseite kopiert wurde:

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 / District (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)

Eine Lektion, die ich gelernt habe:

  • Speichern Sie nichts numerisch.
  • Speichern Sie Land und Verwaltungsbereich nach Möglichkeit als ISO-Codes.
  • Wenn Sie es nicht wissen, müssen Sie nachlässig Felder anfordern. Einige Länder verwenden möglicherweise keine Felder, die Sie für selbstverständlich halten, selbst grundlegende Dinge wie locality& thoroughfare.

1
Darf ich fragen, wofür die "name_line" gedacht ist? Ich finde keine Erklärung in den Drupal Docs oder im xNal Standard. Wie ich es verstehe, dient die name_line zum Versenden von echten Briefen oder Paketen per Post. Der Vorname / Nachname wird nur benötigt, wenn Sie den Kunden direkt ansprechen möchten, z. B. per E-Mail ("Sehr geehrter Herr <Nachname>"). Oder hat es einen anderen Zweck / Nutzen?
Luba

Bei der Zustellung an (große) Geschäftsräume ist häufig ein Name für das interne Postzustellungssystem erforderlich (siehe Bürogebäude mit Poststellen)
Chris Browne,

24

Als "internationaler" Benutzer gibt es nichts Frustrierenderes als den Umgang mit einer Website, die sich nur an Adressen im US-Format orientiert. Es ist anfangs etwas unhöflich, wird aber zu einem ernsthaften Problem, wenn die Validierung auch zu eifrig ist.

Wenn Sie daran interessiert sind, global zu agieren, ist der einzige Rat, den ich habe, die Dinge frei zu halten. Verschiedene Länder haben unterschiedliche Konventionen - in einigen steht die Hausnummer vor dem Straßennamen, in einigen nach. Einige haben Staaten, einige Regionen, einige Landkreise, einige Kombinationen davon. Hier in Großbritannien ist die Postleitzahl keine Postleitzahl, sondern eine Postleitzahl, die sowohl Buchstaben als auch Zahlen enthält.

Ich würde einfach empfehlen, ~ 10 Zeilen Zeichenfolgen variabler Länge zusammen mit einem separaten Feld für eine Postleitzahl (und seien Sie vorsichtig, wie Sie dies beschreiben, um mit den nationalen Empfindlichkeiten umzugehen). Lassen Sie den Benutzer / Kunden entscheiden, wie er seine Adressen schreibt.


Für das, was es wert ist, ist dies nicht für eine Website, aber der Punkt über internationale Adressen ist immer noch gut aufgenommen.
John

46
Obwohl ich mit der Nachricht nicht einverstanden bin und Sie für Ihre Haltung begrüße, musste ich Sie ablehnen, weil ich die Tatsache verabscheue, dass jemand den größten Teil meiner Zeit damit verbringt, Tools zum Bereinigen von Adressdaten zu schreiben der Speicherung von Adressdaten in einem Freiformformat. Adressen können unterschiedlich formatiert sein, die Daten sind jedoch weitgehend identisch. Ob eine Straßennummer vor oder nach dem Straßennamen angezeigt wird, ist für Speicherzwecke weitgehend irrelevant - nur für Anzeigezwecke.
BenAlabaster


17

Aufgrund von Sonderfällen wie "Halbzahlen" oder meiner aktuellen Adresse, die so etwas wie "129A" ​​ist, sollten Sie die Hausnummer auf jeden Fall als Zeichenfeld und nicht als Zahl speichern. Das A wird jedoch nicht als Wohnung betrachtet Nummer für Lieferservices.


11

Ich habe dies getan (Adressstrukturen in einer Datenbank rigoros modellieren) und würde es nie wieder tun. Sie können sich nicht vorstellen, wie verrückt die Ausnahmen sind, die Sie in der Regel berücksichtigen müssen.

Ich erinnere mich vage an ein Problem mit norwegischen Postleitzahlen (glaube ich), bei denen es sich alle um vier Positionen handelte, mit Ausnahme von Oslo mit 18 oder so.

Ich bin mir sicher, dass sich von dem Moment an, als wir die geografisch korrekten Postleitzahlen für alle unsere eigenen nationalen Adressen verwendeten, einige Leute beschwerten, dass ihre Post zu spät ankam. Es stellte sich heraus, dass diese Menschen in der Nähe einer Grenze zwischen Postgebieten lebten, und trotz der Tatsache, dass jemand wirklich im Postgebiet lebte, beispielsweise 1600, sollte seine Post in Wirklichkeit an das Postgebiet 1610 gerichtet werden, da es in Wirklichkeit das benachbarte Postgebiet war das diente ihm tatsächlich, so dass das Senden seiner Post an seinen richtigen Postbereich einige Tage länger dauern würde, bis sie eintrifft, da im richtigen Postamt unerwünschte Eingriffe erforderlich waren, um sie an den falschen Postbereich weiterzuleiten ...

(Am Ende haben wir diese Personen mit einer Adresse im Ausland im Land mit dem ISO-Code 'ZZ' registriert.)


8

Sie sollten auf jeden Fall " Ist dies eine gute Möglichkeit, Adressinformationen in einer relationalen Datenbank zu modellieren " konsultieren , aber Ihre Frage ist kein direktes Duplikat davon.

Es gibt sicherlich viele bereits vorhandene Antworten (siehe beispielsweise die Beispieldatenmodelle bei DatabaseAnswers ). Viele der bereits vorhandenen Antworten sind unter bestimmten Umständen fehlerhaft (DB-Antworten werden überhaupt nicht ausgewählt).

Ein wichtiges Thema ist der Umfang der Adressen. Wenn Ihre Datenbank mit internationalen Adressen umgehen muss, müssen Sie flexibler sein als wenn Sie nur mit Adressen in einem Land umgehen müssen.

Meiner Ansicht nach ist es oft (was nicht immer bedeutet ) sinnvoll, sowohl das Adressetikettenbild der Adresse aufzuzeichnen als auch den Inhalt separat zu analysieren. Auf diese Weise können Sie Unterschiede zwischen der Platzierung von Postleitzahlen, beispielsweise zwischen verschiedenen Ländern, beseitigen. Natürlich können Sie einen Analysator und einen Formatierer schreiben, die die Exzentrizitäten verschiedener Länder verarbeiten (z. B. haben US-Adressen 2 oder 3 Zeilen; britische Adressen können dagegen erheblich mehr haben; eine Adresse, an die ich regelmäßig schreibe, hat 9 Zeilen). Es kann jedoch einfacher sein, die Menschen die Analyse und Formatierung durchführen zu lassen und das DBMS nur die Daten speichern zu lassen.


7

Wenn Sie nicht mit den Straßennummern oder Postleitzahlen rechnen, laden Sie nur zu zukünftigen Schmerzen ein, indem Sie sie als Zahlen speichern.

Sie könnten hier und da ein paar Bytes sparen und vielleicht einen schnelleren Index erhalten, aber was tun Sie, wenn die US-Post oder ein anderes Land, mit dem Sie es zu tun haben, über die Einführung von Alphas in die Codes entscheidet?

Die Kosten für Speicherplatz werden viel billiger sein als die Kosten für die spätere Behebung ... y2k jemand?


7

Hinzufügen zu dem, was @ Jonathan Leffler und @ Paul Fisher gesagt haben

Wenn Sie jemals damit rechnen, Postanschriften für Kanada oder Mexiko zu Ihren Anforderungen hinzuzufügen, ist das Speichern postal-codeals Zeichenfolge ein Muss. Kanada hat alphanumerische Postleitzahlen und ich kann mich nicht erinnern, wie Mexiko auf den ersten Blick aussieht.


7

Ich habe festgestellt, dass das Auflisten aller möglichen Felder von der kleinsten diskreten Einheit bis zur größten der einfachste Weg ist. Benutzer füllen die Felder aus, die sie für richtig halten. Meine Adresstabelle sieht folgendermaßen aus:

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

Wie lagern Sie Postfächer?
Jowen

Fügen Sie einfach eine weitere Spalte hinzu. Postfach Wenn Sie dies nachträglich tun müssen, bedeutet dies, dass keine der vorherigen Adressen ein Postfach benötigt, sodass es auf null gesetzt werden kann
Gaz_Edge

2

Wo ist der "Kompromiss" bei der Speicherung der Postleitzahl als NUMMER oder VARCHAR? Das ist nur eine Wahl - es ist kein Kompromiss, es sei denn, beide haben Vorteile und Sie müssen einige Vorteile aufgeben, um andere zu erhalten.

Sofern die Summe der Reißverschlüsse überhaupt keine Bedeutung hat, ist Reißverschlüsse als Zahl nicht sinnvoll.


Ein Kompromiss könnte die Datenbankgröße sein. In MySQL 5 würde eine Mediumint-Zeile nur 3 Bytes pro Zeile benötigen, während ein Varchar (5) doppelt so viel benötigt. Ich dachte auch, dass numerische Suchen schneller sind als Textsuchen, aber das sehe ich nicht positiv.
Gpojd

4
man sollte einen varchar verwenden. Die kanadische Postleitzahl verwendet eine alphanumerische Kodierung, die nicht gut in eine Zahl passt.
EvilTeach

1
Während ich die "vorwärtskompatible" Logik hinter der Verwendung von varchar in diesem Sinne verstehe, ist die Behauptung, dass "Reißverschlüsse als Zahl nicht nützlich sind", etwas zu dogmatisch. Wenn Sie wissen, dass Sie nur mit Postleitzahlen in den USA arbeiten, ist es sinnvoll, Postleitzahlen als Ganzzahlen zu speichern, genau wie beim Schreiben in einer streng typisierten Sprache, definieren Sie nicht alles als Typ String ... Wenn Sie Wenn Sie wissen, dass es eine Zahl sein wird, sollten Sie sich auf die Typprüfung der DB / Programmiersprache stützen und sie so nennen, wie sie ist - eine Ganzzahl.
Rinogo

1
@rinogo Ein Argument für die Verwendung von varchar ist, dass Postleitzahlen im mathematischen Sinne nicht numerisch sind. Es macht keinen Sinn, sie zu addieren oder zu subtrahieren. Sie werden lediglich mit einem eingeschränkten Zeichensatz codiert. stackoverflow.com/a/893489/48659
Steve Folly

1
@SteveFolly Und zur weiteren Unterstützung von Postleitzahlen als Zeichenfolgen haben die führenden Zeichen eine besondere Bedeutung: en.wikipedia.org/wiki/ZIP_Code#Primary_state_prefixes Wenn eine Logik wie "Was sind die am weitesten links stehenden Zeichen des Werts ? " Implementiert werden soll ? " dann klingt das sicher eher nach einer Zeichenfolge als nach einer Ganzzahl.
David Aldridge

2

Dies mag ein Overkill sein, aber wenn Sie eine Lösung benötigen, die mit mehreren Ländern funktioniert, und Teile der Adresse programmgesteuert verarbeiten müssen:

Sie können eine länderspezifische Adressbehandlung mit zwei Tabellen durchführen: Eine generische Tabelle mit 10 VARCHAR2-Spalten, 10 Zahlenspalten, eine weitere Tabelle, die diese Felder Eingabeaufforderungen zuordnet und eine Länderspalte enthält, die eine Adressstruktur mit einem Land verknüpft.


Ich habe das tatsächlich selbst in Betracht gezogen. Zusätzlich zu oder vielleicht anstelle einer Tabelle, die Spalten auf Eingabeaufforderungen basierend auf dem Land abbildet, dachte ich darüber nach, aktualisierbare Ansichten für jedes spezifische Adressformat zu erstellen. Habe noch nicht den Abzug gedrückt, aber darüber nachgedacht.
Andrew Steitz

1

Wenn Sie jemals eine Adresse überprüfen oder zur Verarbeitung von Kreditkartenzahlungen verwenden müssen, benötigen Sie zumindest eine kleine Struktur. Ein Freiform-Textblock funktioniert dafür nicht sehr gut.

Die Postleitzahl ist ein allgemeines optionales Feld zum Validieren von Zahlungskartentransaktionen ohne Verwendung der gesamten Adresse. Haben Sie also ein separates und großzügiges Feld dafür (mindestens 10 Zeichen).



-2

Ich würde einfach alle Felder in einem großen NVARCHAR (1000) -Feld zusammenfügen, mit einem Textbereichselement, für das der Benutzer den Wert eingeben kann (es sei denn, Sie möchten eine Analyse für z. B. Postleitzahlen durchführen). Alle diese Eingaben für Adresszeile 1, Adresszeile 2 usw. sind nur dann so ärgerlich, wenn Sie eine Adresse haben, die nicht gut zu diesem Format passt (und Sie wissen, dass es andere Länder als die USA gibt).


3
Was für eine schreckliche Idee! In einem "Kommentar" ist nicht genügend Platz, um den Albtraum zu beschreiben, den dies einlädt. Es ist besser, ein wenig mehr Zeit damit zu verbringen, es richtig zu entwerfen, als danach zu versuchen, das Chaos zu entwirren. Siehe Samm Coopers Antwort. Ich glaube, ich habe hier auf SO nur eine andere Antwort abgelehnt, aber diese hat definitiv eine Ablehnung von mir erhalten.
Andrew Steitz

Welches Durcheinander? Wofür benötigen Sie die Daten? Oft brauchen Sie es nur, um es direkt an einen Etikettendrucker oder ähnliches weiterzuleiten, und dann können Sie es einfach als Textklecks behandeln. In anderen
Fällen interessieren

2
OP erwähnte nicht, dass "es nur an einen Etikettendrucker weitergegeben werden muss", und bei jedem Auftrag, den ich jemals hatte, haben wir die Adresse als "Daten" verwendet, Berichte erstellt und Steuern erhoben (Colorado-Umsatzsteuer für Geräte, die in ein neues Zuhause gebracht werden) variieren von einer Straßenseite zur anderen), weisen Vertriebsmitarbeitern Leads zu, erfüllen die Compliance-Anforderungen der Regierung, die Liste geht weiter und weiter. Das "Zerstören" von Daten (indem bestimmte Elemente in einem Feld zusammengefasst werden oder keine verfügbaren Daten erfasst werden) ist eine "Sünde" in meinem Buch und hat sich immer als der Albtraum erwiesen, vor dem ich gewarnt habe, als die Leute mich ignorierten.
Andrew Steitz

Wenn Sie später feststellen, dass Sie keine Daten benötigt haben, können Sie diese später jederzeit "zerstören". Das "Erstellen" von Daten reicht von Albtraum (Aufteilen von Informationen in separate Felder) bis Unmögliches (Erfassen von Daten nachträglich). Wenn das OP gesagt hätte: "Ich muss es nur an den Etikettendrucker senden", hätte ich Ihre Antwort begrüßt und positiv bewertet. Ohne eine spezielle Erwähnung von so etwas steht ein Vorschlag zur "Zerstörung" von Daten, IMO, jedoch kurz vor dem Verantwortungslosen oder gar Gemeinen.
Andrew Steitz

Wo ich gearbeitet habe (hauptsächlich E-Commerce), neigen wir dazu, es in 5-6 verschiedenen Feldern zu speichern, aber wir tun niemals etwas anderes mit den Informationen, als sie zum Senden an die Lieferung zu verwenden.
Erikkallen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.