PMG2426 4/DB Beleg/Nelly
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>SQL</language>
= Datenbank - Fitnessstudio =
<font size=4>'''Aufgabe: Erstellen und Modellieren von einem Datenbankprojekt'''</font>
=Ziel der Datenbank=
Diese Datenbank dient zur '''Strukturierung und Verwaltung der Daten eines Fitnessstudios''', indem Mitglieder, deren Verträge sowie angebotene Kurse übersichtlich erfasst und miteinander verknüpft werden. Zusätzlich ermöglicht sie durch die Teilnahme Tabelle die Dokumentation, welche Mitglieder an welchen Kursen teilnehmen und unterstützt so Auswertungen und organisatorische Prozesse.
=Modellierung in einem ERM=
[[Bild:Nels_Screenshot_2026-02-02_110613.png]]
=Transformation in das Relationenmodell (= die zu erstellende Tabellen)=
*<font color=#104E8>Mitglied</font> ('''Mitglied_ID''', Vorname, Nachname, Geschlecht, Ort, Straße, Status)
*<font color=#104E8>Vertrag</font> ('''Vertrag_ID''', Startdatum, Enddatum, Laufzeit, Monatsbeitrag, ''Mitglied_ID'' )
*<font color=#104E8>Kurs</font> ('''Kurs_ID''', Kursname, Trainername, Raum, Wochentag, Uhrzeit)
*<font color=#104E8>Teilnahme</font> (''Mitglied_ID'', ''Kurs_ID'')
<popup name="Als Schaubild">
[[Bild:Nels_Screenshot_2026-02-02_095216.png]]
</popup>
=Erläuterungen des Datenbank-Modells=
#<font color=#104E8>'''Entitäten:''' </font>
#*Mitglied: angemeldete Personen im Fitnessstudio
#*Vertrag: abgeschlossene Mitgliedsverträge (z.B Bronze, Silber, Gold)
#*Kurs: angebotene Fitnesskurse des Studios
#<font color=#104E8>'''Attribute:''' </font>
#*beschreiben die Eigenschaften einer Entität
#*Mitglied: alle persönlichen und organisatorischen Informationen über die angemeldete Peson
#*Vertrag: Vertragsdaten eines Mitglieds, wie Laufzeit oder monatilicher Beitrag
#*Kurs: Angaben wie Kursname, Trainer oder Termin des Kurses
#<font color=#104E8>'''Primär- und Fremdschlüssel''' </font>
#*Primärschlüssel identifizieren den Datensatz eindeutig (z.B Mitglied_ID, Vertrag_ID, ...)
#*Mitglied_ID ist im Vertrag als Fremdschlüssel enthalten, um den Vertrag einem Mitglied zuzuordnen
#<font color=#104E8>'''Beziehungen und Kardinalitäten''' </font>
#*Eine Beziehung beschreibt wie Entitäten miteinander verknüpft sind
#*Kardinalitäten geben an, wie viele Entitäten an der Beziehung beteiligt sind
#*Zwischen Mitglied und Vertrag besteht eine 1:n Beziehung, da ein Mitglied im Laufe der Zeit mehrere Verträge besitzen kann (Gold, Silber, Bronze = Vertragsart) aber ein Vertrag nur einem Mitglied zugeordnet ist
#*Zwischen Mitglied und Kurs besteht eine n:m Beziehung, da ein Mitglied mehrere Kurse besuchen kann und ein Kurs von mehreren Mitgliedern besucht wird
#*die n:m Beziehung wird in einer dritten Tabelle ufgelößt, wodurch die Datenbank übersichtlich, redundantfrei und erweiterbar bleibt
=Datenbank=
<code id="52dcdf16795a2">
DROP TABLE IF EXISTS Mitglied;
CREATE TABLE Mitglied (
Mitglied_ID varchar(255),
Vorname varchar(255),
Nachname varchar(255),
PLZ varchar (255),
Ort varchar(255),
Straße varchar(255),
Geburtsdatum varchar (255),
PRIMARY KEY (Mitglied_ID)
);
DROP TABLE IF EXISTS Vertrag;
CREATE TABLE Vertrag (
Vertrag_ID varchar(255),
Vertragsart varchar(255),
Laufzeit varchar(255),
Monatsbeitrag varchar (255),
Startdatum varchar(255),
Enddatum varchar(255),
Mitglied_ID varchar (255),
PRIMARY KEY (Vertrag_ID)
);
DROP TABLE IF EXISTS Kurs;
CREATE TABLE Kurs (
Kurs_ID varchar(255),
Kursname varchar(255),
Trainername varchar(255),
Raum varchar (255),
Wochentag varchar(255),
Uhrzeit varchar(255),
PRIMARY KEY (Kurs_ID)
);
DROP TABLE IF EXISTS Teilnahme;
CREATE TABLE Teilnahme (
Teilnahme_ID varchar(255),
Mitglied_ID varchar(255),
Kurs_ID varchar(255),
Status varchar(255),
PRIMARY KEY (Teilnahme_ID)
);
INSERT INTO Mitglied VALUES ('M001', 'Anna', 'Schneider', '10115', 'Berlin', 'Hauptstraße 12', '1995-04-18');
INSERT INTO Mitglied VALUES ('M002', 'Max', 'Müller', '80331', 'München', 'Bahnhofstraße 5', '1990-09-02');
INSERT INTO Mitglied VALUES ('M003', 'Laura', 'Weber', '50667', 'Köln', 'Domstraße 20', '1998-12-11');
INSERT INTO Mitglied VALUES ('M004', 'Tim', 'Becker', '20095', 'Hamburg', 'Elbweg 7', '1987-06-30');
INSERT INTO Mitglied VALUES ('M005', 'Sophie', 'Hoffmann', '70173', 'Stuttgart', 'Parkallee 3', '2001-01-25');
INSERT INTO Vertrag VALUES ('V001', 'Bronze', '12 Monate', '29.99', '2024-01-01', '2024-12-31', 'M001');
INSERT INTO Vertrag VALUES ('V002', 'Silber', '12 Monate', '39.99', '2024-01-01', '2024-12-31', 'M001');
INSERT INTO Vertrag VALUES ('V003', 'Gold', '24 Monate', '49.99', '2023-01-01', '2024-12-31', 'M002');
INSERT INTO Vertrag VALUES ('V004', 'Bronze', '6 Monate', '29.99', '2024-03-01', '2024-08-31', 'M003');
INSERT INTO Vertrag VALUES ('V005', 'Silber', '12 Monate', '39.99', '2024-09-01', '2025-08-31', 'M003');
INSERT INTO Vertrag VALUES ('V006', 'Gold', '12 Monate', '49.99', '2024-02-01', '2025-01-31', 'M004');
INSERT INTO Vertrag VALUES ('V007', 'Bronze', '12 Monate', '29.99', '2024-04-01', '2025-03-31', 'M005');
INSERT INTO Vertrag VALUES ('V008', 'Gold', '24 Monate', '49.99', '2024-04-01', '2026-03-31', 'M005');
INSERT INTO Kurs VALUES ('K001', 'Yoga', 'Anna Meier', 'Raum A', 'Montag', '18:00');
INSERT INTO Kurs VALUES ('K002', 'Spinning', 'Tom Schulz', 'Raum B', 'Dienstag', '19:00');
INSERT INTO Kurs VALUES ('K003', 'Pilates', 'Laura König', 'Raum C', 'Mittwoch', '17:00');
INSERT INTO Kurs VALUES ('K004', 'Krafttraining', 'Markus Braun', 'Raum D', 'Donnerstag', '20:00');
INSERT INTO Teilnahme VALUES ('T001', 'M001', 'K001', 'aktiv');
INSERT INTO Teilnahme VALUES ('T002', 'M001', 'K002', 'aktiv');
INSERT INTO Teilnahme VALUES ('T003', 'M001', 'K003', 'aktiv');
INSERT INTO Teilnahme VALUES ('T004', 'M002', 'K001', 'aktiv');
INSERT INTO Teilnahme VALUES ('T005', 'M002', 'K004', 'aktiv');
INSERT INTO Teilnahme VALUES ('T006', 'M003', 'K002', 'aktiv');
INSERT INTO Teilnahme VALUES ('T007', 'M003', 'K003', 'aktiv');
INSERT INTO Teilnahme VALUES ('T008', 'M003', 'K004', 'aktiv');
INSERT INTO Teilnahme VALUES ('T009', 'M004', 'K001', 'aktiv');
INSERT INTO Teilnahme VALUES ('T010', 'M004', 'K003', 'aktiv');
INSERT INTO Teilnahme VALUES ('T011', 'M005', 'K001', 'aktiv');
INSERT INTO Teilnahme VALUES ('T012', 'M005', 'K002', 'aktiv');
INSERT INTO Teilnahme VALUES ('T013', 'M005', 'K004', 'aktiv');
</code>
=Abfragen=
<u>Ausgabe aller Mitglieder mit Vorname und Nachname</u>
<run id="52f89f4ff177a">
SELECT Vorname, Nachname
FROM Mitglied;
</run>
<u>Ausgabe aller Fitnesskurse und deren Trainer</u>
<run id="52f89f4ff1818">
SELECT Kursname, Trainername
FROM Kurs;
</run>
<u>Ausgabe aller Vertragsarten mit Monatsbeitrag</u>
<run id="52f89f4ff18b8">
SELECT DISTINCT Vertragsart, Monatsbeitrag
FROM Vertrag;
</run>
<u>Ausgabe der Mitglieder und ihrer Vertragsarten</u>
<run id="52f89f4ff193f">
SELECT
Mitglied.Vorname,
Mitglied.Nachname,
GROUP_CONCAT(Vertrag.Vertragsart) AS Vertragsarten
FROM Mitglied
JOIN Vertrag
ON Mitglied.Mitglied_ID = Vertrag.Mitglied_ID
GROUP BY Mitglied.Mitglied_ID, Mitglied.Vorname, Mitglied.Nachname;
</run>
<u>Ausgabe der Teilnehmer des Yogakurses</u>
<run id="52f89f4ff19c5">
SELECT
Mitglied.Vorname,
Mitglied.Nachname,
Kurs.Kursname,
Teilnahme.Status
FROM Mitglied
JOIN Teilnahme ON Mitglied.Mitglied_ID = Teilnahme.Mitglied_ID
JOIN Kurs ON Teilnahme.Kurs_ID = Kurs.Kurs_ID
WHERE Kurs.Kursname = 'Yoga';
</run>
<u>Ausgabe der Anzahl der Kurse pro Mitglied</u>
<run id="52f89f4ff1a53">
SELECT Mitglied.Vorname, Mitglied.Nachname, COUNT(Teilnahme.Kurs_ID) AS Anzahl_Kurse
FROM Mitglied
JOIN Teilnahme ON Mitglied.Mitglied_ID = Teilnahme.Mitglied_ID
GROUP BY Mitglied.Mitglied_ID, Mitglied.Vorname, Mitglied.Nachname
HAVING COUNT(Teilnahme.Kurs_ID) > 1;
</run>
<u>Zusammenfassen aller Abfragen</u>
<run id="52f89f4ff1b43">
SELECT
Mitglied.Vorname,
Mitglied.Nachname,
COUNT(DISTINCT Teilnahme.Kurs_ID) AS Anzahl_Kurse,
GROUP_CONCAT(DISTINCT Kurs.Kursname) AS Kurse,
COUNT(DISTINCT Vertrag.Vertragsart) AS Anzahl_Vertragsarten,
GROUP_CONCAT(DISTINCT Vertrag.Vertragsart ) AS Vertragsarten
FROM Mitglied
LEFT JOIN Teilnahme ON Mitglied.Mitglied_ID = Teilnahme.Mitglied_ID
LEFT JOIN Kurs ON Teilnahme.Kurs_ID = Kurs.Kurs_ID
LEFT JOIN Vertrag ON Mitglied.Mitglied_ID = Vertrag.Mitglied_ID
GROUP BY Mitglied.Mitglied_ID, Mitglied.Vorname, Mitglied.Nachname
HAVING COUNT(DISTINCT Teilnahme.Kurs_ID) > 0
AND COUNT(DISTINCT Vertrag.Vertragsart) >= 1;
</run>
=kritische Reflexion zur Modelllierung und Umsetzung=
Ich habe die Tabellen für Mitglieder, Verträge, Kurse und die Teilnahme erstellt, um alle wichtigen Informationen abzubilden. Dabei habe ich gelernt, wie wichtig eine
klare Struktur ist, z. B. dass alle Spalten richtig vorhanden sind und die Daten konsistent bleiben. Einige Fehler, wie fehlende Spalten, fehlerbehaftete Syntax oder
falsche Einträge haben mir gezeigt, dass man beim Planen genau arbeiten muss.
Positiv ist, dass ich Abfragen erstellen konnte, die zum Beispiel alle Kurse oder Verträge eines Mitglieds zusammenfassen. Gleichzeitig habe ich gemerkt,
dass manche Filter genau überlegt sein müssen, damit keine Mitglieder in der Abfrage fehlen.
Insgesamt hat mir das Projekt geholfen, den Umgang mit SQL und relationalen Datenbanken besser zu verstehen.
=Verwendete Quellen, Tools, etc.=
* ERDplus