PMG2426 1/DB Beleg/Mia

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SQL</language>
='''Datenbank Fußball'''=

==Ziel der Datenbank==
Ziel der Datenbank ist es, fußballbezogene Informationen strukturiert, übersichtlich und effizient darzustellen und abrufen zu können. Dabei sieht man die wichtigsten Entitäten von Fußball -Verein, Spieler, Trainer und Liga- mit den dazugehörigen Beziehungen. Man kann Fußball nach verschiedenen Kriterien sortieren und die Datenbank ermöglicht es, diese Zusammenhänge wie z.B. die Zugehörigkeit von Spielern und Trainern zu Vereinen darzustellen oder auch die Spieler nach Alter zu sortieren. 
==Begründung der Themenwahl==
Ich habe das Thema Fußball gewählt, weil es ein sehr bekannter, beliebter und allgemein verständlicher Sport ist, der sich gut für die Modellierung einer relationalen Datenbank eignet. Durch die klaren Strukturen und realen Beziehungen zwischen Vereinen, Spielern, Trainern und Ligen lassen sich die grundlegenden Eigenschaften einer Datenbank wie Entitäten, Attribute sowie Relationen gut darstellen und analysieren. Zudem bietet die Tabelle viele Erweiterungsmöglichkeiten wie z.B. Spiele oder Tabellen, wodurch die Datenbank realitätsnah und flexibel ist.
==Entity Relationship Modell==
[[Bild:Miaaa_Jajajajja.png || 700px]] <br>
Es gibt 4 Entities: Trainer, Verein, Spieler, Liga.<br>
Diese besitzen die entsprechenden Attribute (Eigenschaften) <br>
Dabei gibt es drei 1-n-Beziehungen. 
==Transformation in das Relationenmodell==
[[Bild:Miaaa_Image.png || 600px]] <br>
Verein('''VID''',Name,Gründungsjahr,Stadt,Stadion) <br>
Spieler('''SID''',Name,Geburtsjahr,Position) <br>
Trainer('''TID''',Name,Geburtsjahr) <br>
Liga('''LID''',Name) <br>
===Relationen in Sätzen===
Ein Verein spielt in einer Liga und in einer Liga spielen mehrere Vereine. <br>
Ein Trainer trainiert einen Verein und in einem Verein trainieren mehrere Trainer. (mehrere kleine Trainer, ein Haupttrainer, aber die 1-n Beziehung konnte man besser darstellen, da der Trainer auch Attribute hat und somit zur Entity wird) <br>
Ein Spieler spielt in einem Verein und in einem Verein spielen mehrere Spieler.
==Normalformen==
Die erste Normalform ist erfüllt, da alle Attribute atomar und jede Tabelle über einen eindeutigen Primärschlüssel verfügt. <br>
Die zweite Normalform ist erfüllt, da in allen Tabellen ausschließlich einfache Primärschlüssel verwendet werden und somit keine Teilabhängigkeit existiert. <br>
Die dritte Normalform ist größtenteils erreicht, wobei einzelne Attribute aus Gründen der Übersichtlichkeit und Komplexität der Aufgabe nicht weiter normalisiert wurden. <br>
=Datenbank=
<code id="6983a4046038c">DROP TABLE IF EXISTS Verein;
CREATE TABLE Verein (
  VID varchar NOT NULL UNIQUE,
  Name varchar,
  Gründungsjahr varchar,
  Stadt varchar, 
  Stadion varchar, 
  LID varchar,
  PRIMARY KEY (VID),
  foreign key (LID) references Liga(LID)
);

drop table if exists Liga;
create table Liga (
  LID varchar NOT NULL UNIQUE,
  Name varchar,
  primary key (LID)
);

drop table if exists Spieler;
create table Spieler (
  SID varchar NOT NULL UNIQUE,
  Name varchar,
  Position varchar, 
  Geburtsjahr varchar,
  VID varchar, 
  primary key (SID),
  foreign key (VID) references Verein(VID)
);

drop table if exists Trainer;
create table Trainer (
  TID varchar NOT NULL UNIQUE, 
  Name varchar,
  Geburtsjahr varchar, 
  VID varchar, 
  primary key (TID),
  foreign key (VID) references Verein(VID)
);


  
  


