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.
