Übungsaufgaben zu Normalisierung und Anomalien

https://bildung.social/@oerinformatik/

https://oer-informatik.de/normalisierung-uebungsaufgaben

Normalisierung, Normalformen, Anomalien, Redundanz, Relationenmodell, Funktionale Abhängigkeit, SQL, Datenbankentwurf, Übungsaufgaben, Prüfungsvorbereitung

tl/dr; (Bearbeitungszeit insgesamt 100 min, mehrere Aufgaben): Drei Übungsaufgaben zu Normalisierung und Anomalien: eine Altdatenliste Schritt für Schritt in die erste, zweite und dritte Normalform bringen und mit SQL prüfen, eine Einkaufsliste auf Redundanz, Anomalien und Inkonsistenzen untersuchen, einen Tabellenentwurf korrigieren und direkt ein Relationenmodell in der dritten Normalform erstellen sowie ein bestehendes Modell erweitern, Abhängigkeiten erläutern und CSV-Daten bereinigt übernehmen. Alle Lösungen sind ausgeblendet und mit Punkteverteilung versehen [AI-Assisted]. (Zuletzt geändert am 27.10.2026)

Diese Übungsaufgaben gehören zum Artikel Anomalien und deren Vermeidung durch Normalisierung. Sie bauen auf dem logischen Datenbankentwurf mit dem Relationenmodell auf.

Hinweise zur Bearbeitung: Als FIA, FIDP, FIDV, ISE, IKS oder IKD musst Du zur Teil-2-Prüfung Aufgaben auf Kernkompetenz-Ebene lösen können, das sind Aufgabe 2.1, Aufgabe 2.2 und Aufgabe 2.3. Zeichne Deine Tabellen und Modelle auf Papier oder mit einem Werkzeug Deiner Wahl, bevor Du die Beispiellösung aufklappst. Für ein Relationenmodell genügen Tabellenkästen mit Kennzeichnung PK/FK und Verbindungslinien, an denen die Kardinalitäten (1, n) stehen. Tabellen- und Attributnamen dürfen von der Beispiellösung abweichen, wenn sie selbsterklärend sind; andere fachlich richtige Lösungen sind ebenfalls richtig.

Aufgabe 2.1: Altdaten einer Freizeit-App schrittweise normalisieren (Kernkompetenz)

(ca. 37 min Bearbeitungszeit)

Du bist Auszubildende*r im Entwicklungsteam der Let’s Meet GmbH in Bielefeld. Der frühere IT-Dienstleister hat neben den Benutzerdaten eine zweite Liste hinterlassen: die Teilnahmeliste stattgefundener Aktivitäten. Bevor die Daten in die neue Datenbank übernommen werden, sollst Du die Liste gemeinsam mit Deinem Mit-Azubi Jonas Weber schrittweise normalisieren. Hier ein Ausschnitt:

AktNr Aktivität Beginn Hobby (Kategorie) TreffNr Treffpunkt BenNr Teilnehmende Sterne
2 Sonntagswanderung Teutoburger Wald (12 km) 04.10.2026 10:00 Wandern (Natur) 2 Wanderparkplatz Hünenburg, 33619 Bielefeld 1, 6, 10 Hoffmann, Sabine; Novak, Petra; Krause, Rainer –, 5, 4
8 Kochabend: Mezze mit Weinbegleitung 17.10.2026 18:00 Kochen (Essen) 7 Alter Markt Herford, 32052 Herford 12, 2, 6 Albrecht, Jörg; Haddad, Malik; Nowak, Petra –, 5, 4

Informationen zur Liste:

  • Die Spalten BenNr, Teilnehmende und Sterne gehören positionsweise zusammen: Die erste Benutzernummer gehört zum ersten Namen und zur ersten Bewertung. „–“ bedeutet, dass die Person keine Bewertung abgegeben hat.

  • Jede Aktivität findet genau einmal statt und hat genau ein Hobby und einen Treffpunkt. Jede Person kann eine Aktivität höchstens einmal bewerten.

Leiter Entwicklung Yusuf Demir hat Euch dazu folgenden Auszug aus dem englischsprachigen Team-Wiki geschickt:

Normal form Rule
First normal form (1NF) Every attribute contains only atomic (indivisible) values; there are no repeating groups.
Second normal form (2NF) The table is in 1NF and every non-key attribute is fully functionally dependent on the whole primary key.
Third normal form (3NF) The table is in 2NF and no non-key attribute is transitively dependent on the primary key.

a) Erstelle aus dem Ausschnitt eine Tabelle, die der ersten Normalform entspricht. Trage alle Attributwerte ein. Bilde aus den vorhandenen Attributen einen zusammengesetzten Primärschlüssel und kennzeichne seine Teile mit (PK). (10 Punkte)

