1:1 Beziehung ohne Optionalität im Relationenmodell sicherstellen

dhermes

Neuer Benutzer
Beiträge
3
Hallo liebe Mitglieder,

ich hätte eine Frage zur Umsetzung von 1:1 Beziehungen ohne Optionalität im Relationenmodell. Ich finde dazu keine befriedigende Antwort im Netz (die Möglichkeit, dass ich ein Brett vorm Kopf habe, besteht natürlich auch)

1:1 Beziehungen können transformiert werden, indem man zu einer der Tabellen (egal welche) den Fremdschlüssel der anderen Tabelle hinzufügt. Das ist die Information, die ich in der Literatur und auf sämtlichen Seiten finden kann.
Aber wie verhält sich das bei fehlender Optionalität auf beiden Seiten. Nur mit Schlüsselbeziehungen lässt sich dieses jedoch nicht bewerkstelligen oder?
So müsste man doch sicherstellen, dass jeder FK genau einmal zugeordnet werden muss.

Ein kleines Beispiel falls ich mich unklar ausdrücke :)
Tabelle A : Abteilungen (Abt_Nr, Standort, PLZ, AL_NR
Tabelle B: Abteilungsleiter(Al_NR, Name, Vorname, Titel)

Wie stelle ich sicher, dass jede AL_NR genau einmal als FK in der Tabelle Abteilungen auftauchen muss?

Die obige Umsetzung würde doch "nur" einer 1:1 Beziehung mit Optionalität auf beiden Seiten (wenn der FK zusätzlich Nullable ist) entsprechen oder?

Mich macht es stutzig, das ich nirgends Hinweise auf weitere DB-funktionalitäten wie Trigger usw. finde dazu.

Vielleicht könnt ihr mir helfen. Da wäre ich sehr dankbar! :)

Viele Grüße
Daniel
 
Werbung:
Danke für die Info! Aber dann wäre es ja immer noch möglich das AL_NRern gar nicht in Abteilungen zugeordnet werden. Lässt sich das überhaupt gewährleisten?
 
Du kannst Constraints auch quasi "im Kreis" erstellen. Also, Tabelle a hat eine ID-Spalte, die gleichzeitig PK als auch FK auf B ist, und Tabelle b ebenfalls eine id-Spalte, die PK und FK auf a ist. Kurzdemo:

Code:
andreas@[local]:5434/test# begin;
BEGIN
andreas@[local]:5434/test*# create table a (id int primary key, val text);
CREATE TABLE
andreas@[local]:5434/test*# create table b (id int primary key, val text, foreign key (id) references a(id) deferrable);
CREATE TABLE
andreas@[local]:5434/test*# alter table a add constraint a_id_fk foreign key (id) references b deferrable;
ALTER TABLE
andreas@[local]:5434/test*# commit;
COMMIT
andreas@[local]:5434/test# begin;
BEGIN
andreas@[local]:5434/test*# set constraints all deferred;
SET CONSTRAINTS
andreas@[local]:5434/test*# insert into a values (1, 'eins');
INSERT 0 1
andreas@[local]:5434/test*# insert into b values (1, 'einseins');
INSERT 0 1
andreas@[local]:5434/test*# commit;
COMMIT
andreas@[local]:5434/test#

Wichtig ist das deferrable und daß in der Transaktion diese Constraints als Deferred markiert werden, sonst fliegt Dir das zu früh um die Ohren ...
 
Werbung:
Oder du fügst die Tabellen zu einer Tabelle zusammen und erzwingst somit das alle Spalten vorhanden sind, oder verstehe ich das jetzt falsch?
 
Zurück
Oben