Eine 1 : 1-Beziehung wird symmetrisch in beiden beteiligten Objekt-Typen modelliert:
class Professoren { attribute long PersNr; ... relationship Raeume residiertIn; }; class Raeume { attribute long RaumNr; attribute short Groesse; ... relationship Professoren beherbergt; };
Abbildung 16.4 zeigt eine mögliche Ausprägung der Beziehungen residiertIn und beherbergt.
Allerdings wird durch die gegebene Klassenspezifikation weder die Symmetrie noch die 1:1-Einschränkung garantiert. Abbildung 16.5 zeigt einen inkonsistenten Zustand des Beziehungspaars residiertIn und beherbergt.
Um Inkonsistenzen dieser Art zu vermeiden, wurde im ODMG-Objektmodell das inverse-Konstrukt integriert:
class Professoren { attribute long PersNr; ... relationship Raeume residiertIn inverse Raeume::beherbergt; }; class Raeume { attribute long RaumNr; attribute short Groesse; ... relationship Professoren beherbergt inverse Professoren::residiertIn; };Damit wird sichergestellt, daß immer gilt:
Binäre 1:N - Beziehungen werden modelliert mit Hilfe des Mengenkonstruktors set, der im nächsten Beispiel einem Professor eine Menge von Referenzen auf Vorlesungen-Objekte zuordnet:
class Professoren { ... relationship set (Vorlesungen) liest inverse Vorlesungen::gelesenVon; }; class Vorlesungen { ... relationship Professoren gelesenVon inverse Professoren::liest; };Man beachte, daß im relationalen Modell die Einführung eines Attributs liest im Entity-Typ Professoren die Verletzung der 3. Normalform verursacht hätte.
Binäre N:M - Beziehungen werden unter Verwendung von zwei set-Konstruktoren modelliert:
class Studenten { ... relationship set (Vorlesungen) hoert inverse Vorlesungen::Hoerer; }; class Vorlesungen { ... relationship set (Studenten) Hoerer inverse Studenten::hoert; };
Durch die inverse-Spezifikation wird sichergestellt, daß gilt:
Analog lassen sich rekursive N : M - Beziehungen beschreiben:
class Vorlesungen { ... relationship set (Vorlesungen) Vorgaenger inverse Vorlesungen::Nachfolger; relationship set (Vorlesungen) Nachfolger inverse Vorlesungen::Vorgaenger; };
Ternäre oder n3 stellige Beziehungen benötigen einen eigenständigen Objekttyp, der die Beziehung repräsentiert. Zum Beispiel wird die ternäre Beziehung
pruefen | : | {[ MatrNr, VorlNr, PersNr, Note ]} |
class Pruefungen { attribute float Note; relationship Professoren Pruefer inverse Professoren::hatgeprueft; relationship Studenten Pruefling inverse Studenten::wurdegeprueft; relationship Vorlesungen Inhalt inverse Vorlesungen::wurdeAbgeprueft; }; class Professoren { attribute long PersNr; attribute string Name; attribute string Rang; relationship Raeume residiertIn inverse Raeume::beherbergt; relationship set(Vorlesungen) liest inverse Vorlesungen::gelesenVon; relationship set(Pruefungen) hatgeprueft inverse Pruefungen::Pruefer; }; class Vorlesungen { attribute long VorlNr; attribute string Titel; attribute short SWS; relationship Professoren gelesenVon inverse Professoren::liest; relationship set(Studenten) Hoerer inverse Studenten::hoert; relationship set(Vorlesungen) Nachfolger inverse Vorlesungen::Vorgaenger; relationship set(Vorlesungen) Vorgaenger inverse Vorlesungen::Nachfolger; relationship set(Pruefungen) wurdeAbgeprueft inverse Pruefungen::Inhalt; }; class Studenten { attribute long MatrNr; attribute string Name; attribute short Semester; relationship set(Pruefungen) wurdeGeprueft inverse Pruefungen::Pruefling; relationship set(Vorlesungen) hoert inverse Vorlesungen::Hoerer; };Abbildung 16.6 visualisiert die bislang eingeführten Beziehungen. Die Anzahl der Pfeilspitzen gibt die Wertigkeit der Beziehung an:
bezeichnet eine 1 : 1-Beziehung | bezeichnet eine 1 : N-Beziehung | ||
bezeichnet eine N : 1-Beziehung | bezeichnet eine N : M-Beziehung |