n:m - Beziehungen

Smith!

Ösal hat mir berichtet, dass Sie sich gerade hinausschleichen wollen! Was denken Sie sich eigentlich, wofür Sie bezahlt werden? Sie hatten den Auftrag, eine Datenbank zu entwerfen, mit der wir die staatsfeindlichen Aktivitäten der Schulen überwachen können. Und was schicken Sie mir? Eine Datenbank, in der nur die Schüler und deren Klassen erfasst sind. Das ist ein gigantischer Bullshit, Smith!

Wir alle wissen, dass insbesondere die Lehrer verdächtig sind. Tagsüber unterrichten die Gemeinschaftskunde und nachts bauen die dann im Keller eine Bombe! 

Erweitern Sie gefälligst die Datenbank! Wir brauchen diese Informationen in der Datenbank:

  • Welche Lehrer gibt es?
  • Welcher Lehrer unterrichtet welches Fach?

30 Minuten! Keine Sekunde länger!

gez. ROUSSEAU

Ich breche hier noch zusammen. Rousseau macht mich völlig fertig... Aber wenigstens weiß ich inzwischen, wie das geht. Lehrer und Fächer, krieg ich hin, zwei Tabellen, zack, und dann düse ich ab, vielleicht geht Tiffany heute abend mit mir -

Smith, ich fürchte, du musst jetzt ganz tapfer sein. Da gibt es etwas, was du noch nicht weißt. Ich schreib' dir das mal auf:

n:m-Verbindungstabellen

Einfach ein Fremdschlüssel - funktioniert nicht immer

Jetzt hast du also diese beiden Tabellen:

Wenn wir diese beide Tabellen miteinander über einen Fremdschlüssel verbinden wollen, bekommen wir Probleme. Schau zum Beispiel mal hier:

falsch!

Genau das dürfen wir auf keinen Fall machen!

Wir verstoßen damit nämlich gegen die Atomisierung, weil es dann eine Spalte gibt, die mehrere Informationen enthält! Schau dir das mal im Beispiel an:

sehr falsch!

Mit dieser Lösung würden wir bei jedem Lehrer in einer Spalte mehrere Fächer speichern. Damit sind die Daten nicht mehr atomar. Nicht cool.

(andere Richtung ist noch da im HTML-Kommentar  - kann man das nicht weglassen? und dann so weiter:) In die andere Richtung ist es genau das Gleiche, kannst dir ja mal aufmalen, wenn es dir nicht klar ist. Die wahre Lösung lautet:

Viele zu Vielen, oder: n:m

Bisher hatten wir immer 1:n - Beziehungen. Das heißt:

Ein Datensatz in einer Tabelle stand mit vielen Datensätzen in einer anderen Tabelle in Beziehung.

Beispiel:

Ein Schüler ist in in einer  Klasse
Eine Klasse hat viele  Schüler

Zwischen Lehrern und Fächern besteht aber eine n:m - Beziehung:

Ein Lehrer hat viele  Fächer
Ein Fach wird von vielen Lehrern unterrichtet

Die Lösung: eine Verbindungstabelle

Wir lösen das Problem, in dem wir eine Verbindungstabelle einbauen. Damit wird die n:m-Beziehung in zwei 1:n-Beziehungen aufgelöst:

Diese Verbindungstabelle ist eigentlich nur eine Liste, auf der die Lehrer und ihre Fächer stehen. Und jeder Lehrer/jedes Fach kann natürlich mehrfach auf der Liste stehen:

Hier gleich ein Tipp, der einem das Leben massiv erleichtern kann:

Die Verbindungstabelle enthält IMMER die Primärschlüssel der beiden verbundenen Tabellen!

(Im Internet findet man manchmal auch eine andere mögliche Lösung, aber das juckt uns jetzt erst mal nicht.)

Zusammengesetzter Primärschlüssel

Eine Besonderheit gibt es noch bei der Verbindungstabelle: Wir können keines der Attribute als Primärschlüssel verwenden, weil jeder Wert in unserer Lehrer-Fach-Liste mehrmals vorkommen kann.

Ein einzelnes Attribut taugt also nicht als Primärschlüssel. Aber beide zusammen (lehrerNr und fachNr) sind eindeutig! Diese Kombination aus Lehrer und Fach taucht nur ein einziges Mal auf.

So etwas nennt man einen zusammengesetzten Primärschlüssel.

Nochmal im Video erklären, bitte

Also gut … Was wollte sie gleich …

  1. Eine Tabelle mit allen Lehrern, von denen wir Nachname und Vorname speichern.
  2. Eine Tabelle mit den Fächern, die es so gibt. Das Fachkürzel muss da auch drinstehen.
  3. Diese beiden Tabellen müssen wir verbinden.
  4. Bestimmt will sie noch eine Tabelle, wo die Schüler drinstehen. Vorname und Nachname dürfte reichen.
  5. Und natürlich, welcher Lehrer welche Schüler unterrichtet. Das ist bestimmt wieder so eine Verbindungstabelle.

Jetzt ist sie hoffentlich zufrieden, und ich kann -

Smith, schau mal, was mir Ösal gerade auf dem Gang gegeben hat!