Datenbank Design

Ziele

  • Du weisst was Normalisierung ist und wieso sie wichtig ist
  • Du kannst die ersten drei Normalformen in eigenen Worten erklären
  • Du kennst den Unterschied zwischen den Begriffen ERM und ERD
  • Du kennst die verschiedenen Beziehungstypen im Bereich der Kardinalität

Normalisierung

Die Normalisierung in SQL ist ein Prozess, bei dem Datenbanktabellen in bestimmte Normalformen gebracht werden, um die Datenintegrität und -konsistenz sicherzustellen und die Redundanz zu minimieren. Ziel ist es, die Daten effizient und konsistent zu speichern, zu verwalten und zu abzufragen.

Es gibt verschiedene Ausmasse, in denen ein Datenbankschema gegen Anomalien (wie z.B Inkonsistenz) geschützt werden kann. Diese unterschiedliche Ausmasse werden in diesem Zusammenhang Normalformen genannt. In den nächsten Abschnitten, wirst du die erste, zweite und dritte Normalformen kennenlernen.

Erste Normalform (1NF)

Die Erste Normalform (1NF) ist das grundlegende Konzept in der Datenbankentwicklung, das sicherstellt, dass eine Tabelle atomare Werte enthält und keine wiederholten Gruppen von Attributen zulässt. Das Ziel der 1NF ist es, die Daten in ihre einfachsten, nicht weiter unterteilbaren Bestandteile zu zerlegen.

In der ersten Normalform sollte jede Zelle in einer Tabelle nur einen einzigen Wert enthalten. Mehrwertige Attribute oder Attribute, die wiederholte Gruppen von Werten enthalten, sind nicht erlaubt. Wenn mehrere Werte zu einem Attribut gehören, müssen sie in separate Spalten oder sogar in separate Tabellen ausgelagert werden.

Nun können wir ein Beispiel betrachten:

Angenommen, wir haben eine Tabelle mit Kundendaten, die den Namen, die Adresse und die Telefonnummer enthält. Diese Tabelle könnte folgendermassen aussehen:

KundennummerKundenameAdresseTelefonnummer
1MaxHauptstr. 1, 123123456789
2LisaNebenstr. 5, 987987654321

Nach der Normalisierung in der 1NF würde die Tabelle dann so aussehen:

KundennummerKundennameStrasseHausnummerPLZOrtTelefonnummer
1MaxHauptstr.1123Musterort123456789
2LisaNebenstr.5987Beispielort987654321

Zusammenfassend kann man sagen, dass die erste Normalform (1NF) darauf abzielt, Daten in ihre einfachsten atomaren Werte zu zerlegen und keine wiederholten Gruppen von Attributen zuzulassen. Dadurch werden die Daten besser strukturiert, die Redundanz minimiert und die Datenintegrität verbessert.

Zweite Normalform (2NF)

Die Zweite Normalform (2NF) zielt darauf ab, Daten so zu strukturieren, dass keine wiederholten Informationen in einer Tabelle vorhanden sind. Stattdessen werden die Daten aufgeteilt und in separate Tabellen organisiert, die über einen gemeinsamen Schlüssel verknüpft sind. Dadurch werden Daten effizienter gespeichert und logische Konsistenz gewährleistet.

Angenommen, wir haben eine Tabelle mit Kundendaten, die Name und Telefonnummer enthält. Zusätzlich speichern wir für jeden Kunden die bestellten Produkte und die jeweilige Menge in derselben Tabelle. Die Tabelle könnte also folgendermassen aussehen:

KundennummerKundennameTelefonnummerProduktMenge
1Max123456789Schuhe2
1Max123456789Hemd1
2Lisa987654321Hose3
2Lisa987654321Jacke2

In diesem Fall haben wir eine Mischung aus Kundendaten und Bestelldaten in einer einzigen Tabelle. Das Problem dabei ist, dass die Kundendaten für jedes Produkt und jede Menge wiederholt werden müssen. Wenn Max zum Beispiel 3 verschiedene Produkte bestellt, würden seine Kundendaten dreimal wiederholt werden.

Um dieses Problem zu lösen und die Zweite Normalform (2NF) zu erreichen, müssen wir die Daten aufteilen und in separate Tabellen organisieren. Eine Tabelle enthält die Kundendaten und eine andere Tabelle enthält die Bestelldaten. Beide Tabellen werden durch einen gemeinsamen Schlüssel (Kunde) verknüpft.

Kundentabelle:

KundennummerKundennameTelefonnummer
1Max123456789
2Lisa987654321

Bestellungstabelle:

KundennummerProduktMenge
1Schuhe2
1Hemd1
2Hose3
2Jacke2

