Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Datenbankmodell Zyklus - Widerspruch auflösen ??

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von m50434, 15 Juli 2016.

  1. m50434

    m50434 Benutzer

    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:

    [​IMG]

    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:

  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. m50434

    m50434 Benutzer

    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?!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. m50434

    m50434 Benutzer

    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.
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Wie wäre es mit einer Tabelle? Mit passenden Fremdschlüsseln?
     
  7. m50434

    m50434 Benutzer

    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.
     
  8. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  9. m50434

    m50434 Benutzer

    Vielen Dank.
    Mir war nicht klar, wie man mehrere Attribute für einen Fremdschlüssel benutzen kann. So macht das dann Sinn
    Super !!! 1000000 Dank :)
     
    akretschmer gefällt das.
  10. m50434

    m50434 Benutzer

    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.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  12. m50434

    m50434 Benutzer

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden