PMG2426 1/DB Beleg/Adrian

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SQL</language>
<font size=24 style="background-color:powderblue;">'''Datenbankprojekt Musikschule'''</font>
<br><br>
==Themenwahl Begründung==

Das folgende Datenbanksystem wurde gewählt, da die Modellierung einer Musikschuldatenbank eine realitätsnahe Anwendung bietet, die auch auf den Schulkontext einfach bezogen werden kann.<br>
Die Datenbank bietet Abwechslung, mit verschiedenen kardinalitäts Beziehungen und bietet die Möglichkeit komplexerere Abfragen zu erstellen.<br>
Aufgebaut sind die Tabellen in groben Strukturen, wie man sie vielleicht auch in einer Musikschule finden könnte, mit der Option diese kommunal zu organisieren, z.B. für jeden Landkreis ein Datenbanksystem, mit allen Lehrkräften <br> 
Außerdem habe ich bei der Themenwahl, auf der Suche nach einem passendem Thema, aus dem Fenster die Musikschule gesehn und dachte: "Ja, das passt".

==ERM Musikschule==
[[Bild:PMGAJ_Erdplus.png|1000px]]

==RM Musikschule==
[[Bild:PMGAJ_Erdplus_RM.png| 1000px]]

<br><br>

==SQL Tabellen==

<br>

===Erstellung der Tabellen===
<code id="696767806ab23">drop table if exists Musikschule;
create table Musikschule(
    name varchar ,
    Registernummer varchar not null unique,
    PLZ varchar,
    Straße varchar,
    Straßennummer varchar,
    primary key (Registernummer)
);

drop table if exists LehrerInnen;
create table LehrerInnen(
    LehrerInnen_ID varchar not null unique,
    Name varchar,
    Vorname varchar,
    Registernummer varchar not null, 
    primary key (LehrerInnen_ID),
    foreign key (Registernummer) references Musikschule(Registernummer)
);

drop table if exists SchülerInnen;
create table SchülerInnen(
    SchülerInnen_ID varchar not null unique,
    Nachname varchar,
    Vorname varchar,
    PLZ varchar,
    Registernummer varchar not null,
    primary key (SchülerInnen_ID),
    foreign key (Registernummer) references Musikschule(Registernummer)
);

drop table if exists Instrument;
create table Instrument(
    Instrumenten_ID varchar not null unique,
    Name varchar,
    primary key (Instrumenten_ID)
);

drop table if exists Lehren;
create table Lehren(
    LehrerInnen_ID varchar not null,
    Instrumenten_ID varchar not null,
    Lehr_Nr varchar not null unique,
    primary key (Lehr_Nr),
    foreign key (LehrerInnen_ID) references Lehrer(LehrerInnen_ID),
    foreign key (Instrumenten_ID) references Instrument(Instrumenten_ID)
);

drop table if exists Lernen;
create table Lernen (
    Instrumenten_ID varchar not null,
    SchülerInnen_ID varchar not null,
    Leih_Nr varchar not null unique,
    primary key (Leih_Nr),
    foreign key (Instrumenten_ID) references Instrument(Instrumenten_ID),
    foreign key (SchülerInnen_ID) references Schüler(SchülerInnen_ID)
);

drop table if exists Unterricht;
create table Unterricht(
    SchülerInnen_ID varchar not null,
    LehrerInnen_ID varchar not null,
    Vertrags_Nr varchar not null unique,
    Instrumenten_ID VARCHAR NOT NULL,
    primary key (Vertrags_Nr),
    foreign key (SchülerInnen_ID) references Schüler(SchülerInnen_ID),
    foreign key (LehrerInnen_ID) references Lehrer(LehrerInnen_ID),
    foreign key (Instrumenten_ID) REFERENCES Instrument(Instrumenten_ID)
);</code>
<br><br>
===Einfügen von Werten in Tabellen===
<code id="6979c8729a7cd">insert into Musikschule values('Kreismusikschule Bautzen','01102602','02625','Schilleranlagen','3');
insert into Musikschule values('Kreismusikschule Löbau','01102707','02725','Bernstraße','13');

insert into LehrerInnen values('015637','Wodnik','Pierre','01102602');
insert into LehrerInnen values('015642','Mähr','Wolfgang','01102602');
insert into LehrerInnen values('015603','Luttner','Beate','01102602');

insert into SchülerInnen values('0256231','Mose','Friedrich','02625','01102602');
insert into SchülerInnen values('0256173','Wiedel','Alexa','02625','01102602');
insert into SchülerInnen values('0256187','Wiedel','Annette','02625','01102602');
insert into SchülerInnen values('0256188','Wiedel','Arthur','02625','01102602');

insert into Instrument values('025','Trompete');
insert into Instrument values('022','Flöte');
insert into Instrument values('016','Flügelhorn');
insert into Instrument values('031','Klavier');
insert into Instrument values('008','sopran Saxofon');

