# Datenbankschema für Versionierung der Tabellen



## icrystaltm (28. Apr 2022)

Hallo zusammen,

Ich versuche eine Anwendung zu entwickeln, mit denen Schüler sich für verschiedene Kurse in der Schule für das Abitur registrieren können. Aktuell hänge ich an der Datenbankmodellierung.

Viele Schulen bieten verschiedene Kurse an, aber die Schulen haben wiederum, wieder viele gleiche Kurse. Ein Beispiel wäre hierfür die Fächer: Mathematik, Englisch, Geografie. Diese Fächer werden an allen Schulen angeboten, in Form von Leistungskurs und Grundkurs, aber einige Schulen wiederum bieten unter anderem einzelne Fächer, wie "Studium und Beruf" oder etwas anderes, die nicht an allen Schulen angeboten werden.

Mein Lösungsansatz war, dass ich eine allgemeine Tabelle: "course" modelliere, in der gleichbleibende Daten enthalten sind, mit den folgenden Spalten:
- ID (Primärschlüssel)
- Fachname
- Kurstyp (Advanced course / basic course)

und anschließend eine versionierte Tabelle: "course_version", in der dann folgende Spalten auftauchen:
- ID (Primärschlüssel)
- kurs_id (Fremdschlüssel)
- schul_id (Fremdschlüssel)
- Beschreibung
- Semester

Was haltet ihr von diesem Ansatz? Habt ihr eventuell einen besseren Lösungsvorschlag?


----------



## mihe7 (29. Apr 2022)

Du willst eine n:m-Beziehung zwischen Schule und Kurs. Diese Beziehung wird mit einer Tabelle beschrieben, die bei Dir course_version heißt. Alles gut. 

Die ID in course_version ist nicht notwendig, da kurs_id und schul_id einen Satz bereits eindeutig identifizieren (zusammengesetzter Primärschlüssel). Je nach der Bedeutung von "Beschreibung" und "Semester" könnte eine Tabelle hierfür sinnvoll sein aber das wirst Du schon bedacht haben.

Alternativ kann man beispielsweise auch eine 1:n-Beziehung zwischen Schule und Kurs modellieren und einen zentralen Kurskatalog verwalten, aus dem die Kursdaten kopiert werden.


----------



## icrystaltm (29. Apr 2022)

Vielen Dank, für deine Antwort.

Wie stellst du dir das mit einem zentralen Kurskatalog ungefähr vor?

Außerdem ist bei mir die Spalte: "Semester: eine Tabelle: "semester_tbl" mit den folgenden Spalten:

- ID (Primärschlüssel)
- Semester,

wobei dann die Spalte ID als Fremdschlüssel in course_version auftaucht.

Mein Problem hierbei ist, dass die Spalte: "Beschreibung" lediglich ein LOB ist, in der dann beschrieben wird, was in dem Kurs unternommen wird , welche abhängig vom Semester ist. In jedem Semester werden unterschiedliche Themen behandelt.

Mein Ziel ist es, keine redundante Daten zu speichern, denn wie gesagt das Fach: "Mathematik" taucht zum Beispiel in allen Schulen auf mit den selben Themen, die in jedem Semester an allen Schulen gleich behandelt werden. Ich hätte dann zum Beispiel so etwas in die Richtung:

Schule:
ID: 1 | Name: Musterfrau Schule
ID: 2 | Name: Mustermann Schule
ID: 3 | Name: Musterkind Schule

Semester:
ID: 1 | Semester: 2021/22
ID: 2 | Semester: 2022
ID: 3 | Semester: 2022/23

Allgemeine Kursdaten (kurs):
ID: 1 | Name: Mathematik | Typ: Leistungskurs | ...
ID: 2 | Name: Mathematik | Typ: Grundkurs | ...

Spezifischer Kurs (kurs_version):
kurs_id: 1 (FK) | school_id: 1 (FK) | *semester_id: 1 (FK)* | *Beschreibung: Ableitungen von Funktionen...*
kurs_id: 1 (FK)| school_id: 1 (FK)    | semester_id: 2 (FK) | Beschreibung: Integralrechnung...
kurs_id: 1 (FK) | school_id: 1 (FK) | semester_id: 3 (FK) | Beschreibung: Stochastik
kurs_id: 1 (FK) | school_id: 2 (FK) | * semester_id: 1 (FK)* | *Beschreibung: Ableitungen von Funktionen...*
kurs_id: 2 (FK) | school_id: 3 (FK) |  *semester_id: 1 (FK)* |* Beschreibung: Ableitungen von Funktionen... *