Dadurch erreichen wir eine klare Trennung der Daten. Die Kundendaten müssen nur einmal gespeichert werden und werden über den Schlüssel (Kunde) mit den entsprechenden Bestellungen verknüpft. Das reduziert die Redundanz und sorgt für eine bessere Organisation der Daten.

Dritte Normalform (3NF)

Die 3NF baut auf der zweiten Normalform (2NF) auf, indem sie weitergehende Anforderungen an die Strukturierung der Daten stellt.

Das Ziel der Dritten Normalform ist es, sicherzustellen, dass es in einer Datenbanktabelle keine Abhängigkeiten zwischen Nicht-Schlüsselattributen gibt, die nicht durch den Primärschlüssel erklärt werden können. Mit anderen Worten sollen alle Nicht-Schlüsselattribute funktional von einem vollständigen Teil des Primärschlüssels abhängig sein und keine funktionalen Abhängigkeiten untereinander aufweisen.

Um die 3NF zu erreichen, müssen die Daten in mehrere Tabellen aufgeteilt werden, wobei jede Tabelle einen spezifischen Informationsaspekt repräsentiert. Diese Tabellen werden dann über gemeinsame Schlüssel (also über sog. Fremdschlüssel) verknüpft, um Beziehungen zwischen den Daten herzustellen.

Nun können wir ein Beispiel betrachten:

Wir haben eine Ausgangstabelle, die alle Informationen eines Online-Shops beinhaltet. Aktuell ist diese Tabelle noch nicht normalisiert:

Ausgangstabelle:

KundenummerNameTelefonnummerProduktIdProduktnameBestellmengeGesamtpreis
1Max123456789101Schuhe250.00
1Max123456789102Hemd130.00
2Lisa987654321103Hose480.00
2Lisa987654321104Jacke375.00

Um die 3NF zu erreichen, müssen wir die Daten weiter aufteilen und in separate Tabellen organisieren.

Die Aufteilung erfolgt in drei Tabellen: “Kundentabelle”, “Produkttabelle” und “Bestellungstabelle”. Die Spalten der Tabellen könnten wie folgt aussehen:

Kundentabelle:

KundenummerNameTelefonnummer
1Max123456789
2Lisa987654321

Produkttabelle:

ProduktIdProduktnameProduktpreis
101Schuhe25.00
102Hemd30.00
103Hose20.00
104Jacke25.00

Bestellungstabelle:

KundenummerProduktIdBestellmengeGesamtpreis
1101250.00
1102130.00
2103480.00
2104375.00

Nach dieser Aufteilung ist bereits die zweite Normalform erreicht. Um die dritte Normalform also zu erreichen müssen wir alle Spalten entfernen, die abhängig von Nichtschlüssel-Attributen sind. In unserem Beispiel wäre dies der Gesamtpreis in der Bestellungstabelle. Dieser Preis kann anhand der Bestellmenge und dem Produktpreis berechnet werden und ist deshalb nicht nötig. Je nach Schema kann die dritte Normalform auch negative Auswirkungen auf die Performance haben, da keine berechneten Werte gespeichert werden dürfen. Wenn wir die Änderung in unserem Beispiel vornehmen würde die Tabelle schlussendlich so aussehen:

Bestellungstabelle:

KundenummerProduktIdBestellmenge
11012
11021
21034
21043

Durch diese Änderung erfüllt unsere Beispiel-Datenbank die ersten drei Normalformen.

Weiter gibt es auch höhere Normalformen wie die Boyce-Codd-Normalform (BCNF) und die Vierte Normalform (4NF), aber diese sind für den Anfang weniger relevant und komplexer zu erklären.

Datenbankdesign

In diesem Teil schauen wird uns hauptsächlich die beiden Begriffe ERM (Entity-Relationship-Modell) und ERD (Entity-Relationship-Diagramm) an. Wichtig ist den Unterschied der beiden zu kennen. Ein ERM ist eine Modellierungstechnik, die zur Abbildung der Beziehungen zwischen verschiedenen Entitäten in einem System verwendet wird. Mit Text wird versucht die Datenbank so einfach und klar wie möglich zu beschreiben, um später ein ERD dazu erstellen zu können. Es werden jeweils die Entitäten (Tabellen) und Beziehungen aufgefasst. Hier ein Beispiel eines einfachen ERMs:

Entitäten:

Entität-NameBeschreibung
StudentJeder Student hat eine eindeutige ID, einen Namen, ein Geburtsdatum und Kontaktdaten.
KursJeder Kurs hat eine eindeutige ID, einen Titel, eine Anzahl von Kreditpunkten und einen zugeordneten Dozenten.

Beziehungen:

Beziehungs-NameBeschreibung
EinschreibungDiese Beziehung zeigt die Verbindung zwischen Studenten und Kursen an. Jede Einschreibung hat eine eindeutige ID und ist mit einem bestimmten Studenten und einem bestimmten Kurs verknüpft.