AktNr (PK) Titel Beginn Hobby Kategorie TreffNr Treffpunkt PLZ Ort BenNr (PK) Nachname Vorname Sterne
2 Sonntagswanderung Teutoburger Wald (12 km) 04.10.2026 10:00 Wandern Natur 2 Wanderparkplatz Hünenburg 33619 Bielefeld 1 Hoffmann Sabine
2 Sonntagswanderung Teutoburger Wald (12 km) 04.10.2026 10:00 Wandern Natur 2 Wanderparkplatz Hünenburg 33619 Bielefeld 6 Novak Petra 5
2 Sonntagswanderung Teutoburger Wald (12 km) 04.10.2026 10:00 Wandern Natur 2 Wanderparkplatz Hünenburg 33619 Bielefeld 10 Krause Rainer 4
8 Kochabend: Mezze mit Weinbegleitung 17.10.2026 18:00 Kochen Essen 7 Alter Markt Herford 32052 Herford 12 Albrecht Jörg
8 Kochabend: Mezze mit Weinbegleitung 17.10.2026 18:00 Kochen Essen 7 Alter Markt Herford 32052 Herford 2 Haddad Malik 5
8 Kochabend: Mezze mit Weinbegleitung 17.10.2026 18:00 Kochen Essen 7 Alter Markt Herford 32052 Herford 6 Nowak Petra 4

Bewertungsvorschlag:

  • zusammengesetzte Werte in Attribute zerlegt: Hobby/Kategorie, Treffpunkt/PLZ/Ort, Nachname/Vorname, je 1 Punkt → 3 Punkte

  • Listen in Zeilen aufgelöst, eine Zeile je Teilnahme, Nummer, Name und Sterne positionsrichtig zugeordnet → 3 Punkte

  • übrige Attributwerte vollständig übernommen (leere Bewertung bleibt leer bzw. NULL) → 2 Punkte

  • Primärschlüssel (AktNr, BenNr) → 2 Punkte

Hinweise: Ein Zeitpunkt aus Datum und Uhrzeit ist ein einzelner Wert (Datentyp DATETIME) und darf zusammenbleiben; eine Aufteilung in Datum und Uhrzeit ist ebenfalls richtig. Das Datum muss nicht in den Schlüssel, weil jede Aktivität nur einmal stattfindet – bei wiederholten Terminen (z. B. „jeden Sonntag“) gehörte der Zeitpunkt in den Schlüssel. Die Abweichung „Novak“/„Nowak“ wird in der 1NF unverändert übernommen (siehe bb).

b) Die Tabelle aus a) soll weiter normalisiert werden.

ba) Bringe den Datenbestand durch Aufteilung in mehrere Tabellen in die zweite Normalform. Gib den Tabellen sinnvolle Namen, kennzeichne Primär- und Fremdschlüssel mit PK bzw. FK und zeichne die Beziehungen mit ihren Kardinalitäten ein. Attributwerte musst Du nicht mehr eintragen. (8 Punkte)

Relationenmodell der Teilnahmeliste in der zweiten Normalform mit den Tabellen aktivitaet, benutzer und teilnahme (mit KI erstellt)
Relationenmodell der Teilnahmeliste in der zweiten Normalform mit den Tabellen aktivitaet, benutzer und teilnahme (mit KI erstellt)

Der Primärschlüssel aus a) ist zusammengesetzt. Titel, Beginn, Hobby, Kategorie und alle Treffpunktangaben hängen nur vom Teilschlüssel AktNr ab, Nachname und Vorname nur von BenNr. Nur Sterne hängt vom ganzen Schlüssel ab (eine Bewertung je Person und Aktivität) und bleibt in der Ausgangstabelle teilnahme.

Bewertungsvorschlag:

  • je Tabelle mit richtigen Attributen 1 Punkt → 3 Punkte

  • Primärschlüssel aktivitaet und benutzer je 1 Punkt, zusammengesetzter Primärschlüssel mit Fremdschlüsseln in teilnahme 1 Punkt → 3 Punkte

  • je Beziehung mit Kardinalität 1 Punkt → 2 Punkte

bb) Beim Aufteilen erhältst Du für die Benutzernummer 6 zwei unterschiedliche Datensätze. Beschreibe, wie es dazu kommen konnte und wie Du damit umgehst. (3 Punkte)

  • Ursache (2 Punkte): Der Name jeder teilnehmenden Person ist in der Altliste bei jeder Teilnahme erneut gespeichert (Redundanz). Bei der Erfassung oder einer späteren Korrektur wurde er nicht überall gleich geschrieben bzw. nur in einer Zeile geändert. Die Daten sind dadurch inkonsistent: Für dieselbe Person 6 stehen „Novak“ und „Nowak“ in der Liste – eine Folge der Änderungsanomalie.

  • Umgang (1 Punkt): Welche Schreibweise stimmt, lässt sich aus der Liste allein nicht entscheiden. Abgleich mit dem Benutzerkonto (dort „Novak“) bzw. Rückfrage bei der Person; in der Tabelle benutzer der 2NF steht der Name danach nur noch einmal.