Wie man hier sehen kann, ist die 1. Zeile und die letzten beiden Zeilen redundant, es werden nämlich unabhängig vom Kurstyp gleiche Themen behandelt nur, dass im Leistungskurs eben der Schwierigkeitsgrad höher ist.

Ich könnte die Spalte, Beschreibung eventuell auch in die Tabelle "Allgemeine Kursdaten (kurs)" aufnehmen, jedoch kommt dann die Problematik, die ich zuvor erwähnt habe, dass z.B. das Fach "Studium und Beruf" an verschiedenen Schulen zwar auftauchen kann (kein Muss) und diese Schulen, aber dann wiederum unterschiedliche Themen behandeln, dann kann ich die Spalte: Beschreibung nicht mehr als zentrale Daten verwenden.

Könnte man mir bei dieser Problemstellung einen Denkansatz geben?


----------



## yfons123 (29. Apr 2022)

mihe7 hat gesagt.:


> kurs_id und schul_id


man kann doch auch einfach eine ID mitlaufen lassen so als zusatz , oder nicht?

laravel tut das per default setting, ob das jetz gut ist oder nicht weis ich nicht deswegen frag ich auch


----------



## yfons123 (29. Apr 2022)

also ich würde zuerst mal die eifnachen tabellen machen ( ich kann die basics von tabellen aufbau also geht 100% besser )



```
KURSTYP:
    ID     TYP
    1     Leistungskurs
    2    Leistungsnachweis
    3     Wahlfach
    
KURSARTEN
    ID    ART
    1    Mathe
    2    Englisch
    3    Java
```
einfach um die möglcihkeiten mal festzulegen was denn geht als kursus wahl


```
ANGEBOTSPAKET:
    SCHULE    KURS_TYP KURS_ART
    Bob        1         2
    Bob        2         3
    
SCHULE:
    NAME(PK)     ORT(PK)
    Bob            Javahausen
    
    
STUDENT:
    STUDENTENNUMMER(PK)    NAME     SCHULE_NAME    SCHULE_ORT    AUSWAHLPAKET
    123456789            Lobster    Bob            Javahausen    1      Bob                      Javahausen
    
AUSWAHLPAKET:
    ID         PAKETNUMMER    KURS_TYP    KURS_ART
    1        1            2            1
    2        1            1            3
```
somit hätte der Lobster an der Hochscshule bob in javahausen die fächer 2 und 1 mit den jewiligen typen

so als flotter gedanke... wenns scheiße ist bitte melden


----------



## icrystaltm (29. Apr 2022)

Hey, ebenfalls danke für deine Antwort.

So in die Richtung hatte ich, das auch überlegt, aber bei mir ist der Use Case so geregelt, dass der Student sich für ein Kurs 2 oder 4 Semester registrieren muss. Mein Ansatz wäre ungefähr so:

```
SCHULE
ID    NAME
1    Musterfrau Schule
2    Mustermann Schule

SEMESTER
BEZEICHNUNG (PK)
2022
2022/23
2023
2023/24

KURSART
NAME (PK)
Leistungskurs
Grundkurs
Sport

KURS
ID    NAME        KURSART (FK)
1    Mathematik    Leistungskurs
2    Mathematik    Grundkurs
3    Deutsch          Leistungskurs
4    Deutsch          Grundkurs
5    Englisch          Leistungskurs
6    Englisch          Grundkurs

KURS_VERSION
ID    KURS_ID (FK)        SCHUL_ID (FK)  SEMESTER (FK)        BESCHREIBUNG
1    1                            1            2022         Ableitung von Funktionen...
2    1                            1            2022/23       Integralrechnung
3    1                            1            2023           Stochastik
4    1                             1          2023/24      Geometrie
5    2                              1            2022        Ableitung von Funktionen...
6    2                              1            2022/23     Integralrechnung
7    2                               1            2023       Stochastik
8    2                             1            2023/24       Geometrie
9    1                            2            2022              Ableitung von Funktionen...
10  1                            2            2022/23       Integralrechnung
11  1                            2            2023             Stochastik
12  1                          2            2023/24            Geometrie
13  3                        1            2022                 Gedichtsanalyse
14  4                      1            2022/23            Erörterung lernen

STUDENT
ID    SCHUL_ID VORNAME        NACHNAME
1    1            Max            Mustermann

KURS_REGISTRIERUNG
ID    KURS_VERSION_ID        STUDENT_ID
1    1                    1
2    2                    1
3    3                    1
4    4                    1
5    13                  1
6    14                  1
```


