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

Datenmodell Relationen definieren

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von ent1ty, 20 März 2020.

  1. ent1ty

    ent1ty Neuer Benutzer

    Hallo Zusammen,

    bei meinem aktuellen Projekt stehe ich derzeit gedanklich auf dem Schlauch und benötige mal fachlichen Austausch.
    Folgendes Problem:
    Ich habe eine Tabelle mit Projekten und eine Tabelle mit Unterprojekten, Beziehung 1:n - wobei ein Projekt ein Unterprojekt haben kann, aber nicht muss
    Soweit so gut.
    Hinzu kommt eine Tabelle mit Dateien, welche in den Projekten/Unterprojekten erzeugt werden. Somit besteht eine Relation (1:n) zum Projekt und, falls vorhanden, eine zum Unterprojekt. Somit habe ich zwei Foreign keys in meiner Tabelle Dateien.
    Kann man das soweit machen? Oder brauche ich eine Zwischentabelle mit den Keys aus Projekt, Unterprojekt und Dateien?
    Wo ich mir halt unsicher bin ist, dass nicht für alle Projekte ein Unterprojekt vorhanden ist aber Dateien auf beide Verweisen können/müssen - und das zu Anomalien in der Datenbankstruktur führt.

    Hat jemand von Euch einen Rat?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ich gehe mal davon aus, daß eine Datei zwingend entweder zu einem Projekt gehört ODER zu einem Unterprojekt, NIE aber zu beiden. Und erst recht nicht zu Projekt X und einem Unterprojekt von Projekt Y.

    Code:
    test=# create table projekte(id int primary key, name text);
    CREATE TABLE
    test=*# create table unterprojekte(id int primary key, projekt int references projekte, name text);
    CREATE TABLE
    test=*# create table dateien(id int primary key, projekt int references projekte, unterprojekt int references unterprojekte, name text, check((case when projekt is null then 1 else 0 end + case when unterprojekt is null then 1 else 0 end) = 1) );
    CREATE TABLE
    test=*# insert into projekte values (1, 'projekt 1');
    INSERT 0 1
    test=*# insert into projekte values (2, 'projekt 2');
    INSERT 0 1
    test=*# insert into projekte values (3, 'projekt 3');
    INSERT 0 1
    test=*# insert into unterprojekte values (1, 2, 'unterprojekt von 2');
    INSERT 0 1
    test=*# insert into dateien values (1, 1, NULL, 'datei zu projekt 1');
    INSERT 0 1
    test=*# insert into dateien values (2, NULL, 1,'datei zu unterprojekt projekt von 2');
    INSERT 0 1
    test=*# insert into dateien values (3, 1, 1,'datei gleichzeitig projekt und unterprojekt');
    ERROR:  new row for relation "dateien" violates check constraint "dateien_check"
    DETAIL:  Failing row contains (3, 1, 1, datei gleichzeitig projekt und unterprojekt).
    test=*#
    
    Paßt das?
     
  3. ent1ty

    ent1ty Neuer Benutzer

    Stimmt, Entweder direkt Projekt oder zum Unterprojekt, falls es eines gibt!
    Bisher habe ich immer versucht es beiden zuzuordnen, wenn es ein Unterprojekt gibt.
    Macht so jetzt mehr Sinn.
    Vielen Dank für die Hilfe!
     
    akretschmer gefällt das.
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