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

Abbildung komplexerer Beziehnungen

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von DerJung, 19 Mai 2017.

  1. DerJung

    DerJung Neuer Benutzer

    Hallo zusammen,

    ich möchte gerne ein Schema designen, in dem ein Teil die Zuordnung von Nebenstellen zu einer Person, einem Raum oder einem Funktionsraum abgebildet wird. Das "oder" ist an der Stelle entscheidend. Jede Nebenstelle soll somit einer dieser Möglichkeiten (Person, Raum, Funktionsnummer) zugeordnet werden. Diese Drei Möglichkeiten haben selbst wieder Attribute, die sich von denen der anderen Möglichkeiten unterscheiden. Es wird immer nur einer Nebenstelle 0...1 Zuordnungen zugeordnet.

    Meine Frage wäre nun, wie ich dies zum einen konkret abbilde und zum anderen wie über die Abfrage der Nebenstelle auch die Zuordnung ermitteln kann, sprich: Ich möchte eine Abfrage über die Nebenstelle machen ohne vorher zu ermitteln welcher Möglichkeit sie zugeordnet ist.

    Ich habe bereits mal an Super-/Subtypen Beziehung gedacht, allerdings konkretisieren beispielsweise Personen die Nebenstelle ja nicht weiter, sonder die Person bildet eher ein Attribut, dass zur Nebenstelle gehört...

    Zum besseren Verständnis habe ich noch ein Diagramm abgehangen.

    diagramm.png
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Vielleicht sowas?

    Code:
    test=# create table nebenstelle(nebenstellennr int, bemerkung text);
    CREATE TABLE
    test=*# create table person (name text, vorname text) inherits (nebenstelle);
    CREATE TABLE
    test=*# create table funktionsraum(raumnr int) inherits (nebenstelle);
    CREATE TABLE
    test=*# create table funktionsnummer(funktion text) inherits (nebenstelle);
    CREATE TABLE
    test=*# \d person
      Tabelle »public.person«
      Spalte  |  Typ  | Attribute
    ----------------+---------+-----------
     nebenstellennr | integer |
     bemerkung  | text  |
     name  | text  |
     vorname  | text  |
    Erbt von: nebenstelle
    
    test=*# \d funktionsraum
      Tabelle »public.funktionsraum«
      Spalte  |  Typ  | Attribute
    ----------------+---------+-----------
     nebenstellennr | integer |
     bemerkung  | text  |
     raumnr  | integer |
    Erbt von: nebenstelle
    
    test=*# insert into person values (1, 'nebenstelle 1', 'Max','Mustermann');
    INSERT 0 1
    test=*# insert into funktionsraum values (2, 'nebenstelle 2', 23);
    INSERT 0 1
    test=*# select * from nebenstelle ;
     nebenstellennr |  bemerkung   
    ----------------+---------------
      1 | nebenstelle 1
      2 | nebenstelle 2
    (2 Zeilen)
    
    test=*#
    
     
  3. DerJung

    DerJung Neuer Benutzer

    Hab ich vergessen zu erwähnen: Das ganze soll auf MySQL laufen. Das kennt leider keine Vererbung ("inherits"-Befehl).
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Das ist dann - schlecht.
     
  5. ukulele

    ukulele Datenbank-Guru

    Kann MySQL Check Constraints?
    Code:
    CREATE TABLE zuordnung(
       pk UNIQUEIDENTIFIER PRIMARY KEY,
       fk1 UNIQUEIDENTIFIER NULL,
       fk2 UNIQUEIDENTIFIER NULL
       );
    
    ALTER TABLE zuordnung ADD CONSTRAINT einschraenkung CHECK ( fk1 IS NULL OR fk2 IS NULL );
    
    SELECT   (   CASE
           WHEN   z.fk1 IS NOT NULL
           THEN   r.data
           WHEN   z.fk2 IS NOT NULL
           THEN   n.data
           ELSE   NULL
           END ) AS data
    FROM   zuordnung z
    LEFT JOIN raum r
    ON     z.fk1 = r.pk
    LEFT JOIN nummer n
    ON     z.fk2 = n.pk
    
    oder
    
    SELECT   r.data AS data
    FROM   zuordnung z
    INNER JOIN raum r
    ON     z.fk1 = r.pk
    UNION ALL
    SELECT   n.data AS data
    FROM   zuordnung z
    INNER JOIN nummer n
    ON     z.fk2 = n.pk
    
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Jein. Es erkennt diese und prüft deren Syntax. Es hält diese aber nicht ein, sie werden schlicht ignoriert. Toll, oder?
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Code:
    mysql> create table foo(i int check (i < 10));
    Query OK, 0 rows affected (0,04 sec)
    
    mysql> insert into foo values (12);
    Query OK, 1 row affected (0,02 sec)
    
     
  8. ukulele

    ukulele Datenbank-Guru

    Excelent.
     

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