Zur Darstellung eines komplexeren Beispiels zur Relationenalgebra gehen wir von folgenden Tabellen einer Oberstufenverwaltung aus:
Schüler
SNr | Name | Vorname | Tutor | Geschlecht |
---|---|---|---|---|
123 | Alberti | Hans | Müller | m |
034 | Glücklich | Gesine | Abel | w |
321 | Müser | Angelika | Abel | w |
111 | Weber | Wolfgang | Zange | m |
Kurs
KNr | Typ | Fach | Thema | Jahrgangsstufe |
---|---|---|---|---|
13 | GK | Mathematik | Analysis 2 | 12/I |
11 | GK | Physik | Mechanik 1 | 11/I |
03 | GK | Informatik | Datenbanken | 12/II |
25 | LK | Englisch | Short Stories | 12/I |
89 | GK | Informatik | Compilerbau | 13/II |
besucht
SNr | KNr | Fehlstunden | Punkte |
---|---|---|---|
123 | 03 | 00 | 12 |
123 | 25 | 03 | 07 |
321 | 89 | 00 | 14 |
111 | 03 | 21 | 03 |
Die Tabellen stellen also zwei Objekttypen und einen Beziehungstyp dar. In Relationenschreibweise liegt folgende Darstellung vor:
Schüler ( SNr, Name, Vorname, Tutor, Geschlecht )
Kurs ( KNr, Typ, Fach, Thema, Jahrgangsstufe )
besucht ( ↑SNr, ↑KNr, Fehlstunden, Punkte )
Welche Mädchen haben Informatikkurse besucht und welche Punktzahl haben sie dabei erreicht?
In diesem Beispiel werden wir die Lösung schrittweise erarbeiten.
Bestimmung (der Kursnummern) der Informatikkurse
Informatikkurse = \pi_{KNr} ( \sigma_{Fach = Informatik} (Kurs))Informatikkurse
KNr |
---|
03 |
89 |
Der Join mit der besucht-Tabelle über das gemeinsame Schlüsselattribut KNr liefert die Informatikschüler.
Informatikschüler = Informatikkurse \bowtie besuchtInformatikschüler
KNr | SNr | Fehlstunden | Punkte |
---|---|---|---|
03 | 123 | 00 | 12 |
03 | 111 | 21 | 03 |
89 | 321 | 00 | 14 |
Projektion auf die benötigten Attribute SNr und Punkte.
InformatikschülerPunkte = \pi_{SNr, Punkte} (Informatikschüler)InformatikschülerPunkte
SNr | Punkte |
---|---|
123 | 12 |
111 | 03 |
321 | 14 |
Join mit Schüler-Tabelle über das gemeinsame Schlüsselattribut SNr
InformatikschülerPunkteName = InformatikschülerPunkte \bowtie SchülerInformatikschülerPunkteName
SNr | Punkte | Name | Vorname | Tutor | Geschlecht |
---|---|---|---|---|---|
123 | 12 | Alberti | Hans | Müller | m |
111 | 03 | Weber | Wolfgang | Zange | m |
321 | 14 | Müser | Angelika | Abel | w |
Selektion der Mädchen und Projektion auf die geforderten Angaben.
Ergebnis = \pi_{Punkte, Name, Vorname} (\sigma_{Geschlecht=w} (InformatikschülerPunkteName))Ergebnis
Punkte | Name | Vorname |
---|---|---|
14 | Müser | Angelika |
So ausführlich werden wir zukünftig die Terme der relationalen Algebra nicht herleiten – es genügt der Term. Die obigen Einzelschritte lassen sich zu einem Term sehr spezialisierten Term zusammenfassen:
\pi_{Punkte, Name, Vorname} (\sigma_{Geschlecht=w} ( \pi_{SNr, Punkte} ( \pi_{KNr} ( \sigma_{Fach = Informatik} (Kurs)) \bowtie besucht ) \bowtie Schüler))Diese extreme Einschränkung ist in der Regel nicht notwendig, wir sollten jedoch darauf achten, die entstehenden Tabellen nicht unnötig groß werden zu lassen. Ein (nicht zu verwendendes) Gegenbeispiel wäre der Term:
\pi_{Punkte, Name, Vorname} (\sigma_{Geschlecht=w \land Fach=Informatik} ( Kurs \bowtie besucht \bowtie Schüler))In diesem Beispiel würde der Join (der ja zuerst ein Kreuzprodukt bildet) über drei Tabellen unnötig groß werden – dies führt zu einem größeren Speicherbedarf und damit auch zu einer schlechteren Laufzeit bei der späteren Verarbeitung.