PMG2426 4/DB Beleg/Greta

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

'''Datenbank-Projekt:'''

== Grundlagen der Datenbank == 

===[[Themenbegründung]]===
 Die Datenbank soll die Verwaltung von Schülern, Lehrern und Kursen in der gymnasialen Oberstufe einer Schule unterstützen.​
 Sie speichert, welche Schüler welche Kurse belegen, welche Lehrkraft einen Kurs unterrichtet und welche Note ein Schüler in einem Kurs erhält.
 Dadurch können typische Auswertungen durchgeführt werden, zum Beispiel: alle Kurse eines Schülers, alle Schüler eines Kurses oder die Notenübersicht für eine Lehrkraft.


===[[Grundlagen]]===
[[Datenbasis:]] Datenmaterial, strukturierte Daten

[[Datenbankmanagementsystem (DBMS):]] dient der Sortierung und Verwaltung von Daten

[[Datenbank:]] Datenbasis und Datenbankmanagementsystem (DBMS) in Verbindung


===[[Kardinalitäten]]===
1:1-Beziehung: Jeder Entität der Entitymenge A wird genau eine Entität der Entitymenge B zugeordnet und umgekehrt.

1:n-Beziehung: Jeder Entität der Entitymenge A können mehrere Entitäten der Entitymenge B zugeordnet werden, umgekehrt kann jedoch jeder Entität der Menge B nur genau eine Entität der Menge A zugeordnet werden.

m:n-Beziehung: Jeder Entität der Entitymenge A können mehrere Entitäten der Entitymenge B zugeordnet werden und umgekehrt.


===[[Normalformen]]===
ENF/1NF - Erste Normalform: jeder Spalte wird nur eine Information zugeordnet. Dadurch werden erst Abfragen ermöglicht, da es keine Komplikationen bei der Suche gibt.

ZNF/2NF - Zweite Normalform: simultane Aufteilung der Entitäten und Entitymengen in Tabellen. Jede Relation modelliert nur einen Sachverhalt. Das Verständnis der Datenbank Strukturen wird so erleichtert. Außerdem wird Redundanz (Dopplungen) vermieden.


===[[Entity Relationship Modell]]===
[[Bild:Aterg_RM.jpg]]

===[[Transformation in das Relationenmodell ]]===
Aus dem ERM ergeben sich folgende Relationen (Tabellen):
-> Primärschlüssel unterstrichen

* SCHUELER (schueler_id, vorname, nachname, stufe)

* LEHRER(lehrer_id, vorname, nachname, kuerzel)

* KURS(kurs_id, fach, art, bezeichnung, lehrer_id)


== Datenbank == 
===[[Tabellenerstellung und Füllung]]===
<code id="52dcdf16795a2">
DROP TABLE IF EXISTS SCHUELER;
DROP TABLE IF EXISTS LEHRER;
DROP TABLE IF EXISTS KURS;

CREATE TABLE SCHUELER (
  schueler_id  VARCHAR(255),
  vorname      VARCHAR(255),
  nachname     VARCHAR(255),
  stufe        INTEGER,
  PRIMARY KEY (schueler_id)
);

CREATE TABLE LEHRER (
  lehrer_id  VARCHAR(255),
  vorname    VARCHAR(255),
  nachname   VARCHAR(255),
  kuerzel    VARCHAR(255),
  PRIMARY KEY (lehrer_id)
);

CREATE TABLE KURS (
  kurs_id     VARCHAR(255),
  fach        VARCHAR(255),
  art         VARCHAR(255),
  bezeichnung VARCHAR(255),
  PRIMARY KEY (kurs_id)
);

INSERT INTO SCHUELER VALUES ('S001', 'Anna',   'Becker',   11);
INSERT INTO SCHUELER VALUES ('S002', 'Lukas',  'Fischer',  11);
INSERT INTO SCHUELER VALUES ('S003', 'Mira',   'Klein',    12);
INSERT INTO SCHUELER VALUES ('S004', 'Jonas',  'Hoffmann', 12);
INSERT INTO SCHUELER VALUES ('S005', 'Sara',   'Wagner',   13);

INSERT INTO LEHRER VALUES ('L001', 'Maria',  'Meyer',   'MM');
INSERT INTO LEHRER VALUES ('L002', 'Thomas', 'Schulz',  'TS');
INSERT INTO LEHRER VALUES ('L003', 'Julia',  'Hartmann','JH');

INSERT INTO KURS VALUES ('K001', 'Mathematik', 'LK', 'M-LK11-1');
INSERT INTO KURS VALUES ('K002', 'Deutsch',    'GK', 'D-GK11-1');
INSERT INTO KURS VALUES ('K003', 'Biologie',   'GK', 'B-GK12-1');
INSERT INTO KURS VALUES ('K004', 'Geschichte', 'GK', 'G-GK12-1');

</code>

===[[Abfragen]]===
<u>Ausgabe aller Schüler mit Vorname und Nachname</u>
<run id="52f89f4ff177a">
SELECT vorname, nachname
FROM SCHUELER;
</run>

<u>Ausgabe aller Kurse mit Fach und Kursbezeichnung</u>
<run id="52f89f4ff1818">
SELECT fach, bezeichnung
FROM KURS;
</run>

<u>Ausgabe aller Lehrer mit Kürzel</u>
<run id="52f89f4ff1818">
SELECT vorname, nachname, kuerzel
FROM LEHRER;
</run>

<u>Ausgabe aller Schüler einer bestimmten Stufe (z.B. Jahrgang 12)</u>
<run id="52f89f4ff1818">
SELECT vorname, nachname, stufe
FROM SCHUELER
WHERE stufe = 12;
</run>

<u>Ausgabe aller Leistungskurse (art = 'LK') mit Fach und Bezeichnung</u>
<run id="52f89f4ff1818">
SELECT fach, bezeichnung
FROM KURS
WHERE art = 'LK';
</run>

<u>Ausgabe aller Lehrer, deren Nachname mit „M“ beginnt</u>
<run id="52f89f4ff1818">
SELECT vorname, nachname, kuerzel
FROM LEHRER
WHERE nachname LIKE 'M%';
</run>

<u>Ausgabe der Anzahl der Schüler pro Stufe</u>
<run id="52f89f4ff1818">
SELECT stufe,
COUNT(*) AS anzahl_schueler
FROM SCHUELER
GROUP BY stufe;
</run>

<u>Ausgabe der verschiedenen Kursarten (ohne Wiederholung)</u>
<run id="52f89f4ff1818">
SELECT DISTINCT art
FROM KURS;
</run>

= kritische Reflexion zur Modellierung und Umsetzung =

 Die Modellierung mit SCHUELER, LEHRER und KURS ist bewusst einfach gehalten und gut überschaubar. 
 Sie vermeidet Redundanzen, zeigt die Arbeit mit  Primärschlüsseln und ermöglicht grundlegende SQL‑Abfragen wie Listen und Filter.

 Kritisch ist, dass wichtige Beziehungen der Realität fehlen, zum Beispiel:
 Welcher Schüler besucht welchen Kurs bei welchem Lehrer. Dadurch sind  keine JOIN‑Abfragen über mehrere Tabellen möglich.
 Für eine realistische Schulverwaltung müsste das Modell um eine Beziehung zwischen SCHUELER und  KURS erweitert werden.