Nach - Modellierung
Der Verein „Ceylon – Soforthilfe“ verkauft unter anderem Tee und Grußkarten aus Ceylon.
Der Sohn des langjährigen Vereinsvorsitzenden ist ganz stolz: "Ich habe die Zettelwirtschaft meines Vaters abgelöst und gebe die Daten für die zu druckenden Rechnungen in die Tabellenkalkulation ein!"
Hier sind ein paar Zeilen aus der ziemlich langen Tabelle abgedruckt:
Name |
Straße |
PLZ |
Ort |
Nr |
Versand |
Artikelbez |
Einzel |
Anzahl |
Gesamt |
Marlies Thebud |
Nymphenweg 31 |
D-42719 |
Solingen |
1 |
7,00 € |
Taibun - Schal |
12,00 € |
4 |
48,00 € |
|
|
|
|
|
|
Satz handgefertigter Ceylon - Grußkarten |
30,00 € |
2 |
60,00 € |
|
|
|
|
|
|
Packung Ceylon - Tee à 100g |
7,00 € |
7 |
49,00 € |
Christian Beier |
Katernberge 215 |
D-07819 |
Pillingsdorf |
2 |
5,00 € |
Satz handgefertigter Ceylon - Grußkarten |
30,00 € |
1 |
30,00 € |
Astrid + Harald Weber |
Kiefernweg 1 |
D-80335 |
München |
7 |
4,00 € |
Satz handgefertigter Ceylon - Grußkarten |
30,00 € |
2 |
60,00 € |
Marlies Thebud |
Nymphenweg 31 |
D-42719 |
Solingen |
8 |
6,00 € |
Packung Bio - Tee im Holzkästchen |
8,00 € |
2 |
16,00 € |
|
|
|
|
|
|
Satz handgefertigter Ceylon - Grußkarten |
30,00 € |
3 |
90,00 € |
Dr. Olaf Hellberg |
Wittkuller Str. 159 |
D-80335 |
München |
9 |
7,00 € |
Packung Ceylon - Tee à 100 g |
6,00 € |
2 |
12,00 € |
|
|
|
|
|
|
Packung Bio - Tee im Holzkästchen |
8,00 € |
2 |
16,00 € |
Um die Verwaltung zu automatisieren, wird eine Firma beauftragt, die aus der Tabelle eine Datenbank machen soll.
Was fällt an der Tabelle auf, was ist ggf. zu ergänzen?
Die freien Felder: Die Angaben gehören wohl zu der Zeile darüber.
Vorname und Nachname stehen in einem Feld, Suche und Sortierung nach Nachnamen sind so nicht möglich.
Die Kunden kommen mehrfach vor, die verkauften Artikel auch.
Schritt 1
Problem: Vorname und Nachname stehen zusammen in einem Feld. Man kann nicht nach Nachnamen sortieren.
Forderung: In jedem Feld darf nur eine Angabe stehen.
Lösung: Der Vorname bekommt eine eigene Spalte.
Schritt 2
Problem: Die Kunden und ihre Adressen kommen in mehreren (vielen) Zeilen vor, Artikel und ihre Einzelpreise auch. Das führt zu Schwierigkeiten, wenn etwa ein Kunde umzieht und sich die Adresse ändert. Soll dann die gesamte Datei durchsucht werden, um die Änderung bei allen Vorkommen durchzuführen? Wenn man dabei etwas übersieht, hat man widersprüchliche Angaben und weiß schließlich nicht, was richtig ist.
Forderung: Doppelte Angaben sind zu vermeiden.
Lösung: Die Kunden und die Artikel bekommen jeweils eine eigenen Tabelle mit einem zusätzlichen Primärschlüssel Kundennummer bzw. Artikelnummer.
Kunden
Nr |
Name |
Vorname |
Straße |
PLZ |
Ort |
1 |
Thebud |
Marlies |
Nymphenweg 31 |
D-42719 |
Solingen |
2 |
Beier |
Christian |
Katernberge 215 |
D-07819 |
Pillingsdorf |
3 |
Grabitz |
Ulf |
Lohmühler Weg 55 |
D-07819 |
Pillingsdorf |
4 |
Weber |
Astrid + Harald |
Kiefernweg 1 |
D-80335 |
München |
5 |
Hellberg |
Dr. Olaf |
Wittkuller Str. 159 |
D-80335 |
München |
Artikel
Nr |
Artikelbez |
EPreis |
1 | Taibun - Schal | 12,00 € |
2 | Satz handgefertigter Ceylon - Grußkarten | 30,00 € |
3 | Packung Ceylon - Tee à 100g | 7,00 € |
4 | Packung Bio - Tee im Holzkästchen | 8,00 € |
In die ursprüngliche Tabelle tragen wir jetzt anstelle der Kundenangaben den jeweiligen Primärschlüssel der Kundentabelle ein und anstelle von Artikelbez und Einzelpreis die ArtikelNr. Das noch fehlende Rechnungsdatum habe ich nachgetragen.
KundenNr |
Nr |
Datum |
Versandkosten |
ArtikelNr |
Anzahl |
GPreis |
1 |
1 |
17.10.2020 |
7,00 € |
1 |
4 |
48,00 € |
1 |
1 |
17.10.2020 |
7,00 € |
2 |
2 |
60,00 € |
1 |
1 |
17.10.2020 |
7,00 € |
3 |
7 |
49,00 € |
2 |
2 |
21.10.2020 |
5,00 € |
2 |
1 |
30,00 € |
3 |
3 |
21.10.2020 |
4,00 € |
2 |
2 |
60,00 € |
1 |
8 |
03.11.2020 |
6,00 € |
4 |
2 |
16,00 € |
1 |
8 |
03.11.2020 |
6,00 € |
2 |
3 |
90,00 € |
5 |
9 |
05.11.2020 |
7,00 € |
3 |
2 |
12,00 € |
5 |
9 |
05.11.2020 |
7,00 € |
4 |
2 |
16,00 € |
Schritt 3
Es kommen immer noch Angaben mehrfach vor!
Und zwar Datum und Versandkosten. Die gibt es einmal je Rechnung. Die Rechnungen 1, 8 und 9 haben jeweils zwei bzw. 3 Rechnungsposten und deshalb stehen die Angaben hier noch mehrfach.
Forderung: Doppelte Angaben sind zu vermeiden.
Lösung: Die Rechnungen bekommen eine eigene Tabelle.
Rechnungen
Nr |
KundenNr |
Datum |
Versandkosten |
1 |
1 |
17.10.2020 |
7,00 € |
2 |
2 |
21.10.2020 |
5,00 € |
3 |
3 |
21.10.2020 |
4,00 € |
8 |
1 |
03.11.2020 |
6,00 € |
9 |
5 |
05.11.2020 |
7,00 € |
In der Detailtabelle verbleiben die Rechnungsposten;
RePosten
RechnungsNr |
ArtikelNr |
Anzahl |
GPreis |
1 |
1 |
4 |
48,00 € |
1 |
2 |
2 |
60,00 € |
1 |
3 |
7 |
49,00 € |
2 |
2 |
1 |
30,00 € |
3 |
2 |
2 |
60,00 € |
8 |
4 |
2 |
16,00 € |
8 |
2 |
3 |
90,00 € |
9 |
3 |
2 |
12,00 € |
9 |
4 |
2 |
16,00 € |
Schritt 4
Ist das jetzt wirklich besser?
In der RePosten - Tabellestehenja nur noch Zahlen. Wie kommt man da wieder an Lesbare Informationen?
Antwort: Mit Abfragen.
In LibreOffice verbindet man im Fenster "Beziehungen" die Fremdschlüssel jeweils mit dem Primärschlüssel aus der bezogenen Tabelle. Bei einer Abfrage werden diese Beziehungen dann übernommen.
Mit dieser Abfrage bekommen wir wieder die ursprüngliche Tabelle.
Man kann nach allen Attributen suchen; es sind keine Angaben mehr doppelt gepeichert.
SQL
Das Datenbankschema
Kunden (Nr, Name, Vorname, Strasse, PLZ, Ort)
Artikel (Nr, Artikelbez, EPreis)
Rechnungen (Nr, ↑KundenNr, Datum, Versandkosten)
RePosten (↑RechnungsNr, ↑ArtikelNr, Anzahl, GPreis)
Die Abfrage:
SELECT Kunden.Name, Kunden.Vorname, Kunden.Straße, Kunden.PLZ, Kunden.Ort, Rechnungen.Nr, Rechnungen.Datum, Rechnungen.Versandkosten, Artikel.Artikelbez, Artikel.EPreis, RePosten.Anzahl, RePosten.GPreis
FROM Rechnungen, Kunden, RePosten, Artikel
WHERE Rechnungen.KundenNr = Kunden.Nr AND RePosten.RechnungsNr = Rechnungen.Nr AND RePosten.ArtikelNr = Artikel.Nr
(Die Joins sind hier durch WHERE - Klauseln wiedergegeben.)