PMG2426 1/DB Beleg/Alexandra

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>SQL</language>
== Das ERM ==

[[Bild:A Sonnenblumenkern_Screenshot_20260306_173749_Samsung_Notes.jpg|800px|]]


== Kardinalitäten erläutern ==

'''Klasse – Unterrichtseinheit (1:n)'''

Eine Klasse kann viele Unterrichtseinheiten haben, da sie im Laufe einer Woche mehrere 

Unterrichtsstunden besitzt.

Eine Unterrichtseinheit gehört jedoch immer genau zu einer Klasse.

Beispiel:
Die Klasse 7a hat mehrere Unterrichtsstunden in verschiedenen Fächern.


'''Lehrer – Unterrichtseinheit (1:n)'''

Ein Lehrer kann viele Unterrichtseinheiten unterrichten.

Eine Unterrichtseinheit wird jedoch immer von genau einem Lehrer gehalten.

Beispiel:
Ein Lehrer kann mehrere Stunden Mathematik oder andere Fächer in 

verschiedenen Klassen unterrichten.


'''Fach – Unterrichtseinheit (1:n)'''

Ein Fach kann in vielen Unterrichtseinheiten vorkommen.

Eine Unterrichtseinheit behandelt jedoch immer genau ein Fach.

Beispiel:
Das Fach Mathematik kann mehrmals pro Woche im Stundenplan vorkommen.


'''Raum – Unterrichtseinheit (1:n)'''

Ein Raum kann für viele Unterrichtseinheiten genutzt werden.

Eine Unterrichtseinheit findet jedoch immer in genau einem Raum statt.

Beispiel:
Ein Computerraum kann für mehrere Informatikstunden verwendet werden.


== Datenbank ==

<code id="6979d04b8419e">
DROP TABLE IF EXISTS Lehrer;
CREATE TABLE Lehrer(
 Lehrer_ID varchar(10),
 Vorname varchar(50),
 Nachname varchar(50),
 Kürzel varchar(10),
 PRIMARY KEY (Lehrer_ID)
);

DROP TABLE IF EXISTS Fach;
CREATE TABLE Fach(
 Fach_ID varchar(10),
 Fachname varchar(50),
 PRIMARY KEY (Fach_ID)
);

DROP TABLE IF EXISTS Raum;
CREATE TABLE Raum(
 Raum_ID varchar(10),
 RaumNR varchar(10),
 PRIMARY KEY (Raum_ID)
);

DROP TABLE IF EXISTS Klasse;
CREATE TABLE Klasse(
 Klassen_ID varchar(10),
 Bezeichnung varchar(10),
 PRIMARY KEY (Klassen_ID)
);

DROP TABLE IF EXISTS Unterrichtseinheiten;
CREATE TABLE Unterrichtseinheiten(
 UE_ID varchar(10),
 Wochentag varchar(15),
 Stunde varchar(10),
 Raum_ID varchar(10),
 Klassen_ID varchar(10),
 Fach_ID varchar(10),
 Lehrer_ID varchar(10),
 PRIMARY KEY (UE_ID),
 FOREIGN KEY (Raum_ID) REFERENCES Raum(Raum_ID),
 FOREIGN KEY (Klassen_ID) REFERENCES Klasse(Klassen_ID),
 FOREIGN KEY (Fach_ID) REFERENCES Fach(Fach_ID),
 FOREIGN KEY (Lehrer_ID) REFERENCES Lehrer(Lehrer_ID)
);

INSERT INTO Lehrer VALUES ('001','Laura','Müller','mul');
INSERT INTO Lehrer VALUES ('002','Thomas','Schneider','sch');
INSERT INTO Lehrer VALUES ('003','Lisa','Weber','wel');
INSERT INTO Lehrer VALUES ('004','Mark','Braun','brm');

INSERT INTO Fach VALUES ('001','Deutsch');
INSERT INTO Fach VALUES ('002','Mathematik');
INSERT INTO Fach VALUES ('003','Englisch');
INSERT INTO Fach VALUES ('004','Informatik');

INSERT INTO Raum VALUES ('001','M101');
INSERT INTO Raum VALUES ('002','M102');
INSERT INTO Raum VALUES ('003','S204');
INSERT INTO Raum VALUES ('004','S205');

INSERT INTO Klasse VALUES ('001','7a');
INSERT INTO Klasse VALUES ('002','7b');
INSERT INTO Klasse VALUES ('003','8a');
INSERT INTO Klasse VALUES ('004','8b');

INSERT INTO Unterrichtseinheiten VALUES ('001','Montag','1','001','001','002','002');
INSERT INTO Unterrichtseinheiten VALUES ('002','Montag','2','001','001','001','001');
INSERT INTO Unterrichtseinheiten VALUES ('003','Montag','3','002','002','003','003');
INSERT INTO Unterrichtseinheiten VALUES ('004','Dienstag','1','003','003','004','004');
INSERT INTO Unterrichtseinheiten VALUES ('005','Dienstag','2','001','004','002','002');
INSERT INTO Unterrichtseinheiten VALUES ('006','Mittwoch','1','002','001','003','003');
INSERT INTO Unterrichtseinheiten VALUES ('007','Mittwoch','2','004','002','001','001');
INSERT INTO Unterrichtseinheiten VALUES ('008','Donnerstag','3','003','003','002','002');
INSERT INTO Unterrichtseinheiten VALUES ('009','Freitag','1','002','004','003','003');
INSERT INTO Unterrichtseinheiten VALUES ('010','Freitag','2','001','001','004','004');
</code>


== Aufgaben zur Abfrage ==

 Gib die Lehrertabelle aus

<run id="6979d4345f0b8">
</run>

 Welche Fächer werden unterrichtet?
<run id="69ab21b34cf2b">
</run>

 Wie viele Unterrichtseinheiten hat jeder Lehrer?
<run id="69ab21b34cf9d">
</run>

 Gib die Raumbelegung aus
<run id="69ab21b34d00d">
</run>

 Gib den Stundenplan der Klasse 7a aus

<run id="69aafc18d46a1">
</run>

 Gib den Stundenplan von Laura Müller aus

<run id="69aafdfe48c24">
</run>

 Gib den Stundenplan für Montag aus
<run id="69ab21b34d080">
</run>

== Ziel der Datenbank & Begründung ==
Die Datenbank dient zur Verwaltung eines Stundenplans. Ziel ist es, Informationen über Klassen, Lehrer, Fächer, Räume 

und Unterrichtseinheiten strukturiert zu speichern und miteinander zu verknüpfen.


Durch die Datenbank soll es möglich sein, verschiedene Informationen über den Stundenplan einfach abzurufen. 

Zum Beispiel kann ermittelt werden, welcher Lehrer zu einer bestimmten Zeit unterrichtet, welcher Raum belegt ist oder

welchen Unterricht eine Klasse an einem bestimmten Tag hat.


Ich habe das Thema gewählt, da ein Stundenplan ein typisches Beispiel für ein System mit vielen miteinander verbundenen

Daten darstellt und ich fast täglich solch eine Datenbank abfrage.



== Relationenmodell ==
'''Lehrer'''

Lehrer(Lehrer_ID, Vorname, Nachname, Kürzel)

PK: Lehrer_ID


'''Fach'''

Fach(Fach_ID, Fachname)

PK: Fach_ID


'''Raum'''

Raum(Raum_ID, RaumNR)

PK: Raum_ID


'''Klasse'''

Klasse(Klassen_ID, Bezeichnung)

PK: Klassen_ID


'''Unterrichtseinheiten'''

Unterrichtseinheiten(UE_ID, Wochentag, Stunde, Raum_ID, Klassen_ID, Fach_ID, Lehrer_ID)

PK: UE_ID

FK: Raum_ID → Raum(Raum_ID)

FK: Klassen_ID → Klasse(Klassen_ID)

FK: Fach_ID → Fach(Fach_ID)

FK: Lehrer_ID → Lehrer(Lehrer_ID)



== Erläuterung der Normalform ==

'''Erste Normalform'''

Die erste Normalform besagt, dass:

- jedes Attribut atomar sein muss (also nicht weiter zerlegbar)

- keine Mehrfachwerte in einer Spalte vorkommen dürfen

In meiner Datenbank ist diese Bedingung erfüllt, da jedes Feld nur einen einzelnen Wert
enthält.

Beispielsweise steht in der Spalte Vorname immer nur ein Vorname und nicht mehrere Namen.


'''Zweite Normalform'''

Die zweite Normalform besagt, dass:

- jedes Nicht-Schlüsselattribut vollständig vom Primärschlüssel abhängig ist.

Da in allen Tabellen ein eindeutiger Primärschlüssel existiert (z. B. Lehrer_ID oder 

Fach_ID), hängen alle anderen Attribute vollständig von diesem Schlüssel ab.

Beispiel:
Der Vorname und Nachname eines Lehrers hängen eindeutig von der Lehrer_ID ab.


'''Dritte Normalform'''

Die dritte Normalform fordert, dass:

- keine transitiven Abhängigkeiten zwischen Nicht-Schlüsselattributen bestehen.

Das bedeutet, dass Attribute nicht voneinander abhängig sein dürfen, sondern nur vom Primärschlüssel.

Beispiel:
Informationen über Lehrer werden ausschließlich in der Tabelle Lehrer gespeichert 

und nicht zusätzlich in der Tabelle Unterrichtseinheiten.

Dadurch werden doppelte Daten vermieden.


== Reflexion ==

Bei der Modellierung der Datenbank habe ich darauf geachtet, dass Daten möglichst 

strukturiert und ohne Redundanzen gespeichert werden. Daher habe ich mehrere Tabellen 

verwendet, die über Fremdschlüssel miteinander verbunden sind.


Ein Vorteil dieses Modells ist, dass Informationen nur einmal gespeichert werden müssen.

Beispielsweise werden Lehrerinformationen nur in der Tabelle „Lehrer“ gespeichert und nicht

in jeder Unterrichtseinheit erneut eingetragen.


Ein möglicher Nachteil des Modells ist, dass für viele Abfragen mehrere Tabellen miteinander 

verbunden werden müssen. Dadurch können SQL-Abfragen komplexer werden.


Eine mögliche Erweiterung der Datenbank wäre beispielsweise die Verwaltung von 

Vertretungsstunden, Unterrichtsgruppen oder zusätzlichen Raumtypen.


== Quellen und Tools ==
- Programming Wiki SQL Editor

- Datenbank-Skripte und Beispiele, sowie Wissen aus dem Informatikunterricht