Anna zieht um, aber nur zweimal
Ein Schreibwarenladen führt alle Bestellungen in einer einzigen großen Tabelle. Anna Berger hat 40 Bestellzeilen. Jede enthält ihren Wohnort.
Anna zieht nach Kiel. Jemand ändert 38 Zeilen und übersieht zwei. Nun wohnt Anna an zwei Orten. Mit einem besseren Entwurf kann das nicht passieren.
Am Ende dieser Lektion
Notiz
Ich kann Wiederholung aus einem Tabellenentwurf entfernen.
Schlüsselwörter
| Begriff | Was er bedeutet |
|---|---|
| Redundanz | dieselbe Angabe mehrmals gespeichert |
| Anomalie | ein Fehler, den Wiederholung verursacht |
| Normalisierung | eine Tabelle so aufteilen, dass nichts wiederholt wird |
| Erste Normalform | jede Zelle hält genau einen Wert |
| Zweite Normalform | jede Spalte hängt vom ganzen Schlüssel ab |
| Dritte Normalform | keine Spalte hängt von einer Nicht-Schlüssel-Spalte ab |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Wiederholung verursacht drei Fehler
Steht dieselbe Angabe oft, nennt man das Redundanz. Sie verursacht drei Fehler, die Anomalien heißen.
Änderungsanomalie: Du änderst eine Kopie und übersiehst die anderen. Einfügeanomalie: Du kannst einen Kunden erst eintragen, wenn er etwas bestellt. Löschanomalie: Mit der letzten Bestellung verschwindet auch der Kunde.
Beispiel: eine flache Tabelle
| bestell_nr | kunde_nr | kunde_name | kunde_ort | artikel |
|---|---|---|---|---|
| 100 | 1 | Anna Berger | Hamburg | Stift |
| 100 | 1 | Anna Berger | Hamburg | Block |
| 101 | 2 | Ben Kaya | Wien | Stift |
| 102 | 1 | Anna Berger | Kiel | Lineal |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Probier es: wie oft steht ein Kunde da
-- Jeder Kunde steht so oft, wie er Zeilen hat.
SELECT kunde_nr, kunde_name, kunde_ort FROM bestellungen_flach ORDER BY kunde_nr;
-- Ändere SELECT in SELECT DISTINCT und starte noch einmal. Wie viele Zeilen bleiben?
Erste Normalform: ein Wert je Zelle
In der ersten Normalform hält jede Zelle genau einen Wert. Eine Zelle „Stift, Block“ verletzt sie. Auch Spalten wie artikel1, artikel2 und artikel3 verletzen sie.
Die Lösung: eine Zeile je Artikel, nicht eine Liste in einer Zelle.
Zweite Normalform: alles hängt am ganzen Schlüssel
Die zweite Normalform gilt für Schlüssel aus mehreren Spalten. Jede andere Spalte muss vom ganzen Schlüssel abhängen, nicht nur von einem Teil.
Der Schlüssel einer Bestellzeile ist (bestell_nr, artikel). Der Preis hängt nur am Artikel. Er gehört in eine eigene Tabelle artikel.
Dritte Normalform: keine Spalte hängt an einer anderen
Die dritte Normalform verlangt: Keine Spalte hängt von einer Spalte ab, die nicht der Schlüssel ist.
Der Ort des Kunden hängt an der Kundennummer, nicht an der Bestellung. Name und Ort wandern in eine Tabelle kunden. Die Bestellung hält nur noch kunde_nr als Fremdschlüssel.
Beispiel: aus einer Tabelle werden drei
| Tabelle | Spalten | Schlüssel |
|---|---|---|
| kunden | kunde_nr, name, ort | kunde_nr |
| artikel | artikel_nr, bezeichnung, preis_euro | artikel_nr |
| bestellzeilen | bestell_nr, kunde_nr, artikel_nr, menge | bestell_nr und artikel_nr |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele glauben, mehr Tabellen seien immer besser. Das stimmt nicht. Du teilst nur dort, wo dieselbe Angabe wiederholt wird. Und du merkst dir den Satz dazu: Jede Angabe steht an genau einem Ort.
Bevor du anfängst
Notiz
Drück oben in der Leiste auf Lab starten, warte auf beide Dienste und öffne das Terminal. Die zwei ersten Runs richten die Anmeldung ein. Die Runs auf student_kino ändern nur deine eigene Datenbank.
Das Zertifikat des Servers annehmen
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung für die Datenbank shop
alias sql='mariadb -h db -u student -pstudent shop -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Der Shop speichert jeden Kunden nur einmal
sql "SELECT (SELECT COUNT(*) FROM customers) AS kunden, (SELECT COUNT(*) FROM order_items) AS bestellzeilen"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine eigene Datenbank anlegen
sql "CREATE DATABASE IF NOT EXISTS student_kino"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Abkürzung dafür
alias kino='mariadb -h db -u student -pstudent student_kino -t -e'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Von vorn beginnen: die flache Tabelle löschen
kino "DROP TABLE IF EXISTS verkauf_flach"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine flache Tabelle mit drei Zeilen anlegen
kino "CREATE TABLE verkauf_flach (id INT AUTO_INCREMENT PRIMARY KEY, kunde VARCHAR(40), ort VARCHAR(40), artikel VARCHAR(40)); INSERT INTO verkauf_flach (kunde, ort, artikel) VALUES ('Anna', 'Hamburg', 'Stift'), ('Anna', 'Hamburg', 'Block'), ('Ben', 'Wien', 'Stift')"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Anna zieht um, nur eine Zeile ändert sich
kino "UPDATE verkauf_flach SET ort = 'Kiel' WHERE kunde = 'Anna' AND artikel = 'Stift'"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Welche Orte hat jetzt jeder Kunde?
kino "SELECT DISTINCT kunde, ort FROM verkauf_flach ORDER BY kunde, ort"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.