====== Datenmodellierung ====== ===== Musteraufgabe ===== Lea und Dominik gehen in den Schwimmverein. Um Ihrem Trainer die Arbeit zu erleichtern, wollen sie eine Datenbank für die Vereinsverwaltung zu erstellen. Dazu sammeln Sie zuerst die Anforderungen anhand von [[https://en.wikipedia.org/wiki/Use_case|Use-Cases]]: * Einmal im Jahr wird an alle Vereinsmitglieder die jährliche Beitragsrechnung per Post versandt. * Die ausstehenden und gezahlten Beiträge sollen gespeichert werden * Vor Turnieren ist es wichtig, alle Teilnehmer telefonisch erreichen zu können, damit letzte Details abgesprochen werden können. Es soll möglich sein, beliebig viele Telefonnummern je Mitglied zu speichern und zu vermerken, ob es sich um eine Festnetz- oder Handynummer handelt. * Der Verein ist in vier Teilgruppen unterteilt: Schwimmschule, "Goldfische" (Kinder bis 13), Jungschwimmer (bis 17) und Erwachsenenmannschaft. * Jede Teilgruppe hat ein- bis zwei Leiter/innen, die üblicherweise zusätzlich einer anderen Gruppe als Mitglied angehört. Die Leiterin der Goldfische schwimmt beispielsweise in der Erwachsenenmannschaft mit. * Es gibt verschiedene Schwimmdisziplinen, z.B. 50 m Kraul, 1 km Kraul, 400 m Brustschwimmen usw. Für jedes Mitglied sollen die Bestzeiten für jede Disziplin auf 1/100 s genau speicherbar sein. Wir wollen im folgenden das objektorientierte Datenmodell entwickeln und dieses dann in ein relationales Modell überführen. ==== Datenmodell ==== {{ :jg10:modellierung10:pasted:20221007-123530.png?600 }} Zur Relation "schwimmt" soll noch die Bestzeit je Mitglied und Disziplin gespeichert werden. Dies kann ganz einfach durch ein zusätzliches Attribut "bestzeit_hundertstel_s" in der Beziehungstabelle zur n:m-Relation geschehen. Im Datenmodell wird dies durch die gestichelte Linie veranschaulicht. ==== Relationales Modell ( = Datenbankschema) ==== Schritte zur Übertragung des Datenmodells in ein relationales Modell: * Falls noch nicht geschehen: Primärschlüssel je Tabelle hinzufügen * Jede 1:n-Relation wird durch ein zusätzliches Fremdschlüsselattribut auf der "n-Seite" realisiert. * Jede n:m-Relation wird durch eine Beziehungstabelle realisiert. Wir schreiben das relationale Modell in folgender Kurzform: * Mitglied [__id: int__, familienname: varchar(300), rufname: varchar(30), plz: int, ort: varchar(100), strasse: varchar(80), hausNr: varchar(10), festnetz: varchar(20), handy: varchar(20), **gruppe_id: int**] * Gruppe [__id: int__, name: varchar(80), **leiter_id: int**] * Beitrag[__id: int__, betrag: decimal(10, 2), jahr: int, ist_bezahlt: boolean, **mitglied_id: int**] * Disziplin [__id: int__, name: varchar(80)] * schwimmt [**__mitglied_id__**, **__disziplin_id__**, bestzeit_hundertstel_s: int]] **Bemerkungen:** * Es ist üblich, die Beziehungstabelle zu einer n:m-Relation genauso zu nennen wie die Beziehung selbst, also in diesem Fall "schwimmt". Es gibt aber auch Projekte, in denen der Name der Beziehungstabelle einfach aus den Namen der beteiligten Tabellen zusammengesetzt wird, also hier Mitglied_Disziplin. Die letztgenannte Konvention stößt aber an ihre Grenzen, wenn es zwischen zwei Tabellen mehrere n:m-Relationen gibt. * Die Fremdschlüssel sind oben fett gedruckt, damit Du sie besser erkennst. Das ist normalerweise nicht nötig. * In der Tabelle ''schwimmt'' sind ''mitglied_id'' und ''disziplin_id'' fremdschlüssel, da in den betreffenden Spalten Werte der Primärschlüssel der Tabellen ''Mitglied'' bzw. ''Disziplin'' gespeichert werden. Gleichzeitig bilden sie zusammen den Primärschlüssel der Tabelle ''schwimmt''. * Die 1:1-Relation "leitet" haben wir oben durch das Attribut ''leiterin_id'' in der Tabelle ''Gruppe'' realisiert. Man hätte sie genausogut durch ein Attribut ''geleitete_gruppe_id'' in der Tabelle ''Mitglied'' realisieren können. Bei einer 1:1-Relation kann man sich also aussuchen, auf welcher Seite der Beziehung man das Fremdschlüsselattribut unterbringt. ===== Aufgabe 1: Volleyballturnier ===== Das Emmy Noether-Gymnasium in Kleinschwabhausen möchte für die umliegenden Schulen (Name) ein Volleyballturnier ausrichten. Die Daten dazu werden in einer Datenbank verwaltet. Gespeichert werden sollen alle Mannschaften (Name, Altersklasse, Geschlecht (m/w/gemischt), Schule) zusammen mit den Schüler/innen (Rufname, Familienname, Geschlecht, Jahrgangsstufe) sowie die Daten der Spiele (wer gegen wen; Ergebnis, Schülerschiedsrichter). - Zeichne ein Klassendiagramm (ohne Attribute). - Erstelle das Datenbankschema. [[.volleyball-loesung:start|Mögliche Lösung]] ===== Aufgabe 2: Fahrradgeschäft ===== Ein Fahrradgeschäft möchte die Daten seiner Kundinnen (Rufname, Familienname, Anschrift, Tel), Waren (Bezeichnung, Preis, Lieferant, Einheit, Vorrat), Lieferanten (Name, Anschrift, Tel, Ansprechpartner) sowie Bestellungen in einer Datenbank speichern. Die Datenbank soll insbesondere die Beantwortung folgender Fragen ermöglichen: * Welche Waren in welcher Menge hat wer wann bestellt? * Wurde die Bestellung schon geliefert? Wann? * Wurde die Bestellung schon bezahlt? Wann? * Welche Lieferanten beliefern das Fahrradgeschäft mit welchen Waren? //Bemerkung: Die Lieferanten beliefern das Fahrradgeschäft mit Waren. Das Fahrradgeschäft verkauft die Waren an die Kund/innen.// - Zeichne das Klassendiagramm. - Erstelle das Datenbankschema. [[.fahrradgeschaeft-loesung:start|Mögliche Lösung]] ===== Aufgabe 3: Autovermietung ===== Eine Autovermietung hat einen Fuhrpark voller Autos, die zu unterschiedlichen Typen gehören (z.B. BMW i3, VW Passat, ...). Sie werden gegen eine - je nach Typ unterschiedliche - tägliche Gebühr vermietet. Das Unternehmen benötigt eine Datenbank, in der die Daten seiner Autos (Kennzeichen, Typ) und seiner Kunden (Rufname, Familienname, Anschrift, Telefnonummer) gespeichert werden sollen. Zudem will es wissen, welcher Kunde wann (von ... bis) welches Auto entliehen oder reserviert hat und ob die Gebühr schon bezahlt ist. - Zeichne das Klassendiagramm. - Erstelle das Datenbankschema. [[.autovermietung:loesung|Mögliche Lösung]] ===== Aufgabe 4: Lager ===== Die Daten eines großen Baustofflagers sollen in einer Datenbank verwaltet werden. Das Lager besteht aus mehreren Hallen, in denen jeweils mehrere Regale stehen. Jede Halle hat einen Namen (z.B. „Halle 1“), jedes Regal ist mit einem – je Halle eindeutigen – Buchstaben bezeichnet. Auf den Regalen liegen Waren, zu denen jeweils * der Name, * die Information darüber, ob es sich um Gefahrgut handelt oder nicht und * das Einlagerungsdatum gespeichert werden sollen. \\ Ist von einer Ware viel vorhanden, so kann es sein, dass sie auf mehreren Regalen verteilt lagert. Es kann aber auch sein, dass sich in einem Regal mehrere verschiedene Waren befinden. Aus der Datenbank soll sich die Information entnehmen lassen, in welchen Regalen welche Waren in welcher Anzahl lagern. \\ \\ Beispielsweise könnten 20 Sack Trasszement in Regal C, Halle 1 lagern, weitere 30 Sack Trasszement in Regal F, Halle 4. \\ * a) Zeichne das Klassendiagramm (nur Klassenbezeichner und Relationen mit Kardinalitäten, keine Attribute). * b) Erstelle das Datenbankschema (Tabellennamen, Attribute mit Datentypen). Unterstreiche dabei die Primärschlüssel. [[.lagerloesung:start|Mögliche Lösung...]]