Wir haben ein Team, das die Tabellen und Relationen für Softwareentwickler erstellt. In unserer Organisation ist die Durchsetzung der 3NF-Normalisierung recht streng. Um ehrlich zu sein, stimme ich angesichts der Größe unserer Organisation und der Veränderungen der Bedürfnisse oder Kunden im Laufe der Zeit zu. Es gibt nur einen Bereich, bei dem mir die Gründe für ihre Designentscheidung nicht klar sind: Adressen.
Während sich dies hauptsächlich auf Adressen in den Vereinigten Staaten konzentriert, könnte dies meines Erachtens auf jedes Land zutreffen, das dies tut. Jedes Stück einer Adresse erhält eine eigene Spalte in der Adresstabelle. Nehmen Sie zum Beispiel diese knorrige US-Adresse:
Attn: Jane Doe
485 1/2 N Smith St SW, APT 300B
Chicago, IL 11111-2222
Es würde in der Datenbank wie folgt aufgeteilt werden:
- Hausnummer: 485
- Straßenbruchteil: 1/2
- Straße in Fahrtrichtung: N (Nord)
- Straßenname: Smith
- Straßentyp: ST (Straße)
- Straße in Fahrtrichtung: SW (Südwesten)
- Stadt: Chicago
- Bundesstaat: IL (Illinois)
- Postleitzahl: 11111
- Postleitzahl 2222
- Land (vermutlich USA)
- Achtung: Jane Doe
- Postfach: NULL
- Wohnungstyp: APT (Wohnung)
- Wohnungsnummer: 300B
Und es würde einige andere Spalten geben, die sich auf ländliche Routen und Vertragsrouten beziehen. Darüber hinaus enthält unsere spezifische Anwendung wahrscheinlich einige internationale Adressen. Die Datenmodellierer sagten, sie würden Spalten hinzufügen, die für internationale Adressen spezifisch sind. Dies wären die normalen Felder für Zeile 1 und Zeile 2.
Zuerst dachte ich, das wäre WEG über Bord. Online-Recherchen beziehen sich wiederholt auf die Verwendung der Adresszeile 1, 2, 3 und möglicherweise 4 und die Aufteilung von Stadt, Region und Postleitzahl. Wir haben einen Anwendungsfall für unsere neue Anwendung, bei dem diese Granularität von Vorteil ist. Wir müssen überprüfen, ob der Benutzer ein Duplikat erstellt, und die Überprüfung der Adresse ist eine der Überprüfungen. Wir können es mit Adresszeile 1 und 2 zum Laufen bringen, aber es wäre schwieriger.
Für unsere spezifische Anwendung müssen wir mehrere Arten von Adressen für Unternehmen und Personen speichern (physisch, per Post, Versand usw.). Möglicherweise müssen wir druckbare Serienbriefe generieren, aber diese Anforderung wurde bisher noch nicht erörtert.
Einige andere Dinge, die Anwendungen in unserer Organisation unterstützen müssen:
- Auditing (mit vollständigen Verlaufstabellen)
- Drucken von Versandetiketten
- Gedruckte Formulare erstellen
- Berichterstattung (für nationale und regionale Regierungen)
Während unsere Anwendung möglicherweise nicht alles tut, was jede andere Anwendung tut, ist das Aufteilen von Adressen in mehrere Komponenten ein Unternehmensstandard, in dem ich arbeite. Unabhängig davon, ob unsere Anwendung davon profitieren würde, sind wir dazu gezwungen.
Teilweise verwandte StackOverflow-Frage: Wo ist ein guter Adress-Parser, der geschlossen wurde, aber zeigt, wie schwierig das Parsen von Adressen sein kann?
Damit ich ihre Designentscheidung besser verstehe und unseren Kunden von der Idee überzeugen kann ...
Welche Probleme werden durch die Aufteilung der Straße in einzelne Spalten gelöst?
Bonuspunkte für alle, die ein solches System implementiert haben, weil sie auf Probleme gestoßen sind.
quelle
Antworten:
Probleme, die durch Aufteilen gelöst werden können, umfassen
Validierung Jeder Teil des Namens kann mit einer Masterliste verglichen werden. Diejenigen, die nicht übereinstimmen, können abgelehnt werden. Postleitzahl ist ein naheliegendes Beispiel. Diese werden von einer unabhängigen Behörde ausgestellt und gewartet. Die einzig gültigen sind diejenigen, die von dieser Behörde ausgestellt wurden.
Sortieren und Selektieren Ich habe Fälle erlebt, in denen die Postgebühren gesenkt wurden, wenn die Post zu einem gewissen Grad an den bereits organisierten Zustelldienst übergeben wurde. Das Vorhandensein der entsprechenden Spalten führt zu einem spürbaren Geschäftswert.
Analyse Es kann nützlich sein, geografisch hierarchisch zu bestimmen, wohin Ihre Aufträge gehen. Dies kann zu Verkaufsinitiativen, Produktentwicklungen, Provisionszahlungen usw. führen.
Codeduplizierung Wenn alle Anwendungen in einer Organisation dasselbe Datenmodell (das des komplexesten Verbrauchers) verwenden, kann eine einzige Codebasis unternehmensweit übernommen und konsistent verwaltet werden. Endlos doppeltes Aufspalten der Haare kann vermieden oder zumindest an die Propellerköpfe delegiert werden. Adressen, die von verschiedenen Teilen der Organisation gehalten werden, können konsistent aktualisiert werden. Kundenservice und Zufriedenheit können gesteigert werden. Der Entwicklungsaufwand kann sich auf die einzigartigen, hochwertigen Teile eines Systems konzentrieren.
Rechtliche Aspekte Gesetze und Steuern variieren je nach Rechtsprechung. Durch die getrennte Erfassung der detaillierten Adresswerte ist es einfacher, Transaktionsdaten mit Compliance-Anforderungen in Bezug zu setzen.
Duplizieren Adressen, die als Text gespeichert sind, können auf einfache Weise gefälscht werden, indem ein Element in die nächste Zeile verschoben oder einige Teile neu geordnet werden. Vollständig analysierte Adressen lassen sich leichter vergleichen. Dies kann ein einfaches Problem der Datenqualität sein oder Konformitäts- oder Kreditprobleme mit sich bringen, wenn beispielsweise mehrere Shell-Unternehmen große Aufträge an dieselbe Lieferadresse ausführen oder eine Kreditkarte verwendet wird, um in kurzer Zeit an viele verteilte Standorte zu liefern.
Separat gehaltene Formatierungsteile können nach Bedarf kombiniert werden. Wenn beispielsweise lange, dünne Drucketiketten billig werden, können Sie sie neu formatieren, um sie zu verwenden.
Natürlich kann keines von diesen auf eine bestimmte Anwendung zutreffen. Daten dieses Typs lassen sich bei der Erfassung viel einfacher analysieren und an der Quelle validieren als je zuvor bei der Nachanalyse. Selbst bei YAGNI ist es möglicherweise besser, den zusätzlichen Aufwand für geringe Kosten und potenzielle zukünftige Einsparungen in den Vordergrund zu stellen.
Schließlich würde ich den menschlichen Faktor nicht entlassen. Das Datenmodell wird von Datenmodellierern erstellt. Es ist was sie tun. Das ist ihr Beruf. Sie werden dir nicht sagen, du sollst es einfach in einen BLOB werfen, oder?
quelle
Ich habe sieben Jahre lang Software für einen Verlag entwickelt. Eines der größten Probleme, mit dem wir uns jemals befasst haben, war das Parsen von Adressen in Abonnementlisten. Es ist nützlich, Adressen in verschiedene Felder aufzuteilen, aber Sie können NIEMALS alle möglichen pathologischen Abweichungen von Adressformaten und -komponenten, die das menschliche Gehirn entwickeln kann, berücksichtigen.
Jeder Ort kann seine Macken haben, und das ist nur in den USA. Werfen in anderen Ländern und Dinge werden sehr schnell unhandlich für jeden Ansatz, der jede Adresse analysieren möchte. Nur zwei Beispiele:
In Spanien steht die Straßennummer immer nach dem Straßennamen und einem Komma, und viele Adressen enthalten eine Ordnungszahl wie 1 ° oder 3ª sowie Abkürzungen für "links" ("Izda" bedeutet "linke Tür nach") Sie steigen die Treppe hinauf), "rechts" ("Dcha") oder andere Möglichkeiten. Multiplizieren Sie nun diese Eigenart mit der Anzahl der Länder und Gebiete mit unterschiedlichen historischen Adressengewohnheiten ... (Japan? Ländliches England? Korea? China?)
In Portland, OR, gibt es NS- und EW-Achsen, die die Stadt in NW-, NE-, SW- und SE-Quadranten unterteilen (sowie einen N- "Quadranten", aber ich schweife ab). NS-Straßen werden von dieser Achse aus inkrementell nach Osten und Westen nummeriert, und Adressen auf EW-Straßen werden durch die NS-Straßennummer als "Hundertblock" der Nummer diktiert (dh ein Haus auf einer EW-Straße zwischen der 11. und 12. Allee hätte eine Nummer) wie 1123). Ziemlich Standardmaterial für US-Adressen.
Jeder so oft laufen Sie in eine Portland - Adresse wie 0205 SW Nebraska St . Eine führende Null? WTF? Da geht meine
integer
Spalte für Hausnummer.Beim Einrichten des Gitters wurde die NS-Achse durch den Willamette-Fluss definiert. Alles östlich des Flusses war nordöstlich oder südöstlich und westlich des Flusses nordwestlich oder südwestlich. Als die Stadt nach Süden wuchs, stieß man auf die unangenehme Tatsache, dass sich der Fluss nach Osten schlängelt. Wenn man also die Achse nach Süden projiziert, hat man dieses problematische Gebiet, das sich auf der "Westseite" des Flusses befindet, aber östlich der Achse. Die Lösung bestand darin, eine führende Null hinzuzufügen, und zwar ein Minuszeichen , wobei die Zahlen von der Achsenlinie nach Osten zunehmen.
Wenn ich Sie wäre, würde ich die Hoffnung aufgeben, das ultimative System zu entwerfen. Sie können nicht alle Möglichkeiten abdecken, und neue werden geschaffen, wenn die Menschheit in zuvor unbebautes Land vordringt.
Sehen Sie sich für US-Adressen an, was der USPS bereits bei der Adressstandardisierung getan hat, und denken Sie daran, die
house_number
Spalte a zu machenvarchar
. Finden Sie heraus, wie Sie die 1634 EN Fort Lane Ave analysieren werden .Für den Rest der Welt würde ich wahrscheinlich versuchen, zusätzliche Felder zu abstrahieren, um 80-90% dessen abzudecken, was wahrscheinlich auftaucht, und eine Reihe von nicht interpretierten Feldern bereitstellen, die bei Bedarf alles andere verarbeiten können. Dh wenn Ihr Parser eine Adresse nicht verarbeiten kann, speichern Sie sie ungeparst und als solche gekennzeichnet. Wenn es Ihnen gelingt, eine Adresse zu analysieren, merken Sie sich die Reihenfolge, in der Sie die verschiedenen Felder gefunden haben, damit Sie sie zu einem Ergebnis zusammensetzen können.
Ich wollte sagen, dass das wichtigste Feld die Postleitzahl sein wird, aber auch das ist vielerorts nicht selbstverständlich.
Viel Glück. Dies kann ein lustiges und äußerst frustrierendes Unterfangen sein, aber der Schlüssel zur Vernunft besteht darin, zu wissen, wann der Versuch beendet werden muss, und die Eingabe nur ungeparst oder teilweise geparst mit der ursprünglichen Eingabe als Sicherung zu speichern.
quelle
<input type="number">
. Ich hatte Angst, dass dies nicht der Fall sein könnte (zumindest in Firefox).varchar
und ein mehrzeiliges Freiform-Textfeld!Wie bei allen Designfragen gibt es ein enorm qualifiziertes "es kommt darauf an". Es hängt von Ihrer Datenstory ab - wie die Daten gesammelt werden, wie sie verwendet werden, wie sie aktualisiert werden usw. Alle meine Kommentare sollten als Diskussionspunkte und nicht als Anleitungen zur Beantwortung verstanden werden.
Es hört sich so an, als könnten Sie von der Verwendung eines Adressüberprüfungsdienstes mehr profitieren, als wenn Sie versuchen, selbst einen zu erstellen. Viele dieser Dienste sind zwar kostspielig, bringen jedoch erhebliche Versandrabatte mit sich.
Natürlich gibt es hier einen Kompromiss für bestimmte Datengeschichten. Sie können die analysierten Adressabschnitte beibehalten und eine berechnete Spalte (wahrscheinlich mehrere Spalten) für die kombinierte Adresse erstellen. Dies ist eine Antwort auf die Implementierung, mit allen normalen Vorbehalten.
Ich habe das geparste Adress-Design implementiert. Wir brauchten dies unbedingt für die Datenqualität UND die Datenverarbeitung. Aber das war ein Geschäft, das physische Adressen, Postanschriften, virtuelle Adressen usw. hatte.
Das andere Problem, das auftreten kann, ist, dass bei verschiedenen Postdiensten dieselben Informationen in verschiedenen Formaten / Aufträgen / etc. Angezeigt werden müssen. Wenn Sie also die Teile modellieren, können Sie dieselben Informationen in einer Vielzahl von Formaten und Layouts anzeigen.
Schließlich müssen Sie kein internationales Geschäft betreiben, um internationale Daten zu unterstützen. Sogar in den USA ansässige Unternehmen müssen internationale Adressen unterstützen. Es ist ein riesiger Datenfehler anzunehmen, dass Sie das niemals haben werden. Kunden ziehen um, Lieferanten ändern ihr Hauptquartier, Lieferantenkontaktinformationen können international sein, selbst wenn sie ein US-Hauptquartier haben. Auch wenn Ihre aktuellen Systeme diesen Fehler gemacht haben, möchten Sie diesen nicht weitertragen.
Ich kann das Schreiben und Bloggen von Graham Rhind nur empfehlen. Er ist der Experte im Datenbereich für Adressen aller Art und die damit verbundenen Kompromisse.
* Alles, was ich hier gesagt habe, ist eine grobe Verallgemeinerung. Es gibt so viele Fragen, bei denen ich helfen muss, eine Designlösung zu finden, dass es einige Stunden dauern kann, bis wir uns unterhalten. Wahrscheinlich auch einige Bilder und Datenprofile. Und dann viele wirklich skurrile Datengeschichten über Adressen.
quelle
Abgesehen von der enormen Herausforderung, den unvorhersehbaren Kauderwelsch, den die Leute liefern, richtig zu analysieren, bietet das Parsen den Vorteil, dass Sie Dimensionen für das Gruppieren und Sortieren erhalten. Postleitzahl zum Beispiel. Das Parsen einer bestimmten Dimension zahlt sich jedoch erst aus, wenn Sie diese Dimension gruppieren oder sortieren müssen.
Was ist überhaupt eine Adresse? Sie könnten einen guten Fall machen, dass es sich um eine Standortkennung handelt, aber Sie könnten auch einen guten Fall machen, dass es sich um Lieferanweisungen handelt - "Die Straße runter von der Zementfabrik". In Australien denken die Leute, Postleitzahlen seien Ortskennungen, aber sie sind keine Routing-Codes - Lieferanweisungen. 4702 ist Rockhampton Mail Center, ein wichtiger Verteilungsknoten, der eine Region vom Meer bis zu Emerald, einer Bergbaustadt 300 km landeinwärts, bedient.
Wenn Sie Standorte identifizieren möchten, können Bing und Google direkt aus der nicht analysierten Zeichenfolge GPS-Koordinaten geocodieren, die zusammen mit der nicht analysierten Zeichenfolge in einer kleinen, einfachen Tabelle gespeichert werden können. Sie verwenden den einzigen allgemeinen Ansatz mit der Chance auf konstant gute Ergebnisse: gewichtetes partielles Matching mit einer riesigen Datenbank validierter Ergebnisse.
Wenn Sie Anweisungen für die Zustellung wünschen, sollten Sie die nicht analysierte Zeichenfolge trotzdem beibehalten, da sie alles enthalten kann .
Beachten Sie, dass ich in beiden Fällen empfohlen habe, die nicht analysierte Zeichenfolge beizubehalten. Das ist, weil
Vermutlich handelt es sich bei einer Adresse immer um Zustellanweisungen, die mindestens eine Standortkennung enthalten. Ein an "123 Main st, Emerald 4702" adressierter Brief kodiert drei Orte: RMC im nördlichen Teil von Rockhampton, Emerald, und eine Straßenadresse. Die Post von Rockhampton schickt sie einfach an RMC. RMC wird es an die Emerald-Post senden, und die Emerald-Post weiß hoffentlich, wo sich die Hauptstraße 123 befindet.
quelle
Ich habe ein solches System schon einmal implementiert, allerdings in den Niederlanden. Die Sache ist, diese Art von Informationen kann sich auf mehr Arten ändern, als Sie denken. Straßen werden umbenannt, Städte zusammengeführt und so weiter. Es ist schön, diese Art von Informationen aktualisieren zu können, ohne die Adressen als einzelne Zeichenfolge zu analysieren.
quelle
Die Trennung von Postleitzahl, Gebäudename und Straßenname kann sinnvoll sein. Aber wenn Sie dann anfangen, "Stadt", "Gebiet" usw. hinzuzufügen, wird es fraglich, verglichen mit nur Linie 1, Linie 2 usw. Das Problem ist, dass selbst ich und meine Frau uns nicht über den Namen der Stadt einig sind, in der wir leben! Soll der Name "Dorf" in das Feld "Stadt" eingefügt werden, oder steht er in der Zeile unter dem Straßennamen, während die lokale Stadt in das Feld "Stadt" eingefügt wird? (Manche Leute sind beleidigt, wenn Sie anrufen, wo sie ein Dorf statt einer Stadt leben, andere am selben Ort sind beleidigt, wenn Sie es eine Stadt statt eines Dorfes nennen!)
Daher ist der Versuch, etwas Besonderes zu tun, nicht besser als das von Ihnen verwendete System zur Adressüberprüfung. Aber es wird noch schlimmer. In Großbritannien sollten ALLE Adressen eine Postleitzahl haben, aber die Postleitzahl wird erst irgendwann nach dem Bau eines Hauses vergeben.
quelle
Zusätzlich zu den Problemen, die bereits in anderen Antworten erwähnt wurden, sind Straßennamen in einigen Sprachen - insbesondere in germanischer Sprache - in der Regel zusammengesetzt. Zum Beispiel ist es in vielen deutschen Städten üblich, eine "Bahnhofstraße" zu haben, die Straße, die zum Bahnhof führt ("Bahnhof" bedeutet Eisenbahn / Bahnhof, "Straße" bedeutet Straße). Sicherlich könnten Sie diese beiden Komponenten trennen, aber jetzt, wenn Sie sie (programmgesteuert) wieder zusammensetzen möchten, geraten Sie in Deklinationsfragen.
Oder in den "romanischen" oder lateinischen Sprachen haben Sie häufig Straßennamen der Form "Rue de la Pais" oder "Boulevard des Champs-Élysées". Jetzt haben Sie eine Präposition ("de") und einen bestimmten Artikel ("le" oder "la") in der Mischung - und sie können kombiniert werden. Stellen sie einen Teil des Straßentyps oder Straßennamens dar? (Sie müssen sie wahrscheinlich irgendwo aufbewahren, sonst geraten Sie wieder in Deklination.)
Ich habe mal so etwas modelliert. Es war jedoch eine sehr kleine Anwendung für das Büro für die Instandhaltung von Wohnimmobilien einer mittelgroßen Universität (in den USA). Ich habe die Adressen aus folgenden Gründen sehr granular gemacht:
... und andere Gründe, an die ich mich nicht mehr erinnere. (Dies war in den späten 1980er Jahren.)
Auch dies machte nur Sinn, weil nur eine relativ geringe Anzahl von Adressen (und Adressformatierungsregeln) zu behandeln war. Ich glaube nicht, dass sich dieser Ansatz aus Gründen, die bereits in anderen Antworten genannt wurden, skalieren lässt, auch wenn er auf US-Adressen beschränkt ist.
quelle