c) Überführe den Datenbestand abschließend in die dritte Normalform. Gib neuen Tabellen sinnvolle Namen, kennzeichne Primär- und Fremdschlüssel und zeichne die Beziehungen mit ihren Kardinalitäten ein. Postleitzahl und Ort dürfen in einer Tabelle bleiben. (6 Punkte)

Relationenmodell der Teilnahmeliste in der dritten Normalform mit den Tabellen hobby, treffpunkt, aktivitaet, benutzer und teilnahme (mit KI erstellt)
Relationenmodell der Teilnahmeliste in der dritten Normalform mit den Tabellen hobby, treffpunkt, aktivitaet, benutzer und teilnahme (mit KI erstellt)

In aktivitaet gibt es zwei transitive Abhängigkeiten: Die Kategorie folgt aus dem Hobby (Hobby → Kategorie), Name, PLZ und Ort des Treffpunkts folgen aus der Treffpunktnummer (TreffNr → Treffpunkt, PLZ, Ort). Beide Gruppen werden in eigene Tabellen ausgelagert; Hobby und TreffNr bleiben als Fremdschlüssel in aktivitaet. teilnahme und benutzer sind bereits in der 3NF.

Bewertungsvorschlag:

  • Tabellen hobby und treffpunkt mit Attributen je 1 Punkt → 2 Punkte

  • deren Primärschlüssel je 0,5 Punkte → 1 Punkt

  • Fremdschlüssel Hobby und TreffNr in aktivitaet je 0,5 Punkte → 1 Punkt

  • neue Beziehungen mit Kardinalitäten je 1 Punkt → 2 Punkte

Alternativen: Statt der Bezeichnung kann ein künstlicher Schlüssel HobbyNr (bzw. hobby_id wie in der neuen Datenbank) vergeben werden. Wer zusätzlich eine Tabelle ort (PLZ (PK), Ort) auslagert, löst auch die transitive Abhängigkeit PLZ → Ort auf – das ist ebenfalls richtig.

d) Für die neue Datenbank schlägt Jonas Weber vor, auf die Tabelle hobby zu verzichten und Bezeichnung und Kategorie des Hobbys direkt in der Tabelle aktivitaet zu speichern: „Dann spart die Startseite einen JOIN.“ Beschreibe zwei Probleme, die dadurch entstehen können. (4 Punkte)

Je beschriebenem Problem 2 Punkte, z. B.:

  • Redundanz und Änderungsanomalie: Bezeichnung und Kategorie stehen in jeder Aktivität erneut (bei rund 3.100 neuen Aktivitäten im Monat sehr oft). Wird ein Hobby umbenannt (z. B. „Brettspiele“ in „Brett- und Kartenspiele“) oder einer anderen Kategorie zugeordnet, müssen alle betroffenen Aktivitäten geändert werden; wird eine vergessen, sind die Daten inkonsistent.

  • Inkonsistente Schreibweisen: Ohne Wertetabelle können Hobbys frei eingetippt werden („Fussball“, „Fußball“, „fußball“). Filter und das Matching nach Interessen finden dann passende Aktivitäten nicht mehr.

  • Einfüge- und Löschanomalie: Ein neues Hobby existiert erst, wenn es eine Aktivität dazu gibt; wird die letzte Aktivität eines Hobbys gelöscht, verschwindet das Hobby samt Kategorie. Außerdem verweist benutzer_hobby auf die Hobbys der Benutzer*innen – ohne Tabelle hobby gäbe es keinen gemeinsamen Bezugspunkt mehr.

Der Zeitgewinn ist gering: Ein JOIN über den Primärschlüssel einer kleinen Tabelle ist dank Index sehr schnell.

e) Die neue Datenbank letsmeet ist bereits normalisiert. Auszug aus der Tabellenbeschreibung:

aktivitaet (aktivitaet_id (PK), titel, beginn, hobby_id (FK), treffpunkt_id (FK), status, …)
hobby      (hobby_id (PK), bezeichnung, kategorie)
treffpunkt (treffpunkt_id (PK), name, strasse, plz, ort, barrierefrei, …)
benutzer   (benutzer_id (PK), vorname, nachname, …)
teilnahme  (aktivitaet_id (PK, FK), benutzer_id (PK, FK), angemeldet_am,
            status ENUM('angemeldet','warteliste','abgemeldet','teilgenommen','nicht_erschienen'))
bewertung  (bewertung_id (PK), aktivitaet_id (FK), bewerter_id (FK), sterne, kommentar, …)

Zur Kontrolle der Übernahme soll die Teilnahmeliste der Aktivitäten 2 und 8 wieder in der Form Deiner Tabelle aus a) ausgegeben werden: eine Zeile je Person, die tatsächlich teilgenommen hat, mit Aktivitätsnummer, Titel, Beginn, Hobby, Kategorie, Treffpunktnummer, Treffpunkt, PLZ, Ort, Benutzernummer, Nachname, Vorname und Sternen. Personen ohne Bewertung sollen ebenfalls erscheinen. Sortiere nach Aktivität und Benutzernummer.

Formuliere die SQL-Abfrage. (6 Punkte)

