A1: Analysieren Sie folgende Datenbank, die nur aus einer Tabelle besteht, auf mögliche Anomalien. Denken Sie sich dazu geeignete Beispiele für Einfüge-, Änderungs- und Lösch-Anomalien aus.
A2: Überführen Sie die Datenbank in die 3. Normalform
A3: Erstellen Sie mit dem DB Browser for SQLite die Datenbank "Mensa" in der 3. Normalform und formulieren Sie eine SQL-Abfrage, um die verfügbaren Menüs mit allen Informationen abzufragen.
Datenbank "Mensa":
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01, 03 |
Geschmacksverstärker, Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01, 02 |
Geschmacksverstärker, Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
A1: Anomalien finden
Anomalie 1 (Einfüge-Anomalie): Bei einer neuen Speise werden die Zusatznamen versehentlich im Plural eingegeben. Die Attribute ZusatzNr und ZusatzName haben Inkonsistenzen.
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01, 03 |
Geschmacksverstärker, Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01, 02 |
Geschmacksverstärker, Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
M5 |
Wienerschnitzel mit Pommes |
C |
5 € |
02, 03 |
Konservierungsstoffe, Farbstoffe |
Anomalie 2 (Einfüge-Anomalie): Es wird eine neue Speise ohne weitere Informationen eingegeben. Kategorie und Zusatzstoffe fehlen.
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01, 03 |
Geschmacksverstärker, Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01, 02 |
Geschmacksverstärker, Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
M5 |
Wienerschnitzel mit Pommes |
|
|
|
|
Anomalie 3 (Änderungs-Anomalie): Der Preis für die Spaghetti wird erhöht, die Preiserhöhung für den Gemüseeintopf, der zur gleichen Kategorie gehört, bleibt unverändert. Es gibt eine Inkonsistenz bei den Attributen Kategorie und KatPreis.
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3,50 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01, 03 |
Geschmacksverstärker, Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01, 02 |
Geschmacksverstärker, Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
Anomalie 4 (Lösch-Anomalie): Das Menü "Pizza" wird gelöscht. Da dieses Menü das einzige der Kategorie "B" ist, wird Kategorie "B" mit gelöscht und fehlt jetzt in der Datenbank.
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3,50 € |
03 |
Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01, 02 |
Geschmacksverstärker, Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
A2: Datenbank in die 3. Normalform überführen
1. Normalform
Beim Umbau einer Datenbank in die 1. Normalform werden Attribute, die mehr als eine Information enthalten, zerlegt. Dazu verteilt man die Datensätze mit Mehrfachattributen auf mehrere Datensätze. Es entstehen dabei Datensätze mit atomaren Attributen, bei denen ein Attribut nur eine Information enthält.
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01, 03 |
Geschmacksverstärker, Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01, 02 |
Geschmacksverstärker, Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
wird zu
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01 |
Geschmacksverstärker |
M2 |
Pizza |
B |
4 € |
03 |
Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01 |
Geschmacksverstärker |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
02 |
Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
2. Normalform
Die Tabelle wird so in kleinere Tabellen zerlegt, dass Attribute, die zusammengehören, in eine eigene Tabelle geschrieben werden. Die zusammengehörenden Daten werden in weiteren Tabellen über Fremdschlüssel miteinander verbunden.
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01 |
Geschmacksverstärker |
M2 |
Pizza |
B |
4 € |
03 |
Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01 |
Geschmacksverstärker |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
02 |
Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
wird zu
Tabelle Menue
MenueNr |
MenueName |
Kategorie |
KatPreis |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
M2 |
Pizza |
B |
4 € |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
M4 |
Gemüseeintopf |
A |
3 € |
Tabelle Zusatzstoff
ZusatzNr |
ZusatzName |
00 |
Zusatzfrei |
01 |
Geschmacksverstärker |
02 |
Konservierungsstoff |
03 |
Farbstoff |
Tabelle MenueMitZusatz
MenueNr |
ZusatzNr |
M1 |
03 |
M2 |
01 |
M2 |
03 |
M3 |
01 |
M3 |
02 |
M4 |
00 |
3. Normalform
Für die 3. Normalform werden alle Attribute in einer Tabelle gesucht, die untrennbar zusammengehören und damit in eine eigene Tabelle geschrieben werden können.
Tabelle Menue
MenueNr |
MenueName |
Kategorie |
KatPreis |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
M2 |
Pizza |
B |
4 € |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
M4 |
Gemüseeintopf |
A |
3 € |
wird zu Tabelle Kategorie
Kategorie |
KatPreis |
A |
3 € |
B |
4 € |
C |
5 € |
und Tabelle Menue
MenueNr |
MenueName |
Kategorie |
M1 |
Spaghetti mit Tomatensoße |
A |
M2 |
Pizza |
B |
M3 |
Bratwurst mit Kartoffelpüree |
C |
M4 |
Gemüseeintopf |
A |
mit den bereits vorhandene Tabellen Zusatzstoff
ZusatzNr |
ZusatzName |
00 |
Zusatzfrei |
01 |
Geschmacksverstärker |
02 |
Konservierungsstoff |
03 |
Farbstoff |
und MenueMitZusatz
MenueNr |
ZusatzNr |
M1 |
03 |
M2 |
01 |
M2 |
03 |
M3 |
01 |
M3 |
02 |
M4 |
00 |
Normalisierte Datenbank
Die Datenbank
MenueNr |
MenueName |
Kategorie |
KatPreis |
ZusatzNr |
ZusatzName |
M1 |
Spaghetti mit Tomatensoße |
A |
3 € |
03 |
Farbstoff |
M2 |
Pizza |
B |
4 € |
01, 03 |
Geschmacksverstärker, Farbstoff |
M3 |
Bratwurst mit Kartoffelpüree |
C |
5 € |
01, 02 |
Geschmacksverstärker, Konservierungsstoff |
M4 |
Gemüseeintopf |
A |
3 € |
00 |
Zusatzfrei |
besteht umgewandelt in die 3. Normalform aus folgenden Tabellen:
Tabelle Zusatzstoff
ZusatzNr |
ZusatzName |
00 |
Zusatzfrei |
01 |
Geschmacksverstärker |
02 |
Konservierungsstoff |
03 |
Farbstoff |
Tabelle Kategorie
Kategorie |
KatPreis |
A |
3 € |
B |
4 € |
C |
5 € |
Tabelle Menue
MenueNr |
MenueName |
Kategorie |
M1 |
Spaghetti mit Tomatensoße |
A |
M2 |
Pizza |
B |
M3 |
Bratwurst mit Kartoffelpüree |
C |
M4 |
Gemüseeintopf |
A |
Tabelle MenueMitZusatz
MenueNr |
ZusatzNr |
M1 |
03 |
M2 |
01 |
M2 |
03 |
M3 |
01 |
M3 |
02 |
M4 |
00 |
A3: Datenbank im DB Browser erstellen
Die Datenbankstruktur im DB Browser for SQLite sieht wie folgt aus:

mit folgenden Tabellen:
Tabelle Kategorie

Tabelle Menue

Tabelle MenueMitZusatz

Tabelle Zusatzstoff

Die Datenbank zum Herunterladen, Entpacken und Öffnen im DB Browser: mensa.zip
Die SQL-Abfrage zur Erzeugung der Menütabelle lautet:
SELECT Menue.MenueNr, Menue.MenueName, Kategorie.Kategorie, Kategorie.KatPreis, Zusatzstoff.ZusatzNr, Zusatzstoff.ZusatzName
FROM Menue JOIN Kategorie JOIN Zusatzstoff JOIN MenueMitZusatz
ON Menue.Kategorie = Kategorie.Kategorie AND MenueMitZusatz.MenueNr = Menue.MenueNr AND MenueMitZusatz.ZusatzNr = Zusatzstoff.ZusatzNr
ORDER BY Menue.MenueNr ASC
Die SQL-Abfrage liefert folgende Daten aufsteigend sortiert nach der MenueNr:

Die usprüngliche Tabelle kann mit geeigneten SQL-Abfragen in der atomaren Form rekonstruiert werden. Ändert sich ein Preis, ein Name oder gibt es einen neuen Zusatzstoff, muss die Änderung nur an einer Stelle vorgenommen werden und wirkt sich auf alle Menü-Datensätze aus. Die Gefahr von Einfüge-, Änderungs- und Löschanomalien hat sich deutlich reduziert.