Die Olympia-Datenbank
(das Standard-Beispiel aus dem Praktikum)

Olympia-DB: ModellUML-Klassendiagramm

Relationales Datenbankschema (ohne Domänen)

sportler:  id, name, vorname*, geburtstag, land, geschlecht
           {PK: id}
           {UNIQUE: name, vorname*, geburtstag, land, geschlecht}
           {geschlecht IN ('w', 'm')}

wettkampf: id, sportart, wettkampfart, geschlecht, sportstaette, beginn*
           {PK: id}
           {UNIQUE: sportart, wettkampfart, geschlecht}
           {geschlecht IN ('w', 'm')}

teilnahme: s_id, w_id, platz*, doping*, disqualifiziert
           {PK: s_id, w_id}
           {FK: s_id -> sportler: id}
           {FK: w_id -> wettkampf: id}
           {platz > 0}
           {NOT(doping IS TRUE AND disqualifiziert IS FALSE)}
           {NOT(disqualifiziert IS TRUE AND platz IS NOT NULL)}

olympia1_create.sql(Datenbank gemäß Modell 1 erstellen)
olympia_aufgabe_1.sql(Praktikumsaufgabe Olympia Teil 1)
olympia1_aufgabe_1_loesung.sql(Lösungsvorschläge zu Aufgabe 1)
olympia_aufgabe_2.sql(Praktikumsaufgabe Olympia Teil 2)
olympia1_aufgabe_2_loesung.sql(Lösungsvorschläge zu Aufgabe 2)
olympia_aufgabe_3.sql(Praktikumsaufgabe Olympia Teil 3)
olympia1_aufgabe_3_loesung.sql(Lösungsvorschläge zu Aufgabe 3)
olympia_aufgabe_4.sql(Praktikumsaufgabe Olympia Teil 4)
olympia1_aufgabe_4_loesung.sql(Lösungsvorschläge zu Aufgabe 4)

Robustes Olympia-DB-Datenmodell

Olympia-DB: Robustes Datenmodell (UML)UML-Klassendiagramm

Relationales Datenbankschema (ohne Domänen)

enum_land:         id, kuerzel, name_de, name_en, name_fr
                   {PK: id} 
                   {UNIQUE: kuerzel}
                   {UNIQUE: name_de}
                   {UNIQUE: name_en}
                   {UNIQUE: name_fr}

enum_sportart:     id, name
                   {PK: id} 
                   {UNIQUE: name}

enum_wettkampfart: id, name
                   {PK: id} 
                   {UNIQUE: name}

enum_sportstaette: id, name
                   {PK: id} 
                   {UNIQUE: name}

e_sportler:        id, name, vorname*, geburtstag, l_id, geschlecht 
                   {PK: id} 
                   {UNIQUE: name, vorname*, geburtstag, land, geschlecht}

e_wettkampf:       id, wa_id, geschlecht, spst_id, beginn* 
                   {PK: id}
                   {UNIQUE: wa_id, geschlecht}  

r_teilnahme:       s_id, w_id, platz*, doping*, disqualifiziert  
                   {PK: s_id, w_id}  
                   {FK: s_id -> e_sportler: id}
                   {FK: w_id -> e_wettkampf: id}
                   {platz > 0}
                   {NOT(doping IS TRUE AND disqualifiziert IS FALSE)}
                   {NOT(disqualifiziert IS TRUE AND platz IS NOT NULL)}
                   {(SELECT geschlecht FROM e_sportler s
                     WHERE s.id = NEW.s_id)
                    =
                    (SELECT geschlecht FROM e_wettkampf w
                     WHERE w.id = NEW.w_id)
                   }
                   {platz <= (SELECT COUNT(*)
                              FROM   r_teilnahme t
                              WHERE      t.w_id = NEW.w_id 
                                     AND t.platz IS NOT NULL
                             )
                   }

olympia2_create.sql(Datenbank gemäß Modell 2 erstellen)
olympia_aufgabe_1.sql(Praktikumsaufgabe Olympia Teil 1)
olympia2_aufgabe_1_loesung.sql(Lösungsvorschläge zu Aufgabe 1)
olympia_aufgabe_2.sql(Praktikumsaufgabe Olympia Teil 2)
olympia2_aufgabe_2_loesung.sql(Lösungsvorschläge zu Aufgabe 2)
olympia_aufgabe_3.sql(Praktikumsaufgabe Olympia Teil 3)
olympia2_aufgabe_3_loesung.sql(Lösungsvorschläge zu Aufgabe 3)
olympia_aufgabe_4.sql(Praktikumsaufgabe Olympia Teil 4)
olympia2_aufgabe_4_loesung.sql(Lösungsvorschläge zu Aufgabe 4)

Robustes Olympia-DB-Datenmodell mit Views zur Vereinfachung

Olympia-DB: Robustes Datenmodell mit Views(UML)UML-Klassendiagramm

Relationales Datenbankschema (ohne Domänen)

Das relationale Datenbankschema das zweiten Modell wird eins-zu-eins übernommen.
Das relationale Datenbankschema des ersten Modells wird mit Hilfe von Updatable Views auf die Tabellen des zweiten Modells abgebildet.
Darüber hinaus gibt es noch drei weitere Views, die Joins zwischen zwei bzw. drei der Tabellen sportler, wettkampf und teilnahme auf eine einzige virtuelle Tabelle abbilden.

olympia3_create.sql(Datenbank gemäß Modell 3 erstellen)
olympia_aufgabe_1.sql(Praktikumsaufgabe Olympia Teil 1)
olympia1_aufgabe_1_loesung.sql
olympia2_aufgabe_1_loesung.sql
olympia3_aufgabe_1_loesung.sql
(Lösungsvorschläge zu Aufgabe 1)
olympia_aufgabe_2.sql(Praktikumsaufgabe Olympia Teil 2)
olympia1_aufgabe_2_loesung.sql
olympia2_aufgabe_2_loesung.sql
olympia3_aufgabe_2_loesung.sql
(Lösungsvorschläge zu Aufgabe 2)
olympia_aufgabe_3.sql(Praktikumsaufgabe Olympia Teil 3)
olympia1_aufgabe_3_loesung.sql
olympia2_aufgabe_3_loesung.sql
olympia3_aufgabe_3_loesung.sql
(Lösungsvorschläge zu Aufgabe 3)
olympia_aufgabe_4.sql(Praktikumsaufgabe Olympia Teil 4)
olympia1_aufgabe_4_loesung.sql
olympia2_aufgabe_4_loesung.sql
olympia3_aufgabe_4_loesung.sql
(Lösungsvorschläge zu Aufgabe 4)