Ergebnis im Datenbestand (gekürzt um Titel und Beginn):

aktivitaet_id hobby kategorie treffpunkt_id treffpunkt plz ort benutzer_id nachname vorname sterne
2 Wandern Natur 2 Wanderparkplatz Hünenburg 33619 Bielefeld 1 Hoffmann Sabine NULL
2 Wandern Natur 2 Wanderparkplatz Hünenburg 33619 Bielefeld 6 Novak Petra 5
2 Wandern Natur 2 Wanderparkplatz Hünenburg 33619 Bielefeld 10 Krause Rainer 4
8 Kochen Essen 7 Alter Markt Herford 32052 Herford 2 Haddad Malik 5
8 Kochen Essen 7 Alter Markt Herford 32052 Herford 6 Novak Petra 4
8 Kochen Essen 7 Alter Markt Herford 32052 Herford 12 Albrecht Jörg NULL

Bewertungsvorschlag:

  • Verbund von aktivitaet, hobby, treffpunkt, teilnahme und benutzer mit richtigen Bedingungen → 2 Punkte

  • LEFT JOIN auf bewertung mit beiden Bedingungen (Aktivität und bewertende Person) → 2 Punkte

  • Filter auf die Aktivitäten 2 und 8 und den Status teilgenommen → 1 Punkt

  • Spaltenauswahl und Sortierung → 1 Punkt

Typische Fehler: Mit einem inneren JOIN auf bewertung fehlen Sabine Hoffmann und Jörg Albrecht (nur 4 statt 6 Zeilen). Fehlt die Bedingung bw.bewerter_id = tn.benutzer_id, wird jede Teilnahme mit allen Bewertungen der Aktivität kombiniert. Ohne den Statusfilter erschiene bei Aktivität 2 auch Tobias Lange, der sich abgemeldet hatte.

f) Der Treffpunkt 2 soll künftig „Wanderparkplatz Hünenburg (Fernsehturm)“ heißen. Formuliere die SQL-Anweisung und erläutere, warum dabei in der neuen Datenbank – anders als in der Altliste – keine Änderungsanomalie auftreten kann. (4 Punkte)

SQL-Anweisung (2 Punkte):

MariaDB meldet 1 row affected.

Erläuterung (2 Punkte): Der Name des Treffpunkts ist nur noch einmal in der Tabelle treffpunkt gespeichert. Aktivitäten verweisen über den Fremdschlüssel treffpunkt_id darauf und zeigen nach dem Verbund automatisch den neuen Namen. In der Altliste stand der Name dagegen in jeder Teilnahmezeile; dort hätten alle Zeilen geändert werden müssen, und eine vergessene Zeile hätte zu widersprüchlichen Daten geführt.

Aufgabe 2.2: Einkaufsliste der Werkstatt in eine Datenbank überführen (Kernkompetenz)

(ca. 37 min Bearbeitungszeit)

Du bist Auszubildende*r im Entwicklungsteam der CSB-Rad GmbH in Bielefeld. Werkstattleiter Bastian Ludwig bestellt Ersatzteile bei zwei Großhändlern und führt die Einkaufsbestellungen bisher in einer Tabellenkalkulation. Geschäftsführer Cem Sarıkaya möchte den Einkauf in die Shop-Datenbank übernehmen. Hier ein Ausschnitt aus der Liste „Einkauf 2026“:

EK-Nr Datum Lieferant Anschrift Ansprechperson Art.-Nr. Bezeichnung Lief.-Art.-Nr. Menge EK-Preis netto
EK-26-031 05.10.2026 Ravensberger Radteile GmbH Mindener Straße 12, 32049 Herford Gül Yıldız BRE-HYD-01 Hydraulische Scheibenbremse (Paar) RR-4410 10 89,90 €
EK-26-031 05.10.2026 Ravensberger Radteile GmbH Mindener Straße 12, 32049 Herford Gül Yıldız LIC-SET-01 Lichtset Nabendynamo StVZO RR-7702 20 49,50 €
EK-26-032 08.10.2026 Senne Velo Handel KG Holter Straße 5, 33758 Schloß Holte-Stukenbrock Frank Brinkmann BRE-BEL-02 Bremsbelag-Satz Scheibenbremse SV-BB-220 30 9,80 €
EK-26-032 08.10.2026 Senne Velo Handel KG Holter Straße 5, 33758 Schloß Holte-Stukenbrock Frank Brinkmann KET-11-E Kette 11-fach E-Bike SV-K11E 15 19,40 €
EK-26-033 14.10.2026 Ravensberger Radteile GmbH Mindener Str. 12, 32049 Herford Gül Yildiz BRE-BEL-02 Bremsbelag-Satz Scheibenbremse RR-4415 20 10,20 €
EK-26-033 14.10.2026 Ravensberger Radteile GmbH Mindener Str. 12, 32049 Herford Gül Yildiz LIC-SET-01 Lichtset Nabendynamo StVZO RR-7702 10 49,50 €
EK-26-034 16.10.2026 Senne Velo Handel KG Holter Straße 5, 33758 Schloß Holte-Stukenbrock Frank Brinkmann BRE-HYD-01 Hydraulische Scheibenbremse (Paar) SV-HS-90 6 92,50 €