----------



## Robert Zenz (29. Apr 2022)

icrystaltm hat gesagt.:


> und anschließend eine versionierte Tabelle: "course_version", in der dann folgende Spalten auftauchen:
> - ID (Primärschlüssel)
> - kurs_id (Fremdschlüssel)
> - schul_id (Fremdschlüssel)
> ...



Tu dir selbst eine Gefallen, und mach' alles Deutsch. Ein Mischmasch wird furchtbar fuer dich, und wenn das ohnehin den deustchen Ruam bedient, kann auch das Modell Deutsch sein.


----------



## icrystaltm (29. Apr 2022)

Robert Zenz hat gesagt.:


> Tu dir selbst eine Gefallen, und mach' alles Deutsch. Ein Mischmasch wird furchtbar fuer dich, und wenn das ohnehin den deustchen Ruam bedient, kann auch das Modell Deutsch sein.


Danke für deine Anmerkung.
Eigentlich habe ich alles auf Englisch, da hier aber auf Deutsch geschrieben wird, habe ich alles übersetzt und dabei habe ich einiges vergessen. Sorry.


----------



## Robert Zenz (29. Apr 2022)

Bei den Semestern wuerde ich direkt die Beschreibung als PK nehmen. Ebenso bei Kursart. Umbenennen wirst du die wahrscheinlich ohnehin nie, und es macht die restliche Datenbank leichter zu lesen:


```
KURS
ID    NAME        KURSTYP (FK)
1     Mathematik  Grundkurs
2     Mathematik  Leistungskurs

KURS_VERSION
ID    KURS_ID        SCHOOL_ID     SEMESTER    BESCHREIBUNG
1     1              1             2022        Ableitung von Funktionen...
2     1              1             2022/23     Integralrechnung
```

Eventuell willst du auch eine lesbare ID fuer die Schulen und die Kurse. Aber das kommt auch darauf an wie oft du mit dem DB-Modell direkt zutun hast im Gegensatz zu irgendeiner Schicht welche das alles fuer dich aufloest.



icrystaltm hat gesagt.:


> Eigentlich habe ich alles auf Englisch, da hier aber auf Deutsch geschrieben wird, habe ich alles übersetzt und dabei habe ich einiges vergessen. Sorry.



Wenn du nur deutsche "Kunden" hast, und nur Daten von deutschen Schulen verwaltest, ist es vermutlich Sinnvoll das Modell ebenfalls in Deutsch zu haben. Dann musst du dir keinen Glossar malen wo du wie welchen Begriff uebersetzt. Bei "course_version" rollt es mir zum Beispiel schon die Zaehennaegel hoch.


----------



## yfons123 (29. Apr 2022)

icrystaltm hat gesagt.:


> Kurs 2 oder 4 Semester


das kannst du doch im nachhinein rein backen

MEINES ERACHTENS ist dein haupt problem dass du gerade zu viele probleme auf einmal lösen willst

dh ich würde jetzt erstmal die ganzen tabellen aufbauen die unabhängig sind dh nru von anderen referenziert zb die semester möglichkeiten kannst du immer ausfüllen ( unis haben unterschieldliche semester zeiten das ist dir schon bewusst )

die kursarten kannst du auch immer ausfüllen

wenn du das hast machst du es schritt für schritt fertig, im mometn siehts aus als ob du deine datenbank komplett ausdenken willst und dann hinklatschen und so lassen für die nächsten 20 jahre

aber erst beim programmieren und erstellen wird dir auffallen wenn du was komplett dämliches gemacht hast und dann kannst dein ganzes modell zusammen schmeißen weil gar nix mehr geht

dh eig parallel modell und datenbank entwickeln


du entwickelst ja auch nicht call of duty in dem du mit den skins anfängst 1000 animationen erstellst usw ... nein du machst erstmal grund funktionalität dass überhaupt mal was geht und dann baust du deine features drauf


----------

