Inf10 1.1 Daten in mehreren Tabellen – das Kreuzprodukt

Zu den Aufgaben

In Datenbanken werden Informationen oft in mehreren Tabellen gespeichert. Dabei gibt es oft Zusammenhänge zwischen den Daten verschiedener Tabellen.

Modellierung

Als Beispiel schauen wir uns eine Datenbank an, in der Freizeitparks und deren Heimatgemeinden betrachtet werden (dbiu.de). Man kann die Daten der Tabelle dabei in Klassen so modellieren:

In jeder Tabelle gibt es ein Attribut, das für alle Zeilen der Tabelle einen eindeutigen Wert haben muss. Wir nennen dieses Attribut den (Primär-)Schlüssel der Tabelle. Der Schlüssel einer Tabelle wird unterstrichen.

Merksatz 1.1.1

Wir stellen fest, dass jeder Freizeitpark in genau einer Gemeinde steht und jede Gemeinde theoretisch mehrere Freizeitparks haben kann. Um diese 1:n Beziehung darzustellen, gibt es mehrere Möglichkeiten:

  1. Speichern aller Freizeitparks in einem Attribut bei der Gemeinde
  2. Speichern aller Freizeitparks in mehreren Attributen in der Gemeinde
  3. Speichern der Gemeinde bei jedem Freizeitpark

Version 1 hat den Nachteil, dass ein Attribut durch die mehreren Einträge zum einen beliebig viel Speicherplatz brauchen kann (was die Abfragen langsamer machen würde) und zum anderen nicht mehr leicht durchsucht werden kann.

Version 2 hat den Nachteil, dass man keine Flexibilität hat. Wenn man 10 Plätze freihält, kann es trotzdem eine Gemeinde mit 11 Freizeitparks geben, die dann nicht gespeichert werden können und gleichzeitig gibt es sicher viele Gemeinden mit einem Freizeitpark, die dann viele leere Attribute haben. Mal abgesehen davon, dass wir nun auch bei den Abfragen mehrere Spalten mit dem gleichen Inhalt haben und so selber im SELECT Statement angeben müssten, welche Spalte wir denn haben wollen.

Somit bleibt uns nur Version 3, die sich schön umsetzen lässt, indem man eine Spalte im Freizeitpark einfügt, der eindeutig eine Gemeinde zugeordnet wird. Dafür nutzt man den Schlüssel der Gemeinde Tabelle, da diese eindeutig ist.

Die 1:n Beziehung wird durch ein Attribut auf der „n“-Seite der Beziehung gespeichert. Dabei zeigt dieser Fremdschlüssel auf den Primärschlüssel einer anderen Tabelle. Fremdschlüssel werden gestrichelt unterstrichen.

Merksatz 1.1.2

Abfragen

In der Abfrage müssen wir nun beide Tabellen als Quelle angeben. Als Beispiel schauen wir uns die Abfrage an, die alle Namen von Freizeitpark und ihren Gemeinden ausgibt:

SELECT FREIZEITPARK.name, GEMEINDE.name
FROM FREIZEITPARK, GEMEINDE
WHERE 1

Wenn wir die Abfrage so erstellen stellt sich raus, dass jeder Freizeitpark in jeder Gemeinde steht. Dies passiert daher, weil der Computer nicht weiß, welche Daten zueinander gehören. Daher kombiniert er einfach alle Zeilen der einen Tabelle (hier FREIZEITPARK) mit allen Zeilen der anderen Tabelle (hier GEMEINDE). Um die falschen Daten zu löschen müssen wir alle Zeilen wegwerfen, in denen Schlüssel und Fremdschlüssel der nicht übereinstimmen:

SELECT FREIZEITPARK.name, GEMEINDE.name
FROM FREIZEITPARK, GEMEINDE
WHERE FREIZEITPARK.gemeindeschluessel=GEMEINDE.schluessel

Bei Abfragen über mehrere Tabellen müssen alle Tabellen als Quelle angegeben werden, aus denen Informationen gezogen werden sollen. Dabei werden zuerst alle Zeilen beider Tabellen kombiniert. Wir nennen dies das Kreuzprodukt der Tabellen.

Um alle Einträge zu löschen, die keine sinnvollen Daten enthalten, müssen wir den Schlüssel der einen Tabelle mit dem Fremdschlüssel der anderen Tabelle vergleichen.

Merksatz 1.1.3

Aufgaben

Alle Aufgaben werden mit der DBIU gelöst: www.dbiu.de/bayern

Aufgabe 1:

Gib alle Gemeindenamen aus, in denen ein Freizeitpark steht.

Aufgabe 2:

Finde heraus, welche Gemeinden mit einem Fahrradweg erreichbar sind.

Aufgabe 3:

Gib aus, wie viele Radwege nach Rosenheim führen.

Aufgabe 4:

Gib URL und alle Name der Gemeinden aller Schwimmbäder aus.

Aufgabe 5:

Gib URL und alle Name der Gemeinden aller Schwimmbäder aus.

Aufgabe 6:

Gib alle Nachbargemeinden von „Rosenheim“ aus. (Hinweis: Nutze eine Abfrage zum Finden des Gemeindeschlüssels für Rosenheim)

Aufgabe 7:

Gib alle Schwimmbäder und die jeweilige Gemeinde aus, die nördlich vom „Strandbad Point“ liegen. Sortiere nach dem Gemeindenamen.

Aufgabe 8:

Überlege, wie du eine Tabelle erzeugen kannst, die ausgibt, welcher Radweg von welcher Gemeinde zu welcher Gemeinde führt (also nicht die IDs). (Hinweis: Du musst mehrere Abfragen ineinander verschachteln)

Aufgabe 9:

Wenn du fertig bist, kannst du versuchen das Murder-Mystery aufzuklären.


Zurück zur Übersicht