Weitere Informationen von Bastian Ludwig:

  • Eine Einkaufsbestellung geht immer an genau einen Lieferanten. Jeder Artikel steht je Bestellung höchstens einmal.

  • Die Lieferanten führen unsere Artikel unter eigenen Artikelnummern („Lief.-Art.-Nr.“).

  • Mit jedem Lieferanten ist eine Preisliste vereinbart; die Preise ändern sich etwa zweimal im Jahr.

  • Die Artikel sind bereits in der Shop-Datenbank gespeichert: artikel (artikel_id (PK), artikelnr, bezeichnung, netto_preis, …).

a) In der Liste werden viele Daten redundant gespeichert. Beschreibe den Begriff Redundanz an einem konkreten Beispiel aus der Liste. (2 Punkte)

Redundanz bedeutet, dass dieselbe Information mehrfach gespeichert ist (1 Punkt). Beispiel (1 Punkt): Firma, Anschrift und Ansprechperson der Senne Velo Handel KG stehen in jeder ihrer drei Bestellzeilen; Datum und Lieferant einer Bestellung stehen in jeder Position (EK-26-031 zweimal); die Bezeichnung „Lichtset Nabendynamo StVZO“ steht bei jeder Bestellung dieses Artikels und außerdem schon in der Tabelle artikel.

b) Durch die redundante Datenhaltung können Anomalien auftreten. Übertrage die folgende Tabelle und ergänze sie: Erläutere jede Anomalieart an einem konkreten Beispiel aus der Liste und gib an, wie ein Datenmodell in der dritten Normalform die Anomalie verhindert. (9 Punkte)

Anomalieart Beispiel mit Erläuterung So verhindert die 3NF die Anomalie
Änderungsanomalie
Einfügeanomalie
Löschanomalie
Anomalieart Beispiel mit Erläuterung So verhindert die 3NF die Anomalie
Änderungsanomalie Ändert sich eine Information, müssen mehrere Zeilen angepasst werden. Zieht die Ravensberger Radteile GmbH um oder wechselt die Ansprechperson, müssen alle ihre Bestellzeilen geändert werden; wird eine vergessen, sind die Daten widersprüchlich. Anschrift und Ansprechperson stehen nur einmal in der Tabelle lieferant; geändert wird genau ein Datensatz.
Einfügeanomalie Neue Informationen lassen sich nur mit leeren Feldern (oder gar nicht) speichern. Soll ein neuer Lieferant mit seiner Preisliste erfasst werden, bei dem noch nichts bestellt wurde, bleiben EK-Nr, Datum und Menge leer – die EK-Nr identifiziert die Zeile aber, sie darf nicht leer sein. Lieferanten und Preislisten (lieferant, lieferant_artikel) können unabhängig von Bestellungen angelegt werden.
Löschanomalie Beim Löschen einer Zeile gehen weitere, nur dort gespeicherte Informationen verloren. Wird die Bestellung EK-26-032 gelöscht (z. B. storniert), verschwinden die Lieferantenartikelnummer SV-K11E und der Preis der Kette bei der Senne Velo Handel KG, weil sie nur dort stehen. Gelöscht werden nur die Bestellung und ihre Positionen; Lieferanten- und Preislistendaten liegen in eigenen Tabellen.

Bewertungsvorschlag: je Anomalie 2 Punkte für Erläuterung mit konkretem Beispiel aus der Liste und 1 Punkt für die Wirkung der Normalisierung → 9 Punkte. Andere passende Beispiele sind ebenfalls richtig.

c) In der Liste haben sich bereits Abweichungen eingeschlichen. Beschreibe sie und welche Folge sie für eine Auswertung „Einkaufsvolumen je Lieferant“ haben können. (3 Punkte)

  • Abweichungen (2 Punkte): Bei der Ravensberger Radteile GmbH steht die Anschrift einmal als „Mindener Straße 12“ und einmal als „Mindener Str. 12“, die Ansprechperson einmal als „Gül Yıldız“ und einmal als „Gül Yildiz“. Die Daten sind inkonsistent; welche Schreibweise gilt, ist aus der Liste nicht erkennbar.

  • Folge (1 Punkt): Wird nach Lieferant und Anschrift (oder Ansprechperson) gruppiert oder werden Duplikate über den Text erkannt, erscheint derselbe Lieferant zweimal. Das Einkaufsvolumen wird geteilt (EK-26-031: 10 · 89,90 € + 20 · 49,50 € = 1.889,00 €; EK-26-033: 20 · 10,20 € + 10 · 49,50 € = 699,00 €) statt richtig 2.588,00 € für einen Lieferanten. Rabattstaffeln oder Lieferantenbewertungen werden dann falsch berechnet.

