Datenbankmodell Zyklus - Widerspruch auflösen ??

m50434

Benutzer
Beiträge
7
Hallo liebes Forum,

es geht um folgenden Sachverhalt:

In Meiner Datenbank gibt es Schüler, die eine eindeutige ID haben.
Dann gibt es Kurse, die eine eindeutige ID haben. Ein Kurs kann mehrere Schüler aufnehmen. Ein Schüler sitzt wiederum in einem oder mehreren Kursen.

Jeder Kurs kann außerdem auch eine oder mehrere Checklisten haben.
In diesen Checklisten sollen Daten wie z.B. "Zettel abgegeben/Zettel nicht abgegeben" bezogen auf den Schüler des Kurses eingetragen werden.

In meinem ER-Modell sieht das ganze daher so aus:

er_problem-png.855


Folglich habe ich folgende Tabellen (FS steht für Fremdschlüssel):
Schueler(ID, ... )
Kurse(ID, ...)
Checklisten(ID, FS: Kurs.ID)
SchuelerSitztIn(ID, FS: Schueler.ID, FS: Kurse.ID)
SchuelerIstTeilVonCheckliste(ID, FS: Schueler.ID, FS: Checkliste.ID)


Nun zu meinem Problem:
In meinem Schema ist ja nun folgender Sachverhalt denkbar:
Schüler mit ID 1 sitzt in Kurs mit ID 22.
Zu Kurs mit ID 22 gehört die Checkliste mit ID 1234.
Schüler mit ID 1 ist Teil von Checkliste mit ID 1234.

Soweit in Ordnung.
Nun kann aber ja folgender Fehler passieren.

Schüler mit ID 1 sitzt NUR in Kurs mit ID 22.
Zu Kurs mit ID 22 gehört die Checkliste mit ID 1234.
Zu Kurs mit ID 66 gehört die Checkliste mit ID 5678.
Schüler mit ID 1 ist Teil von Checkliste mit ID 5678.

Die letzte Zeile steht nun aber im Widerspruch dazu, das der Schüler mit ID 1 NUR im Kurs mit der ID 22 sitzt.
Denn er ist ja Teil von Checkliste ID 5678 die widerum zu Kurs 66 gehört, in der der Schüler ID 1 aber gar nicht drin ist.


Mit ist die mögliche Inkonsistenz in meinem Modell klar, ich habe aber nun tagelang versucht, dieses Problem durch eine andere Modellierung zu lösen; es gelingt mir aber einfach nicht.

Ich hoffe irgendwer kann mir helfen.
 

Anhänge

  • ER_Problem.PNG
    ER_Problem.PNG
    42,3 KB · Aufrufe: 38
Werbung:
sofern ich das richtig verstehe ist deine letztgenannte Tabelle damit falsch. Du brauchst eine Zuordnung, welche Checklisten zu welchen Kursen gehören, nicht aber, welche Schüler zu welcher Checkliste.
 
Hmmm...
wenn ich aber eine Tabelle habe, die darstellt, welche Checklisten zu welchen Schülern gehören, wie kann ich dann die Daten der Schüler (also zum Beispiel Zettel abgegeben/nicht abgegeben), die zu den jeweiligen Checklisten gehören, darstellen, OHNE dass ich dabei wieder das gleiche Problem wie oben habe, dass ich eventuell die Kurszugehörigkeiten verletzte?!
 
durch joins zwischen den Tabellen. Durch das Wissen, welcher Schüler in welchem Kusr ist UND welcher Kurs welche Checklisten hat, kannst Du sehen, welche Checklisten für welche Schüler relevant sind.
 
Ok, falsch formuliert. Nicht "wie kann ich die Daten darstellen" sondern wo sollen diese Daten (in welcher Tabelle) gespeichert werden?!

Also im Detail:
Der Kurs hat eine Checkliste und der Schüler einen Kurs. Somit kann ich natürlich über den Schüler auch auf eine passende Checkliste des Kurses zugreifen, ok.

Aber wo sollen die einzelnen Daten der Checkliste gespeichert werden, die ja vom Schüler abhängen.
Wenn z.B. ein Kurs 20 Schüler hat, dann braucht die Checkliste 20 Einträge, die zu dem jeweiligen Schüler gehören.
 
Ja, aber welche Fremdschlüssel sollen das sein?!
Im obigen ER-Modell fällt nach deinem Vorschlag praktisch die Beziehung "istTeilVon" weg (wenn ich das richtig verstanden habe).

Wenn ich jetzt einen weitere Tabelle mit Fremschlüssel zu den Checklisten und zu den Schüler erstelle, dann habe ich aber doch wieder genau das oben beschriebene Problem.
 
Code:
test=# create table schueler(id int primary key);
CREATE TABLE
test=*# create table kurse (id int primary key);
CREATE TABLE
test=*# create table checkliste (id int primary key);
CREATE TABLE
test=*# create table schueler_kurs(s_id int references schueler, k_id int references kurse, primary key(s_id, k_id));
CREATE TABLE
test=*# create table kurs_checklist(k_id int references kurse, c_id int references checkliste, primary key(k_id, c_id));
CREATE TABLE
test=*# create table checklist_data (k_id int, c_id int, s_id int, foreign key(k_id,c_id) references kurs_checklist, foreign key(s_id, k_id) references schueler_kurs);
CREATE TABLE
test=*#

mal so als grobe Idee.
 
Ich nochmal:
Habe das ganze jetzt mal in meiner Datenbank umgesetzt und mit Testdaten rumgespielt... bin soweit auch sehr zufrieden.

Allerdings ergab sich eine neue Frage:

Wenn nun in der Tabelle checkliste eine Checkliste gelöscht wird, dann wird auch in der Tabelle kurs_checklist der entsprechende Eintrag gelöscht (mittels CASCADE beim Fremdschlüssel).

Wenn nun aber ein Kurs gelöscht wird (in der Kurstabelle), dann wird zwar auch der entsprechende Eintrag in der Tabelle kurs_checklist gelöscht, ABER die Checkliste wird nicht gelöscht !!!

Liegt natürlich daran, dass die Tabelle checkliste keinen Fremdschlüssel hat.

Wie kann ich dieses Problem lösen.
Ich hatte schon versucht, der Tabelle checkliste als Fremdschlüssel das Attribut c_id aus der Tabelle kurs_checklist zu geben; das funktioniert aber nicht.
 
wenn die Einträge von checkliste von kurse abhängig sein und mit diesen gelöscht werden sollen, dann gehört da noch ein FK hin. Wie das geht siehst Du ja an den anderen Tabellen.
 
Werbung:
ja ok, aber wenn ich in der Tabelle checkliste einen Fremdschlüssel einbaue, der auf die ID der Tabelle Kurse verweist, dann werden zwar die Checklisten des Kursen auch gelöscht, wenn der Kurs gelöscht wird, ok.

Aber dann habe ich doch wieder das Problem, dass ich in der Tabelle Checkliste eine andere Kurs_ID angeben kann, als die, die in der Tabelle kurs_checklist eingetragen ist. Dann ist da wieder ein Widerspruch.
 
Zurück
Oben