insert into Lehren values('015637','025','01');
insert into Lehren values('015637','031','02');
insert into Lehren values('015637','016','03');
insert into Lehren values('015642','031','04');
insert into Lehren values('015642','008','05');
insert into Lehren values('015603','022','06');

insert into Lernen values('025','0256231','001');
insert into Lernen values('016','0256231','002');
insert into Lernen values('031','0256173','003');
insert into Lernen values('025','0256187','004');
insert into Lernen values('031','0256187','005');
insert into Lernen values('022','0256188','006');
insert into Lernen values('008','0256188','007');

insert into Unterricht values('0256231','015637','00562715','025');
insert into Unterricht values('0256231','015637','00562716','016');
insert into Unterricht values('0256173','015642','00562717','031');
insert into Unterricht values('0256187','015637','00562718','025');
insert into Unterricht values('0256187','015642','00562719','031');
insert into Unterricht values('0256188','015603','00562720','022');
insert into Unterricht values('0256188','015642','00562721','008');</code>

<br><br>

===Ausgeben aller Inhalte===

<run id="696767806ab8b">select * from Musikschule;
select * from LehrerInnen;
select * from SchülerInnen;
select * from Instrument;
select * from Lehren;
select * from Lernen;
select * from Unterricht;</run>

<br><br>

===Abfragenerstellung===
=====Alle Familienmitglieder der Familie Wiedel=====
<run id="6983bf52849c4">
select * from SchülerInnen Where Nachname='Wiedel';
</run>
<br>
===== Alle Schüler die Trompete spielen! =====
<run id="6979da9627ac7">SELECT distinct 
    s.Vorname,
    s.Nachname,
    s.SchülerInnen_ID
from SchülerInnen s
join Lernen l 
    ON s.SchülerInnen_ID = l.SchülerInnen_ID
join Instrument i 
    ON l.Instrumenten_ID = i.Instrumenten_ID
where i.Name = 'Trompete';</run>
<br>
===== Welche Lehrkraft unterrichtet wen, in welchem Instrument?=====
<run id="69836631011dd">select distinct 
   s.Vorname ||' '|| s.Nachname as SchülerIn,
   lk.Vorname ||' '|| lk.Name as Lehrkraft,
   i.Name as Instrument
from 
Unterricht u
join SchülerInnen s
   on u.SchülerInnen_ID = s.SchülerInnen_ID
join LehrerInnen lk
   on u.LehrerInnen_ID = lk.LehrerInnen_ID
join Instrument i
   on u.Instrumenten_ID = i.Instrumenten_ID;</run>
<br>
=====Alle SchülerInnen mit mehr als zwei Instrumenten=====
<run id="6983be490a353">select
   s.Vorname || ' ' || s.Nachname as SchülerIn,
   group_concat(i.Name, ', ') as Instrumente
from SchülerInnen s
join Lernen l
   on s.SchülerInnen_ID = l.SchülerInnen_ID
join Instrument i
   on l.Instrumenten_ID = i.Instrumenten_ID
group by s.SchülerInnen_ID, s.Vorname, s.Nachname
having count(distinct i.Instrumenten_ID) >= 2;</run>
<br><br>

==Kritische Reflexion==
Das Datenbanksystem war anspruchsvoll gedacht, was aber auch in mancherlei Hinsicht den Rahmen überschreitet. Um zum Beispiel noch spannendere Abfragen zu erstellen benötige es noch deutlich mehr Eingaben und durch einige n:m Kardinalitäten entstehen auch für zumindest ein Testprojekt schon recht viele Tabellen. Es ist dennoch so aufgebaut das man darauf später gut aufbauen könnte, allerdings wäre eine genauere Betrachtung der atribut Benennung hilfreich, für bessere Leserlichkeit und vereinfachtes Abfragen erstellen, dass kann natürlich durch Namensverkürzungen gelöst werden. Im großen und ganzen denke ich dennoch das das Datenbankprojekt sein Ziel als Test gut gedient hat und im Grundlegenden Ansatz nicht falsch gedacht war, auch wenn vielleicht an stellen etwas überambitioniert. Die Einarbeitung der komunalen Ebene wäre zum Beispiel nicht nötig gewesen und das Potenzial blieb auch in der Verwendung erstmal undbenutzt, da zu wenig Einträge enthalten sind diese wenigen Personen auf mehrere Musikschulen aufzuteilen. Unteranderem deswegen und der Verwendung vieler IDs ist die Datenbank aktuell nicht die effizienteste. Dazu gehört aber auch die Normalisierung, die in dieser Datenbank ausbaubar ist, die ersten zwei normalisierungs Regeln sind zwar eingehalten, allerdings sind die Tabellen, die durch die Kardinalitäten entstehen, nicht ideal und könnten zusammengefasst werden.

<br><br>
==''Quellen''==
ERDplus [https://erdplus.com] zur Erzeugung von ERM und RM