Abbildung komplexerer Beziehnungen

DerJung

Neuer Benutzer
Beiträge
2
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
 
Werbung:
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=*#
 
Hab ich vergessen zu erwähnen: Das ganze soll auf MySQL laufen. Das kennt leider keine Vererbung ("inherits"-Befehl).
 
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
 
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)
 
Werbung:
Zurück
Oben