d) Natalia Wróbel aus der Buchhaltung hat für die Lieferanten bereits eine Tabelle entworfen:

lieferant (lieferant_id (PK), firma, strasse_hausnr, plz, ort,
           ansprechperson, ansprech_telefon, ansprech_email)

da) Erläutere, warum diese Tabelle nicht der dritten Normalform entspricht. (4 Punkte)

In der 3NF darf kein Nichtschlüsselattribut von einem anderen Nichtschlüsselattribut abhängen (1 Punkt). Die Tabelle enthält zwei transitive Abhängigkeiten:

  • plz → ort (1 Punkt): Der Ort ergibt sich aus der Postleitzahl und hängt nur über sie vom Schlüssel lieferant_id ab.

  • ansprechperson → ansprech_telefon, ansprech_email (2 Punkte): Telefonnummer und E-Mail-Adresse beschreiben die Ansprechperson, nicht den Lieferanten. Wechselt die Ansprechperson, müssen alle drei Attribute zusammen geändert werden; bekommt ein Lieferant eine zweite Ansprechperson, passt sie nicht in die Tabelle.

Die 1NF und die 2NF sind erfüllt: Die Anschrift ist bereits in Straße/Hausnummer, PLZ und Ort zerlegt, und der Primärschlüssel ist nicht zusammengesetzt.

db) Korrigiere den Entwurf so, dass er der dritten Normalform entspricht. Ein Lieferant kann künftig mehrere Ansprechpersonen haben. Gib die Tabellen in Textform mit Primär- und Fremdschlüsseln an. (3 Punkte)

lieferant      (lieferant_id (PK), firma, strasse_hausnr, plz (FK))
ort            (plz (PK), ort)
ansprechperson (ansprechperson_id (PK), name, telefon, email, lieferant_id (FK))

Bewertungsvorschlag: Tabelle ansprechperson mit Fremdschlüssel auf lieferant (1:n) 2 Punkte, Auslagerung von PLZ und Ort 1 Punkt. Bleiben PLZ und Ort mit Begründung in lieferant (in der Praxis üblich, weil plz → ort nicht streng gilt: Es gibt Postleitzahlen für mehrere Orte), ist das ebenfalls richtig. Den Namen weiter in Vor- und Nachname zu zerlegen, ist sinnvoll, aber nicht gefordert.

e) Bastian Ludwig meint: „Den Einkaufspreis speichern wir nur in der Preisliste je Lieferant. In der Bestellung stünde er ja doppelt – das ist doch Redundanz.“ Nimm Stellung zu diesem Vorschlag. (4 Punkte)

Der Vorschlag ist abzulehnen (1 Punkt). Begründung (3 Punkte), z. B.:

  • Listenpreis und Bestellpreis sind zwei verschiedene Informationen: Der Listenpreis gilt heute für einen Artikel bei einem Lieferanten, der Bestellpreis galt zum Zeitpunkt der Bestellung. Da sich die Preise etwa zweimal im Jahr ändern, würde jede Preisänderung rückwirkend alle alten Bestellungen verändern.

  • Rechnungsprüfung, Buchhaltung und Auswertungen (Einkaufsvolumen) brauchen den tatsächlich vereinbarten Preis; Belege müssen nachvollziehbar bleiben.

  • Der Preis in der Bestellposition lässt sich nicht aus anderen Daten ableiten und ist deshalb keine Redundanz. Er kann außerdem vom Listenpreis abweichen (Sonderpreis, Mengenrabatt).

Eine Stellungnahme, die den Vorschlag nur für den Fall gelten lässt, dass Preise nie geändert werden und nie abweichen, ist mit Begründung ebenfalls vertretbar.

f) Erstelle aus der Liste und den Informationen ein relationales Datenmodell in der dritten Normalform. Binde die vorhandene Tabelle artikel ein und ergänze, wo nötig, künstliche Schlüssel. Die Ansprechperson darf vereinfacht als Attribut des Lieferanten modelliert werden. Kennzeichne Primärschlüssel mit PK und Fremdschlüssel mit FK und zeichne alle Beziehungen mit ihren Kardinalitäten ein. (16 Punkte)

Relationenmodell für den Einkauf mit den Tabellen lieferant, lieferant_artikel, artikel, einkauf und einkaufsposition (mit KI erstellt)
Relationenmodell für den Einkauf mit den Tabellen lieferant, lieferant_artikel, artikel, einkauf und einkaufsposition (mit KI erstellt)

Erläuterungen:

  • einkauf nutzt die vorhandene EK-Nr als Primärschlüssel; der Lieferant steht als Fremdschlüssel in der Bestellung, weil jede Bestellung an genau einen Lieferanten geht.

  • einkaufsposition löst die m:n-Beziehung zwischen Bestellung und Artikel auf. Menge und Bestellpreis hängen vom ganzen Schlüssel (ek_nr, artikel_id) ab.

  • lieferant_artikel ist die Preisliste: Lieferantenartikelnummer und Listenpreis hängen von Lieferant und Artikel ab (RR-4415 und SV-BB-220 bezeichnen denselben Bremsbelag-Satz bei verschiedenen Lieferanten).

  • Bezeichnung und Shop-Artikelnummer stehen nur in artikel, Firmendaten nur in lieferant.

