# DBS Relationenmodell zwingende Beziehung



## Zoja (10. Dez 2015)

Hallo Community!

Nehmen wir an wir haben den Fall Mitarbeiter -- <ist Vorgesetzter von> -- Mitarbeiter. Das ist eine rekursive Beziehung, wenn wir das ins Relationenmodell umwandeln:

Mitarbeiter-Key - Name - _Mitarbieter-Key
_
Mitarbeiter-Key ist der Primärschlüssel und Fremdschlüssel, nun ist das ja kein Problem, jedoch was passiert wenn ein Mitarbeiter keinen Vorgesetzten hat, wenn er zum Beispiel die höchste Stelle hat? Schreiben wir einfach "NULL" rein beim Fremdschlüssel?

Muss hier eine zwingende Beziehung hin?
Wie sieht diese aus? So wir ich das verstehe sind das dann einfach 2 Tabellen? einmal:

Mitarbeiter-Key - Name - _Mitarbieter-Key_

Und die normale Tabelle des Entitytypen Mitarbeiter?

Mitarbeiter-Key - Name


----------



## kneitzel (10. Dez 2015)

Hallo,

als erstes ist wichtig, was für eine Beziehung dies genau ist. Jeder Mitarbeiter hat normalerweise einen oder keinen Vorgesetzten. Also eine 1:n Beziehung. Dies kann man in einer Datenbank durch ein einfaches zusätzliches Feld hinzufügen. Die Tabelle mit den Mitarbeitern hat dann ein Feld, das z.B. Vorgesetzter_ID heisst. (Hier kommen dann ggf. Namens-Konventionen ins Spiel. Bei uns hängt dann ein _ID an, das deutlich machen soll, dass hier eine ID enthalten ist, die auf eine andere Id verweist. Aber hier erst einmal egal).
Wenn es den Fall geben soll, dass jemand keinen Vorgesetzt hat, dann erlaubt man auch einen NULL Wert. Will man dies nicht erlauben, dann ist NULL nicht erlaubt. Das ganze bekommt dann noch ein Constraint, damit nur gültige Ids vorhanden sein können und ein Vorgesetzter nicht plötzlich aus der Tabelle gelöscht werden kann.

Komplizierter wird es, wenn eine n:m Beziehung erlaubt werden soll. Dann hat ein Mitarbeiter ggf. mehrere Vorgesetzten. Dann hat man eine zusätzliche Tabelle. Diese enthält dann mindestens zwei IDs: Untergebener_ID und Vorgesetzer_ID. Evtl. macht es aber auch noch sinn, die Tabelle zu erweitern um dieses Verhältnis zu klassifizieren. So könnte man dann noch erfassen, ob es nun ein disziplinarischer Vorgesetze ist oder ob es sich um einen fachlich Vorgesetzten handelt.

Deine Idee mit einer zweiten Tabelle, die dann erneut den Namen des Mitarbeiters führt, würde ja bedeuten, dass Du Daten doppelt abgelegt hast. Das gilt es normalerweise zu vermeiden.

Abfragen würden dann z.B. so aussehen:
SELECT 
  u.Name as Untergebener,
  v.Name as Vorgesetzer
FROM Mitarbeiter as u
LEFT JOIN Mitarbeiter as v ON u.Id = v.Vorgesetzer_ID

So die Tabelle MItarbeiter die Felder Id, Name und Vorgesetzer_ID hätte und eine [0..1]:n Beziehung vorliegen sollte. Dank LEFT JOIN könnte es auch keinen Vorgesetzten geben.

Konrad


----------