Ein ERD ist eine grafische Darstellung eines ERM, die verwendet wird, um die Beziehungen zwischen Entitäten und Attributen darzustellen. Es besteht aus Entitäten, Attributen und Beziehungen und bietet eine formale Möglichkeit, die Struktur und das Verhalten eines Systems darzustellen. In diesem Schritt wird hauptsächlich angeschaut, was in der Datenbank benötigt wird und so eine klare Struktur gefunden. Diese Struktur kann dann später in einem ERD dargestellt werden.

Es gibt viele verschiedene Zeichen-Softwares für das Erstellen von ERDs. Zu empfehlen ist draw.io, da es sich dabei um eine Web-Applikation handelt, welche keinen Download benötigt. Auch das spätere Diagramm wurde mit draw.io erstellt. Wichtig beim Erstellen sind auch die Kardinalitäten, die für die Beziehungen benötigt werden. Schauen wir uns diese also an.

Kardinalität

Die Kardinalität in einem Entity-Relationship-Modell (ERM) beschreibt die Beziehung zwischen zwei Entitäten und gibt an, wie viele Instanzen einer Entität mit einer oder mehreren Instanzen einer anderen Entität verbunden sein können. Es gibt verschiedene Methode, um die Kardinalität einer Beziehung zu beschreiben. Wir verwenden hauptsächlich die Chen-Notation. Alternativ kann auch die Martin-Notation verwendet werden. So funktioniert die Chen-Notation:

1:1 (1 zu 1)

  • Jede Entität der ersten Entitätsmenge steht mit genau einer Entität der zweiten Entitätsmenge in Beziehung, und umgekehrt.

1:c (1 zu [0 oder 1])

  • Jede Entität der ersten Entitätsmenge kann mit höchstens einer Entität der zweiten Entitätsmenge in Beziehung stehen. Jede Entität der zweiten Entitätsmenge steht mit genau einer Entität der ersten Entitätsmenge in Beziehung.

1:m (1 zu [mindestens 1])

  • Jede Entität der ersten Entitätsmenge steht mit mindestens einer Entität der zweiten Entitätsmenge in Beziehung. Jede Entität der zweiten Entitätsmenge steht mit genau einer Entität der ersten Entitätsmenge in Beziehung.

1:mc (1 zu [beliebig vielen])

  • Jede Entität der ersten Entitätsmenge kann mit beliebig vielen Entitäten der zweiten Entitätsmenge in Beziehung stehen. Jede Entität der zweiten Entitätsmenge steht mit genau einer Entität der ersten Entitätsmenge in Beziehung.

c:c ([1 oder 0] zu [0 oder 1])

  • Jede Entität der ersten Entitätsmenge kann mit höchstens einer Entität der zweiten Entitätsmenge in Beziehung stehen, und umgekehrt.

c:m ([0 oder 1] zu [mindestens 1])

  • Jede Entität der ersten Entitätsmenge steht mit mindestens einer Entität der zweiten Entitätsmenge in Beziehung. Jede Entität der zweiten Entitätsmenge kann mit höchstens einer Entität der ersten Entitätsmenge in Beziehung stehen.

c:mc ([0 oder 1] zu [beliebig vielen])

  • Jede Entität der ersten Entitätsmenge kann mit beliebig vielen Entitäten der zweiten Entitätsmenge in Beziehung stehen. Jede Entität der zweiten Entitätsmenge kann mit höchstens einer Entität der ersten Entitätsmenge in Beziehung stehen.

m:m ([mindestens 1] zu [mindestens 1])

  • Jede Entität der ersten Entitätsmenge steht mit mindestens einer Entität der zweiten Entitätsmenge in Beziehung, und umgekehrt.

m:mc ([mindestens 1] zu [beliebig vielen])

  • Jede Entität der ersten Entitätsmenge kann mit beliebig vielen Entitäten der zweiten Entitätsmenge in Beziehung stehen. Jede Entität der zweiten Entitätsmenge steht mit mindestens einer Entität der ersten Entitätsmenge in Beziehung.

mc:mc ([beliebig viele] zu [beliebig vielen])

  • Jede Entität der ersten Entitätsmenge kann mit beliebig vielen Entitäten der zweiten Entitätsmenge in Beziehung stehen, und umgekehrt.

Wenn wir also unser Wissen in einem ERM aufzeichnen, würde das ungefähr wie in diesem Diagramm aussehen:

Buch-ERD

Hier wurde eine Buchdatenbank dargestellt, die Bücher und Autoren hat.

Hinweis: mehrere zu mehrere (m:m, mc:m, …) benötigen normalerweise eine Zwischentabelle, da sonst keine eindeutige Verbindung zwischen den Tabellen hergestellt werden kann.