Beispiele / Schulverwaltung
Schulverwaltung
Die Datenbank einer Schule verbindet Schüler und Fächer über Belegungen. Das ist eine Zwischentabelle, die auch die Note speichert. Lehrkräfte unterrichten Kurse eines Fachs in einem bestimmten Halbjahr. Die Anwesenheit hängt an der Belegung, mit einer Zeile je Schüler und Unterrichtstag.
Unten zeichnet ErdDocs dieses Schema aus seinem SQL, mit allen Tabellen und Beziehungen. Im Reiter „Data Dictionary“ finden Sie das druckbare Nachschlagewerk, vollständig und kostenlos auf dieser Seite. Das SQL steht weiter unten.
Fahren Sie über eine Tabelle, um ihre Beziehungen hervorzuheben. Ein Klick hält sie fest.
Wozu jede Tabelle dient
- students / teachersGetrennte Tabellen. Schüler und Lehrkräfte haben nur den Namen gemeinsam, Lebenszyklus und Daten sind verschieden.
- coursesDer Eintrag im Lehrplan. CS-101 gibt es nur einmal, egal wie oft das Fach angeboten wird.
- sectionsDer Kurs: ein Fach in einem Halbjahr bei einer Lehrkraft. Daran nehmen Schüler tatsächlich teil.
- enrollmentsZwischentabelle zwischen Schüler und Kurs. Außer den Verweisen speichert sie die Note.
- attendanceHängt über einen zusammengesetzten Fremdschlüssel an der Belegung. Niemand kann in einem Kurs anwesend sein, den er nicht belegt hat.
Entwurfsentscheidungen zum Übernehmen
- Die Trennung von Fach und Kurs ist die Grundlage des Schemas. Schreibt man Schüler direkt in „Fächer“ ein, bricht alles zusammen, sobald ein Fach zweimal läuft. Dann gibt es zwei Halbjahre und zwei Lehrkräfte, aber nur eine Notenspalte. Niemand weiß mehr, worauf sich die Note bezieht.
- Die Anwesenheit verweist über einen zusammengesetzten Fremdschlüssel (student_id, section_id) auf die Belegung. Deshalb lehnt die Datenbank selbst eine Anwesenheit ab, wenn der Schüler nicht eingeschrieben ist.
- Die Note darf NULL sein und hat keinen Standardwert. Eine fehlende Note heißt, dass das Halbjahr noch läuft, und nicht, dass jemand eine Sechs bekommen hat.
Das SQL
PostgreSQL-Dialekt. Im Tool oben steht dieses SQL schon. Sie dürfen es frei kopieren und in die eigene Datenbank oder eine Migration übernehmen.
CREATE TABLE students (
id bigserial PRIMARY KEY,
student_no varchar(20) NOT NULL UNIQUE,
full_name varchar(120) NOT NULL,
enrolled_on date NOT NULL
);
CREATE TABLE teachers (
id bigserial PRIMARY KEY,
full_name varchar(120) NOT NULL,
department varchar(80) NOT NULL
);
CREATE TABLE courses (
id bigserial PRIMARY KEY,
code varchar(12) NOT NULL UNIQUE,
title varchar(160) NOT NULL,
credits int NOT NULL
);
COMMENT ON COLUMN courses.code IS 'Fachkürzel, z. B. CS-101';
CREATE TABLE sections (
id bigserial PRIMARY KEY,
course_id bigint NOT NULL REFERENCES courses(id),
teacher_id bigint NOT NULL REFERENCES teachers(id),
term varchar(20) NOT NULL,
room varchar(20)
);
COMMENT ON TABLE sections IS 'Ein Fach, das eine Lehrkraft in einem Halbjahr anbietet; Schüler belegen Kurse, nicht Fächer';
CREATE TABLE enrollments (
student_id bigint NOT NULL REFERENCES students(id),
section_id bigint NOT NULL REFERENCES sections(id),
grade varchar(2),
PRIMARY KEY (student_id, section_id)
);
COMMENT ON COLUMN enrollments.grade IS 'NULL bis zum Ende des Halbjahres';
CREATE TABLE attendance (
student_id bigint NOT NULL,
section_id bigint NOT NULL,
class_date date NOT NULL,
present boolean NOT NULL,
PRIMARY KEY (student_id, section_id, class_date),
FOREIGN KEY (student_id, section_id) REFERENCES enrollments(student_id, section_id)
);Häufige Fragen
Wohin gehören Eltern oder Erziehungsberechtigte?
In eine Tabelle guardians und eine Zwischentabelle student_guardians. Das ist eine n:m-Beziehung, denn Geschwister teilen sich Erziehungsberechtigte, und ein Schüler kann mehrere haben.
Warum steht teacher_id nicht in courses?
Weil dasselbe Fach in verschiedenen Halbjahren von verschiedenen Lehrkräften unterrichtet wird. Die Lehrkraft gehört zum Kurs, nicht zum Eintrag im Lehrplan.