Hallo liebes Forum, ich plane gerade eine MySQL Datenbank, in der ich Kunden aus dem Inland speichern möchte. Für den Anfang würden mir 2 Adressen pro Kunde völlig ausreichen, aber mir ist natürlich klar, dass sich Anforderungen ändern können und vermutlich auch werden. Es folgt ein Minimal-Beispiel, wie ich mir das gespeichert in einer Datenbank vorstellen könnte: Tabelle: "adressen" Spalten: id kunde_id adresstyp_id (int, verweist in Tabelle "adresstypen" z.B. auf "Privat" oder "Geschäftlich") strasse hausnummer plz ort land Bezüglich der Standard-Anschrift oder auch primären Adresse bin ich mir nicht sicher, ob ich die nun als bool in den Adressen speichern soll, oder lieber als Fremdschlüssel in der Kundentabelle...ich tendiere eher zur Kundentabelle, da dann weniger Redundanz vorhanden ist. Aber gibt es da nicht irgendwelche best practices für das Speichern von relativ einfachen Adress-Datensätzen? Würdet ihr das genauso oder anders machen und warum? Grüße...Bernd
Bernd schrieb: > gibt es da nicht irgendwelche best practices für das Speichern von > relativ einfachen Adress-Datensätzen? Erst mal sollte man begreifen, dass nicht in jedem Land Adressen gleich wie in Deutschland notiert werden. Nicht jeder Ort hat Strassen, manche Orte mehr als 1 Postleitzahl. Halte einfach 5 Adresszeilen plus Land (in Sprache des Absenders bzw. französisch) bereit. Privat und geschäftlich sind unnütz, eher Rechnungsadresse und Lieferadresse, da kann sich auch der Name unterscheiden.
Bernd schrieb: > in der ich Kunden aus dem Inland > speichern möchte. MaWin schrieb: > dass nicht in jedem Land Adressen gleich > wie in Deutschland notiert werden. Wenn er nur Inland speichern will, muss er wohl nicht alle Adressvarianten der ganzen Welt berücksichtigen.
Hallo MaWin, MaWin schrieb: > Erst mal sollte man begreifen, dass nicht in jedem Land Adressen gleich > wie in Deutschland notiert werden. Ich werde nur Adressen aus dem Inland speichern. MaWin schrieb: > Nicht jeder Ort hat Strassen Ich bin mir sicher, dass man in so einem Fall einfach den Ort in das Straßenfeld eintragen kann und der Brief kommt trotzdem an, da am Zustellort eh jeder Briefträger wissen muss, wie der Hase läuft. Für die paar Ausnahmen soll man dann Gefahr laufen, bei der Weiterverarbeitung der Daten irgendwann das Problem zu haben, dass die importierende Software die Eingabe in getrennten Feldern erwartet? Wenn ich das atomar speichere, kann ich ja jederzeit die Daten vermengen - andersrum ist das ungleich schwieriger. MaWin schrieb: > manche Orte mehr als 1 Postleitzahl. Wo spielt das bei mir eine Rolle? In das Feld kommt doch letztendlich nur eine(!) PLZ??? MaWin schrieb: > Privat und geschäftlich sind unnütz, eher Rechnungsadresse und > Lieferadresse, da kann sich auch der Name unterscheiden. Mist, an die Rechnungdadresse hatte ich bislang nicht gedacht! Ich arbeite mit Kunden, die entweder privat zu mir kommen oder von ihrer Firma im Rahmen einer Art Weiterbildung geschickt wurden. Insofern ist das für mich auch in anderen Bereichen der Datenbank wichtig, ob der Kundenstatus privat oder geschäftlich ist. Ist nur die Frage, wo man diese Information wie abspeichert? Vielen Dank und viele Grüße Bernd
Bernd schrieb: > ob ich die nun als bool in den Adressen speichern soll, > oder lieber als Fremdschlüssel in der Kundentabelle Nach den akademischen Regeln für Datenbanken müsstest du für alles, was mehr als einmal vorkommen kann, eine eigene Tabelle anlegen - also für Orte, weil mehrere Kunden am gleichen Ort wohnen können, für Bankverbindungen, darunter wiederum für die Banken, für Strassen, weil Kunden in der gleichen Strasse wohnen können, aber auch die gleiche Strasse in mehreren Orten vorkommt, und und und. Für deine Zwecke bringt das aber kaum Vorteile, macht die Sache aber beliebig kompliziert, daher mein Rat, lass es. Mach einfach einen Record für Kunden, in dem alles drinsteht, was du brauchst. Dann musst du dir auch keine Gedanken machen, wenn du einen Kunden löschst, ob du dann auch den Ort, die Strasse, das Bankkonto, die Bank usw. löschen kannst. Ich bin mir sicher, dass deine Festplatte nicht überläuft, nur weil du den Eintrag Berlin mehrfach drin hast. KISS - keep it simple and stupid Georg
Beitrag #5070359 wurde von einem Moderator gelöscht.
Bernd schrieb: > Hallo liebes Forum, > > ich plane gerade eine MySQL Datenbank, in der ich Kunden aus dem Inland > speichern möchte. Damit hast du wenigstens schon mal ein überschaubares Problemfeld. :-) [...] > Tabelle: "adressen" > Spalten: > id > kunde_id > adresstyp_id (int, verweist in Tabelle "adresstypen" z.B. auf "Privat" > oder "Geschäftlich") Du solltest da auch noch ggfls. zwischen Hausanschrift (d.h. mit Strasse und Hausnummer), Postfachanschrift, Packstationsadressen (und deren Äquivalenten anderer Paketdienste), und Großempfängeranschriften unterscheiden. Das wird spätestens beim Userinterface bzw. der korrekten Ausgabe zur Adressierung von Sendungen und bei der Adressprüfung wichtig sein. > strasse > hausnummer Da dann nicht vergessen, dass die Hausnummer auch Buchstaben enthalten kann. Und einen Adreßzusatz (Hinterhaus, Etage, Wohnungs-/Zimmernr.) nicht vergessen. Und Mannheim hat Quadrate, bei denen sieht das auch ein wenig anders aus (ich habe auch leider schon zuviel Software gesehen, die mit diesen Angaben nicht klar kam). Kleine Orte haben manchmal nur Hausnummern, keine Strassenangabe. > plz > ort > land Land ist gut - die meisten Leute vergessen die Sondergebiete, die sowohl deutsche als auch z.B. schweizer bzw. österreichische Anschriften haben. > Bezüglich der Standard-Anschrift oder auch primären Adresse bin ich mir > nicht sicher, ob ich die nun als bool in den Adressen speichern soll, > oder lieber als Fremdschlüssel in der Kundentabelle...ich tendiere eher > zur Kundentabelle, da dann weniger Redundanz vorhanden ist. Yep, foreign key ist da wartungstechnisch viel freundlicher. Bei Adressänderungen brauchst du nur die Adresse selbst zu ändern. > Aber gibt es > da nicht irgendwelche best practices für das Speichern von relativ > einfachen Adress-Datensätzen? Eigentlich gibt es da nur "frequently made mistakes". "Best practice" hängt sehr stark von den konkreten Nutzungsanforderungen ab. Ich habe z.B. noch Gemeindeschlüssel und Geokoordinaten mit dabei, weil ich das für rechtliche Zuordnung (zu welcher Gebietskörperschaft gehört der Ort, wg. lokaler Regelungen) oder Kartendarstellung brauchte. Ralf (diesbezüglich beruflich vorgeschädigt)
Bernd schrieb: > kunde_id > adresstyp_id (int, verweist in Tabelle "adresstypen" z.B. auf "Privat" > oder "Geschäftlich") Das gehört nicht zu einer Adresse. Wie bildest du den Fall ab, wenn private und geschäftliche Adresse gleich sind?
Bernd schrieb: > ich plane gerade eine MySQL Datenbank, in der ich Kunden aus dem Inland > speichern möchte. Für den Anfang würden mir 2 Adressen pro Kunde völlig > ausreichen, aber mir ist natürlich klar, dass sich Anforderungen ändern > können und vermutlich auch werden. Ist für solche Daten wirklich ein RDBMS notwendig? Die ganzen Features wie Schemasicherheit, Transaktionssicherheit, referentielle Integrität, Multi-Version Concurrency Control, kurz: alles, was ein RDBMS bietet, ist in diesem Fall IMHO völlig überflüssig. Im Enterprise-Umfeld werden solche Daten deswegen meistens nicht in RDBMS, sondern in einem Verzeichnisdienst gespeichert, etwa einem LDAP-Server wie OpenLDAP oder Active Directory. Die entsprechende Serversoftware ist für Lesezugriffe optimiert, bietet umfssende Möglichkeiten zur Strukturierung der Daten und ein feingranuliertes Privilegiensystem für den Zugang. Ich persönlich würde aber vielleicht sogar den Ansatz einer modernen NoSQL-Datenbank wählen. Viele sind schemafrei und speichern lediglich JSON-Daten, dadurch können damit unterschiedlichste Adreßformate genutzt werden. Mein ganz persönlicher Favorit wäre hier Elasticsearch: - speichert und indexiert JSON-Dokumente, auch verschachtelte - verfügt über äußerst leistungsfähige Möglichkeiten zur Volltextsuche - beherrscht die phonetische Suche nach verschiedenen Algorithmen - bietet eine Fuzzy-Suche mit Levenshtein-Algorithmus - ist extrem performant, leicht zu installieren und zu betreiben - hat eine ausdrucksstarke und flexible Such-Syntax - Speicherung der Objekte, Suchanfragen und -Antworten alle in JSON Ein Kunde könnte dann so aussehen:
1 | { |
2 | "nachname": "Plug", |
3 | "vorname": "Sheeva", |
4 | "adressen": [ |
5 | { |
6 | "adresszeile1": "Dingsstraße 4", |
7 | "adresszeile2": "12345 Bums", |
8 | "flags": ["privat", "geschäftlich"] |
9 | }, |
10 | { |
11 | "adresszeile1": "Residence des Fleurs", |
12 | "adresszeile2": "8 Rue de Wattrelos", |
13 | "adresszeile3": "75310 Paris", |
14 | "flags": ["ferienhaus"] |
15 | } |
16 | ], |
17 | "telefonnummern": [ |
18 | { |
19 | "nummer": "2345678", |
20 | "flags": ["privat"] |
21 | }, |
22 | { |
23 | "nummer": "5678901", |
24 | "flags": ["geschäftlich"] |
25 | ], |
26 | "dokumente": [ |
27 | { |
28 | "typ": ["schreiben", "eingang"], |
29 | "datum": "2017-01-01", |
30 | "betreff": "Mäuse im Ferienhaus", |
31 | "inhalt": "Die Mäuseplage wird immer schlimmer." |
32 | }, |
33 | { |
34 | "typ": ["schreiben", "ausgang"], |
35 | "datum": "2017-01-02", |
36 | "betreff": "Mäuse im Ferienhaus", |
37 | "inhalt": "Versuchen Sie es mit Mausefallen." |
38 | }, |
39 | { |
40 | "typ": ["rechnung", "ausgang"], |
41 | "datum": "2017-01-03", |
42 | "betreff": "Mäuse im Ferienhaus", |
43 | "positionen": [ |
44 | { |
45 | "nummer": 1, |
46 | "titel": "Ratschlag erteilt", |
47 | "netto": 10.00, |
48 | "steuersatz": 19.0 |
49 | } |
50 | ] |
51 | } |
52 | ] |
53 | } |
...you get the idea -- wobei ich die Schreiben und Rechnungen vermutlich eher als Relationen modellieren würde, egal. Am Ende liegen dann alle, und zwar wirklich alle Kundendaten hübsch zusammen, können nach verschiedenen Kriterien und in Bruchteilen von Sekunden durchsucht werden, und wenn die Firma wächst und dem Server die Luft ausgeht, klemmt man einfach weitere daneben und konfiguriert daraus einen hochverfügbaren Cluster. Der größte Nachteil ist, daß Elasticsearch eine sehr umfangreiche Software ist und es einigen Einarbeitungsaufwandes bedarf, um seine volle Leistungsfähigkeit ausnutzen zu können. Ein erstes Setup ist hingegen ausgesprochen einfach und auch von Laien problemlos zu machen.
Ich gehe auch klar mit json Dateien. Die sind sehr einfach zu handeln und erfüllen genau deinen Zweck. Im gleichen Zuge hab ich mich an das Thema der doppelten Einträge erinnert: https://stackoverflow.com/questions/37568/find-duplicate-addresses-in-database-stop-users-entering-them-early Vielleicht noch ein Anstoß für dich.
J. F. schrieb: > Ich gehe auch klar mit json Dateien. Die sind sehr einfach zu handeln > und erfüllen genau deinen Zweck. Im gleichen Zuge hab ich mich an das > Thema der doppelten Einträge erinnert: > > https://stackoverflow.com/questions/37568/find-duplicate-addresses-in-database-stop-users-entering-them-early > > Vielleicht noch ein Anstoß für dich. Im Zusammenhang mit Deinem Hinweis auf Adreß-Duplikate sei vielleicht noch darauf hingewiesen, daß jeder von uns wahrscheinlich täglich Elasticsearch benutzt: damit werden nämlich die Vorschläge bei der Eingabe im Suchfeld der Wikipedia erzeugt. So etwas kann man natürlich auch für eine Adreßeingabe abwandeln: sobald jemand "Quell" eingibt, kann das Eingabefeld gleich die Möglichkeiten "Quellenstraße" und "Am Quellwasser" anbieten. Das erspart Tipparbeit, vermeidet unschöne Fehler, und vorhandene Fehler können durch diese Vorschläge relativ schnell auffallen und korrigiert werden.
Felder : Titel (Hr, Frau, Dr, Prof, General, Hochwuerden..) als Varchar[16] Vorname als Varchar[32] Nachname als Varchar[32] Firma als Varchar[32] Abteilung als Varchar[32] zusaetzliche Linie als Varchar[32] Strasse als Varchar[32] PLZ als Varchar[16] Ort als Varchar[32] Provinz als Varchar[32] Land als Varchar[32] Vergiss die nur-Inland Adressen. Es geht zu schnell bis du auch Ausland Adressen hast. Wichtig bei Suchen in der Tabelle : if gross(Eingabe) == gross(Tabelle) es gibt Leute, die schreiben nur Grossbuchstaben if gross(Eingabe Name) == gross(Tabelle Name) oder gross(Eingabe Name) == gross(Tabelle Vorname) if gross(Eingabe Vorname) == gross(Tabelle Vorname) oder gross(Eingabe Vorname) == gross(Tabelle Name) Bei manchen Eintraegen koennen die beiden vertauscht sein. Falls gewuenscht kann ich Beispiele liefern.
:
Bearbeitet durch User
Bezüglich Adressen (das wohl mit eins der ekelhaftesten Themen bzgl. Verarbeitung schlechthin): https://www.mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses/ (old but gold) Aus Entwicklersicht finde ich daher den Ansatz von what3words ganz nett aber verbesserungswürdig :-) https://en.wikipedia.org/wiki/What3words
Sapperlot W. schrieb: > Vorname als Varchar[32] > Nachname als Varchar[32] > Firma als Varchar[32] > Abteilung als Varchar[32] > zusaetzliche Linie als Varchar[32] > Strasse als Varchar[32] > PLZ als Varchar[16] > Ort als Varchar[32] > Provinz als Varchar[32] > Land als Varchar[32] Typische Pippi Langstrumpf Datenbank "Ich mach mir die Welt wie sie mir gefällt". Bitte lasst solche Deppen nicht in die Softwareentwicklung. Es gibt genpügend Leute, deren Adressangaben nicht in diese Feldbreiten passen.
> Es gibt genpügend Leute, deren Adressangaben nicht in diese Feldbreiten
passen.
Ok, welche Feldbreiten dann ? Eigentlich waere ein Text-feld fuer alles
am Stueck eh passender.
Dann geht eine Anschrift mit "Sehr geerter Dr Bla Blub" nicht mehr.
:
Bearbeitet durch User
Sapperlot W. schrieb: > Ok, welche Feldbreiten dann Ich sag nur: Hadschi Halef Omar Ben Hadschi Abul Abbas Ibn Hadschi ... oder https://de.wikipedia.org/wiki/Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
> Nicht jeder Ort hat Strassen, ... Ein solcher Ort ist z.B. Baltrum https://de.wikipedia.org/wiki/Baltrum#Inselverkehr > Auf Baltrum gibt es keine offiziellen Straßennamen, sondern lediglich > Hausnummern, ... Nur so zur Info.
Michael B. schrieb: > Sapperlot W. schrieb: >> Vorname als Varchar[32] >> Nachname als Varchar[32] >> Firma als Varchar[32] >> Abteilung als Varchar[32] >> zusaetzliche Linie als Varchar[32] >> Strasse als Varchar[32] >> PLZ als Varchar[16] >> Ort als Varchar[32] >> Provinz als Varchar[32] >> Land als Varchar[32] > > Typische Pippi Langstrumpf Datenbank "Ich mach mir die Welt wie sie mir > gefällt". Bitte lasst solche Deppen nicht in die Softwareentwicklung. > > Es gibt genpügend Leute, deren Adressangaben nicht in diese Feldbreiten > passen. Zum Beispiel Karl-Theodor Maria Nikolaus Johann Jacob Philipp Franz Joseph Sylvester Buhl-Freiherr von und zu Guttenberg... Aber die Feldbreiten und sogar das Datenmodell sind dabei nicht einmal das wesentliche Problem. Das Problem ist, was Donald Knuth schon 1973 als Kern der ganzen Problematik erkannt hat: "premature optimization is the root of all evil". In der heutigen Zeit, in der volatiler und persistenter Speicher nur popelige Centbeträge kosten, ist es total bescheuert, schon an solchen Stellen am Speicher zu sparen. Ein sekundäres Problem ergibt sich zusätzlich daraus, daß MySQL nur ein SQL-ähnliches Festplatteninterface ist (Joe Celko). Kurz gesagt: solange MySQL nicht in einem seiner STRICT-Modus betrieben wird, kürzt es Werte, die nicht in die vorgesehenen Spalten passen, stumpf ein und verwirft den übrigen Teil. Aus Karl-Theodor wird, wenn er in eine VARCHAR(32)-Spalte eingetragen wird, ein "Karl-Theodor Maria Nikolaus Joha". Eine (angeblich) Datenbank, die Daten ohne Fehlermeldung einfach wegwirft? Soetwas ist mit "Scheiße" noch sehr wohlwollend beschrieben. Wer eine leistungsfähige, hochperformante, stabile, standardkompatible OpenSource-Datenbank haben will, nimmt PostgreSQL. Das ist ein bisschen spröde, ähnlich wie Solaris oder *BSD im Vergleich zu Linux, aber dafür unterstützt PostgreSQL wenigstens ältere SQL-Standards korrekt, ist bei größeren Datenmengen wesentlich performanter, und besitzt eine erheblich umfangreichere, stabile Funktionalität als MySQL und als die meisten der kommerziellen Wettbewerber. Und wer einen schnellen Datenverwalter sucht, der horizontal skalierbar, replizierbar, sharding- und cluteringfähig ist, der greift eventuell zu PostgreSQL-XL -- oder lieber zu einer NoSQL-Datenbank wie Elasticsearch, Apache Solr, MongoDB oder CouchDB.
Hallo, Bernd schrieb: > Ich > arbeite mit Kunden, die entweder privat zu mir kommen oder von ihrer > Firma im Rahmen einer Art Weiterbildung geschickt wurden. Insofern ist > das für mich auch in anderen Bereichen der Datenbank wichtig, ob der > Kundenstatus privat oder geschäftlich ist. Ist nur die Frage, wo man > diese Information wie abspeichert? nicht der Kunde ist privat oder geschäftlich sondern der Auftrag... Adresen selbst können durchuas privat oder geschäftlich sein, der Kunde wohnt dort und seine Firma ist woanders. Das dient aber nur z.B. einer Auswahl im Auftrag. Bei einem Privat-Auftrag werden die Privat-Adressen zuerst und die anderen darunert, bei einem Firmanauftrag andersrum. Verringert das Risiko, daß man dem Kunden die Lieferung mit der Palette Dildos zur Privatadresse schickt... Gruß aus Berlin Michael
:
Bearbeitet durch User
Eine gute und moderne Alternative zu MySQL ist MariaDB vom gleichen Entwickler. Und ja, für einfach strukturierte Daten, wie Adressen, ist eine SQL-gesteuerte relationale Datenbank nicht die schlechteste Idee. Will man keinen haarsträubenden Pfusch verfassen, so sollte man sich mindestens mal mit den Normalformen 1-3 befassen. Man möge auch bedenken, was mal mit den Adressen passieren soll - deren Speicherung ist doch bestimmt kein Selbstzweck. Jedes Versand- oder Frankierprogramm, jede Faktura benötigt klar geliederte Daten. Und wenn ein Dorf keine Straßennamen hat, dann setzt man einfach "Dorfstraße" ein, kommt immer an. Adressverwaltung kann auch durchaus kompliziert sein. Wir nutzen in unserer Firma z.B. ein selbstgeschriebenes ERP-System und haben echt 2 Jahre gekämpft, bis das nach unseren Ansprüchen funktioniert. Wir haben z.B. Adressen als Unterkriterium zu einem "Unternehmen", denn wir haben Adressen von Leuten, die bestellen und mit denen wir zum Auftrag inhaltlich kommunizieren. Dann wiederum andere Andressen zum selben Auftrag, wo die Produkte hin gesandt werden. Es kommen noch getrennte Rechnungsadressen dazu und der Gipfel waren die Aressen von Buchhaltungs-Services (durchaus auch den gleichen für mehere verschiedene Auftraggeber), wo die Rechnungen zwar postalisch oder per Mail hingehen - die aber nicht die Rechnungsempfänger in finanztechnischer Sicht sind. War 'ne harte Nummer ...
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.