Bewertungsvorschlag:

  • neue Tabellen mit richtigen Attributen je 1 Punkt → 4 Punkte

  • Primärschlüssel je 1 Punkt → 4 Punkte, zusätzlich 0,5 Punkte, wenn die zusammengesetzten Primärschlüssel vollständig sind → 4,5 Punkte

  • Fremdschlüssel (fünf) je 0,5 Punkte → 2,5 Punkte

  • Beziehungen mit Kardinalitäten je 1 Punkt → 5 Punkte

Alternativen: Künstliche Schlüssel einkauf_id oder position_id statt der zusammengesetzten Schlüssel sind richtig, wenn die fachliche Eindeutigkeit (ein Artikel je Bestellung) erhalten bleibt. Wer einkaufsposition über den zusammengesetzten Fremdschlüssel (lieferant_id, artikel_id) mit lieferant_artikel verbindet, stellt zusätzlich sicher, dass nur Artikel aus der Preisliste des Lieferanten bestellt werden – das ist eine gute Erweiterung.

Aufgabe 2.3: Das Datenmodell einer Mitfahr-App erweitern (Kernkompetenz)

(ca. 26 min Bearbeitungszeit)

Am Ratz und Rübe Berufskolleg in Bielefeld vermittelt die App „RatzFahrt“ Mitfahrgelegenheiten zu den Berufsschultagen. Du arbeitest im Entwicklungsteam mit. Ein Ausschnitt aus dem bestehenden Datenmodell:

  • klasse (klasse_id (PK), bezeichnung, bildungsgang, schultage, unterricht_beginn, unterricht_ende)

  • nutzer (nutzer_id (PK), pseudonym, vorname, nachname, email_schule, geburtsdatum, klasse_id (FK), rolle, fuehrerschein)

  • haltepunkt (haltepunkt_id (PK), name, plz, ort, entfernung_km)

Beziehung: Eine Klasse hat viele Nutzende (1:n), jede Schülerin und jeder Schüler gehört zu genau einer Klasse.

Ausschnitt aus der Tabelle klasse:

klasse_id bezeichnung bildungsgang schultage
1 FIA25a Fachinformatiker*in Anwendungsentwicklung Mo,Do
2 FISY24b Fachinformatiker*in Systemintegration Di,Mi
5 IKS25 Kaufleute für IT-System-Management Mo,Do
6 FIA26b Fachinformatiker*in Anwendungsentwicklung Di,Fr

a) Nenne vier typische Kennzeichen eines relationalen Datenmodells, die Du in diesem Ausschnitt erkennst. (4 Punkte)

Je 1 P, z. B.:

  • Die Daten stehen in Tabellen (Relationen) mit eindeutigem Namen (klasse, nutzer, haltepunkt).

  • Jede Zeile ist ein Datensatz, jede Spalte ein Attribut mit festem Datentyp.

  • Jede Tabelle hat einen Primärschlüssel, der jeden Datensatz eindeutig kennzeichnet (klasse_id …).

  • Beziehungen werden über Fremdschlüssel hergestellt (nutzer.klasse_id verweist auf klasse).

  • Beziehungen haben Kardinalitäten (1:n zwischen Klasse und Nutzenden).

b) Erläutere die Begriffe funktionale Abhängigkeit und transitive Abhängigkeit und gib zu jedem Begriff ein Beispiel aus dem Ausschnitt an. (6 Punkte)

  • Funktionale Abhängigkeit (2 P): Ein Attribut B ist funktional abhängig von A (A → B), wenn zu jedem Wert von A genau ein Wert von B gehört. Beispiel (1 P): nutzer_id → email_schule oder klasse_id → bezeichnung.

  • Transitive Abhängigkeit (2 P): Ein Nichtschlüsselattribut hängt nicht direkt, sondern über ein anderes Nichtschlüsselattribut vom Primärschlüssel ab: Schlüssel → A → B. Beispiel (1 P): haltepunkt_id → plz → ort (wird in der Praxis meist geduldet) oder, wenn zum Bildungsgang weitere Angaben gespeichert würden, klasse_id → bildungsgang → ausbildungsdauer.

