Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Wiederholung entfernen: Normalformen

Nach dieser Lektion: Ich kann Wiederholung aus einem Tabellenentwurf entfernen.

Lektion, 50 Min.9 BefehleMySQL-und-phpMyAdmin-Lab mit Beispieldatenbank eines Shops zum Üben von SQL

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

BegriffWas er bedeutet
Redundanzdieselbe Angabe mehrmals gespeichert
Anomalieein Fehler, den Wiederholung verursacht
Normalisierungeine Tabelle so aufteilen, dass nichts wiederholt wird
Erste Normalformjede Zelle hält genau einen Wert
Zweite Normalformjede Spalte hängt vom ganzen Schlüssel ab
Dritte Normalformkeine 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_nrkunde_nrkunde_namekunde_ortartikel
1001Anna BergerHamburgStift
1001Anna BergerHamburgBlock
1012Ben KayaWienStift
1021Anna BergerKielLineal

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Probier es: wie oft steht ein Kunde da

Code: sql
-- 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

TabelleSpaltenSchlüssel
kundenkunde_nr, name, ortkunde_nr
artikelartikel_nr, bezeichnung, preis_euroartikel_nr
bestellzeilenbestell_nr, kunde_nr, artikel_nr, mengebestell_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

Befehl
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnf

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 für die Datenbank shop

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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

Befehl
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?

Befehl
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.

Über dieses Lab und seinen Quellcode: MySQL-und-phpMyAdmin-Lab mit Beispieldatenbank eines Shops zum Üben von SQL

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.