Datenmodell Relationen definieren

ent1ty

Neuer Benutzer
Beiträge
2
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?
 
Werbung:
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?
 
Werbung:
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!
 
Zurück
Oben