aufräumen

This commit is contained in:
2026-08-12 17:45:02 +02:00
parent 0823a023c9
commit a1e722ace1
27 changed files with 542 additions and 197 deletions
+73
View File
@@ -0,0 +1,73 @@
# Datenmodell und Begriffe
Dieses Dokument beschreibt die fachliche Bedeutung der zentralen Datensätze.
Es soll verhindern, dass technisch ähnliche Felder als unterschiedliche
Sachverhalte interpretiert oder dieselben Informationen mehrfach gespeichert
werden.
## Lerngruppe (`LearningGroup`)
Eine Lerngruppe ist die konkrete Unterrichtsgruppe eines Fachs in genau einem
Schuljahr. Sie kann als Klasse oder Kurs organisiert sein.
- `Name`: frei gewählte Bezeichnung, zum Beispiel `5b NAT (BEN)` oder `Mathe G`
- `SubjectId`: Verweis auf das unterrichtete Fach
- `SchoolYear`: Schuljahr dieser konkreten Lerngruppe
- `GradeLevel`: Klassen- beziehungsweise Jahrgangsstufe
Der Fachname wird ausschließlich im `Subject`-Stammdatensatz gepflegt. Die
Lerngruppe speichert keine zweite Kopie des Fachnamens.
## Gruppenzuordnung (`GroupMembership`)
Eine Gruppenzuordnung verbindet einen Schüler mit einer Lerngruppe. Sie ist
keine Aufnahme oder Einschreibung an der Schule.
- `StudentId`: Schüler
- `GroupId`: Lerngruppe
- `AddedOn`: Tag, an dem die Zuordnung in der App angelegt wurde
- `Period`: ganzes Schuljahr, erstes Halbjahr, zweites Halbjahr oder eigener Zeitraum
- `JoinedAt` / `LeftAt`: Grenzen eines eigenen Teilnahmezeitraums
- `Niveau`: optionale Niveaudifferenzierung
Das Schuljahr wird über die Lerngruppe ermittelt und deshalb nicht zusätzlich
in der Gruppenzuordnung gespeichert. Für eine spätere echte Schulaufnahme wäre
ein eigenes Feld wie `Student.SchoolEntryDate` zu verwenden.
Pro Kombination aus Schüler und Lerngruppe darf es höchstens eine Zuordnung
geben.
## Bewusst gespeicherte Momentaufnahmen
Einige berechnete Werte bleiben absichtlich gespeichert:
- `ExamResult.TotalPoints` und `ExamResult.Grade` halten das zuletzt berechnete
Klausurergebnis fest.
- `Exam.GradingKey` hält den für die konkrete Klausur verwendeten Notenschlüssel
fest und ist unabhängig von später geänderten Vorlagen.
- `Exam.Tasks` hält die Aufgabenstruktur der konkreten Klausur fest.
Änderungen an Aufgaben oder Notenschlüssel müssen die betroffenen Ergebnisse
kontrolliert neu berechnen. Diese Werte sind daher fachliche Momentaufnahmen und
nicht bloß unkontrollierte Kopien.
## Bewusste Denormalisierung
`Lesson.GroupId` bleibt zusätzlich zu `Lesson.UnitId` gespeichert. Dadurch kann
der häufige Kalenderzugriff auf alle Stunden einer Lerngruppe direkt indiziert
werden. Beim späteren Ausbau der Unterrichtsplanung muss sichergestellt werden,
dass `Lesson.GroupId` mit der Lerngruppe der zugehörigen Einheit übereinstimmt.
## Eindeutige Schlüssel
Die Datenbank schützt folgende Kombinationen mit eindeutigen Indizes:
- Gruppenzuordnung: `StudentId + GroupId`
- Klausurergebnis: `ExamId + StudentId`
- Mitarbeitseintrag: `SessionId + StudentId`
- Fach: normalisierter Fachname
Altdaten werden beim Öffnen der Datenbank automatisch migriert. Die Migration
verknüpft bisherige Fachtexte mit den Fachstammdaten, benennt die bisherige
`enrollments`-Collection in `group_memberships` um und entfernt daraus das
doppelt gespeicherte Schuljahr.