INSERT INTO Verein values ('11','FC Energie Cottbus','1966','Cottbus','Stadion der Freundschaft','3');
INSERT INTO Verein values ('12','RB Leipzig','2009','Leipzig','Red Bull Arena','1');
INSERT INTO Verein values ('13','VfB Stuttgart','1893','Stuttgart','MHP Arena','1');
INSERT INTO Verein values ('14','Hannover 96','1896','Hannover','Heinz von Heiden Arena','2');
INSERT INTO Verein values ('15','Hertha BSC','1892','Berlin','Olympiastadion','2');
INSERT INTO Verein values ('16','SG Dynamo Dresden','1953','Dresden','Rudolf Harbig Stadion','2');
INSERT INTO Verein values ('17','FC Augsburg','1907','Augsburg','WWK Arena','1');
INSERT INTO Verein values ('18','SSV Jahn Regensburg','1907','Regensburg','Jahnstadion Regensburg','3');
INSERT INTO Verein values ('19','RW Essen','1907','Essen','Stadion Essen','3');
insert into Spieler values ('1', 'Lukas Michelbrink', 'MF', '2005','11');
insert into Spieler values ('2', 'Erik Engelhardt', 'FW', '1998', '11'); 
insert into Spieler values ('3', 'Marius Funk', 'GK', '1996', '11' );
insert into Spieler values ('4', 'Timo Werner', 'FW', '1996', '12');
insert into Spieler values ('5', 'Christoph Baumgartner', 'MF', '1999', '12');
insert into Spieler values ('6', 'Willi Orbán', 'DF', '1992', '12');
insert into Spieler values ('7', 'Deniz Undav', 'FW', '1996', '13');
insert into Spieler values ('8', 'Noah Darvich', 'MF', '2006', '13');
insert into Spieler values ('9', 'Ramon Hendriks', 'DF', '2001', '13');
insert into Spieler values ('10', 'Rodrigo Ribeiro', 'FW', '2005', '17');
insert into Spieler values ('11', 'Noahkai Banks', 'DF', '2006', '17');
insert into Spieler values ('12', 'Finn Dahmen', 'GK', '1998', '17');
insert into Spieler values ('13', 'Hayate Matsuda', 'DF', '2003', '14');
insert into Spieler values ('14', 'Nahuel Noll', 'GK', '2003', '14');
insert into Spieler values ('15', 'Daisuke Yokota', 'FW', '2000', '14');
insert into Spieler values ('16', 'Dawid Kownacki', 'FW', '1997', '15');
insert into Spieler values ('17', 'Maurice Krattenmacher','FW','2005', '15');
insert into Spieler values ('18', 'Tjark Ernst', 'GK', '2003', '15'); 
insert into Spieler values ('19', 'Vincent Vermeij','FW','1994','16');
insert into Spieler values ('20', 'Claudio Kammerknecht', 'DF','1999','16');
insert into Spieler values ('21','Jonas Oehmichen','MF','2004','16');
insert into Spieler values ('22','Florian Dietz','FW','1998','18');
insert into Spieler values ('23','Dejan Galjen','FW','2002','18');
insert into Spieler values ('24','Leopold Wurm', 'DF','2006','18');
insert into Spieler values ('25','Marvin Obuz', 'MF', '2002', '19');
insert into Spieler values ('26','Ben Hüning','DF','2004','19');
insert into Spieler values ('27','Jakob Golz','GK','1998','19');
insert into Liga values ('1', 'Bundesliga');
insert into Liga values ('2', '2.Bundesliga');
insert into Liga values ('3', '3.Liga');
insert into Trainer values ('1','Claus-Dieter Wollitz','1965','11');
insert into Trainer values ('2','Ole Werner','1988','12');
insert into Trainer values ('3','Sebastian Hoeneß','1982','13');
insert into Trainer values ('4','Christian Titz','1971','14');
insert into Trainer values ('5','Stefan Leitl','1977','15');
insert into Trainer values ('6','Thomas Stamm','1983','16');
insert into Trainer values ('7','Manuel Baum','1979','17');
insert into Trainer values ('8','Michael Wimmer','1980','18');
insert into Trainer values ('9','Uwe Koschinat','1971','19');</code>
==verschiedene Abfragen==
===Spieler, die nach 2000 geboren wurden===
<run id="69839e526d741">select Name
from Spieler
where Geburtsjahr>2000
</run> 
===Jüngster/Jüngste Spieler pro Verein===
<run id="6983a3734e302">
select Name as Spielername, 
(select Name
from Verein
where VID = s.VID) as Vereinsname
from Spieler s
where CAST(Geburtsjahr as INT) = (
select MAX(CAST(Geburtsjahr as INT))
from Spieler
where VID = s.VID);</run>
===Vereine, wo der Trainer unter 45 Jahre alt ist===
<run id="69839e526d7c8">select Name 
from Verein 
where VID in (
 select VID
 from Trainer
 where (2026 - CAST(Geburtsjahr as INT)) < 45 );</run>
===Verein mit dem jüngsten Trainer===
<run id="6983a0623d326">select Name 
from Verein 
where VID in (
 select VID 
 from Trainer
 where CAST(Geburtsjahr as INT) = (
 select MAX(CAST(Geburtsjahr as INT))
 from Trainer));</run>
===Spieler, die älter als der Durchschnitt aller Spieler sind===
<run id="6983a3734e3bf">
select Name
from Spieler
where (2026 - CAST(Geburtsjahr as INT)) > (
 select AVG(2026 - CAST(Geburtsjahr as INT))
 from Spieler);</run>
=Kritische Reflexion zu Modellierung und Umsetzung=
Das Thema Fußball hat sich gut geeignet für eine Datenbank und wurde meiner Meinung nach auch gut umgesetzt. Natürlich könnte man die Datenbank noch beliebig erweitern, durch z.B. neue sinnvolle Entities, aber trotzdem kann man die Grundlagen einer Datenbank und ihre Funktionen erkennen. Ich habe die vier Entities (Verein, Spieler, Trainer, Liga), da es die relevantesten sind und diese gut auszubauen waren in der gegebenen Zeit. Die Entities haben ihre entsprechenden Attribute bekommen und ich habe sie durch die 1-n-Beziehung miteinander verbunden. Das Erstellen des ERM und RM habe ich mit Hilfe der ERDPlus Seite gemacht, die sehr gut dafür geeignet ist. Das Erstellen war also sehr einfach gestaltet und nun habe ich die Datenbank erstellt. Am Anfang musste man schauen worauf man achten muss, aber mit der Zeit lies sich alles schnell eingeben. Meine eingetragenen Datensätze entsprechen der Realität (Stand 02/2026), also alle Daten stimmen, und somit kann man tatsächliche, aktuelle Dinge abfragen. Deshalb finde ich, ist mir die Datenbank gut gelungen und man erhält reale, interessante Abfragen. Zum Schluss lässt sich sagen, dass mir das eigene Erstellen einer Datenbank, inklusive ERM und RM, neue Dinge beigebracht hat und ich nun mehr Ahnung habe von SQL. 
==verwendete Quellen==
ERDPlus : https://erdplus.com/trial <br>
SofaScore : https://www.sofascore.com/de/ (Fußball-Fakten)<br>