c) Für eine Auswertung sollen künftig zu jedem Bildungsgang ein Kürzel, die Bezeichnung und die Ausbildungsdauer in Monaten gespeichert werden; jede Klasse gehört zu genau einem Bildungsgang. Außerdem soll bei Schülerinnen und Schülern ihr Ausbildungsbetrieb (Name, Straße mit Hausnummer, PLZ, Ort, Telefon) erfasst werden. Ein Betrieb kann mehrere Auszubildende haben, eine Person hat höchstens einen Ausbildungsbetrieb. Erweitere das Modell unter Beachtung der dritten Normalform. Gib nur neue und geänderte Tabellen an, kennzeichne Primär- und Fremdschlüssel und gib die Beziehungen mit ihren Kardinalitäten an. PLZ und Ort dürfen in einer Tabelle bleiben. (8 Punkte)

  • bildungsgang (bildungsgang_id (PK), kuerzel, bezeichnung, dauer_monate) – 2 P

  • klasse (klasse_id (PK), bezeichnung, bildungsgang_id (FK), schultage, unterricht_beginn, unterricht_ende) – Text bildungsgang entfällt, Fremdschlüssel ergänzt – 1 P

  • ausbildungsbetrieb (betrieb_id (PK), name, strasse, plz, ort, telefon) – 2 P

  • nutzer (…, klasse_id (FK), betrieb_id (FK), …) – betrieb_id darf NULL sein (Lehrkräfte) – 1 P

  • Beziehungen (2 P): bildungsgang 1 : n klasse; ausbildungsbetrieb 1 : n nutzer.

Begründung: Würden Kürzel und Dauer in klasse stehen, hingen sie über den Bildungsgang transitiv vom Schlüssel ab und stünden für jede Klasse desselben Bildungsgangs mehrfach (Änderungsanomalie). Der Betrieb ist ein eigener Sachverhalt mit eigenen Eigenschaften und wird deshalb ausgelagert. Statt bildungsgang_id ist auch kuerzel als Primärschlüssel richtig, wenn es eindeutig und unveränderlich ist.

Hinweis: Das vorhandene Attribut schultage mit Werten wie „Mo,Do“ ist eine Liste in einer Zelle und verletzt die 1NF. Sauber wäre eine Tabelle klasse_schultag (klasse_id (PK, FK), wochentag (PK)) mit einer Zeile je Klasse und Schultag (klasse 1 : n klasse_schultag). Diese Korrektur ist in der Aufgabe nicht gefordert.

d) Thomas Becker liefert die Ausbildungsbetriebe als CSV-Datei aus einer Tabellenkalkulation:

Betrieb;Anschrift;Telefon
Systemhaus Ostwestfalen GmbH;Herforder Str. 12, 33602 Bielefeld;0521 0300301
Systemhaus OWL GmbH;Herforder Straße 12, 33602 Bielefeld;
Möbelwerk Lemgo KG;Hamelner Str. 5, 32657 Lemgo;05261 0400401
Moebelwerk Lemgo KG;Hamelner Str. 5, 32657 Lemgo;05261 0400401

Beschreibe die Schritte, mit denen Du die Daten bereinigt und normalisiert in die Tabelle ausbildungsbetrieb übernimmst. (5 Punkte)

Je Schritt 1 P, z. B.:

  1. Zusammengesetzte Felder zerlegen: Anschrift in Straße mit Hausnummer, PLZ und Ort aufteilen (1NF).

  2. Schreibweisen vereinheitlichen: „Str.“/„Straße“, „Moebelwerk“/„Möbelwerk“ (Umlaute, Zeichenkodierung UTF-8 prüfen).

  3. Dubletten erkennen und zusammenführen: Die beiden Möbelwerk-Zeilen sind derselbe Betrieb; bei „Systemhaus Ostwestfalen“ und „Systemhaus OWL“ mit gleicher Anschrift klärst Du mit Thomas Becker bzw. den Auszubildenden, ob es derselbe Betrieb ist.

  4. Fehlende Werte klären: Telefonnummer des zweiten Systemhaus-Eintrags fehlt – aus dem Dublettenpartner übernehmen oder NULL lassen.

  5. Schlüssel vergeben und importieren: Jeder Betrieb erhält eine betrieb_id; danach wird in nutzer der passende Fremdschlüssel eingetragen und per Abfrage geprüft, dass jede Anschrift nur einmal vorkommt.

e) Ein neues Teammitglied fragt, warum Ihr Euch die Mühe mit der Normalisierung überhaupt macht.

ea) Nenne zwei Bedingungen, die eine Tabelle in der ersten Normalform erfüllen muss. (2 Punkte)

Je 1 P: Alle Attributwerte sind atomar (keine zusammengesetzten Werte wie „Name, Vorname“ oder „Anschrift“); keine Listen bzw. Wiederholungsgruppen in einem Feld (wie mehrere Telefonnummern); jeder Datensatz ist über einen Primärschlüssel eindeutig identifizierbar.

eb) Erläutere den Zweck der Normalisierung. (3 Punkte)

Die Normalisierung sorgt dafür, dass jede Information nur einmal gespeichert wird (Redundanz vermeiden, 1 P). Dadurch werden Einfüge-, Änderungs- und Löschanomalien verhindert (1 P), und die Daten bleiben konsistent: Ändert sich z. B. die Ausbildungsdauer eines Bildungsgangs, wird sie an genau einer Stelle angepasst. Außerdem lässt sich das Modell leichter erweitern (1 P).


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zu Normalisierung und Anomalien” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/normalisierung-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/db-design/datenbankentwurf. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 27.10.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: