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

1:1 Beziehung ohne Optionalität im Relationenmodell sicherstellen

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von dhermes, 12 August 2019.

  1. dhermes

    dhermes Neuer Benutzer

    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
     
  2. castorp

    castorp Datenbank-Guru

    Du kannst einen unique Constraint (oder Index) auf abteilungen(al_nr) definieren.
     
  3. dhermes

    dhermes Neuer Benutzer

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

    akretschmer Datenbank-Guru

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

    dhermes Neuer Benutzer

    Vielen Dank!
    Daniel
     
  6. ukulele

    ukulele Datenbank-Guru

    Oder du fügst die Tabellen zu einer Tabelle zusammen und erzwingst somit das alle Spalten vorhanden sind, oder verstehe ich das jetzt falsch?
     
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