Unter einer reflexiven Beziehung versteht man eine solche Beziehung, bei der man die Datensätze einer Tabelle den Datensätzen der gleichen Tabelle unterordnen kann. Damit kann man dann beispielsweise Kategorien mit beliebig vielen Unterkategorien abbilden. Um solche Daten zu verwalten, gibt es im Wesentlichen zwei verschiedene Arten: Entweder man fügt der Tabelle selbst ein Feld hinzu, mit dem man festlegen kann, welchem anderen Datensatz der aktuelle Datensatz untergeordnet ist. Oder man realisiert die reflexive Beziehung über eine externe Tabelle. Wir schauen uns an, wie Sie diese beiden Varianten realisieren können.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 2001_ReflexiveDatenInTabellen.accdb.
Reflexive Daten am Beispiel von Kategorien
Unsere erste Beispieltabelle zeigt die einfachste Variante der reflexiven Beziehung (siehe Bild 1). Sie enthält ein Primärschlüsselfeld und ein Feld zum Eintragen der Bezeichnung der Kategorie. Außerdem enthält sie ein Feld namens ParentKategorieID mit dem Datentyp Zahl.
Bild 1: Entwurf der Tabelle mit Verknüpfung auf sich selbst
Dieses Feld soll mit dem Wert des Feldes KategorieID eines übergeordneten Datensatzes gefüllt werden. Um sicherzustellen, dass dieses Feld keine Werte annimmt, die nicht im Feld KategorieID der Tabelle enthalten sind, legen wir eine entsprechende Beziehung an.
Dazu öffnen Sie über den Ribbon-Eintrag Datenbanktools|Be-zie-hun-gen|Be-zie-hun-gen das Beziehungen-Fenster und fügen die Tabelle tblKategorien zwei Mal hinzu. Die zweite Instanz dieser Tabelle im Beziehungen-Fenster wird dann tblKategorien_1 genannt (siehe Bild 2).
Bild 2: Verknüpfung der Tabelle mit sich selbst
Nun ziehen Sie das Feld ParentKategorieID aus der Tabelle tblKategorien_1 auf das Feld KategorieID der Tabelle tblKategorien. Es erscheint direkt der Dialog Beziehung bearbeiten. Hier klicken Sie die Option Mit referentieller Integrität an und schließen den Dialog wieder. Danach erscheint die Beziehung zwischen den beiden Instanzen der gleichen Tabelle wie in Bild 3. Damit können Sie den Dialog nun schließen.
Bild 3: Darstellung der Verknüpfung
Beispieldaten eingeben
Nun geben wir einige Beispieldatensätze in die Tabelle tblKategorien ein. Hier können Sie für das Feld ParentKategorieID nun nur noch solche Werte eingeben, die bereits im Feld KategorieID vorhanden sind. Um dies zu testen, geben wir wie in Bild 4 einmal einen Wert für das Feld ParentKategorieID ein, der gar nicht in der Tabelle enthalten ist.
Bild 4: Tabelle mit einigen Beispieldatensätzen
Beim Speichern dieses Datensatzes erscheint die Meldung aus Bild 5. Diese liefert die erwartete Erklärung für den Fehler.
Bild 5: Fehler beim Verweis auf einen nicht vorhandenen Primärschlüsselwert
Zirkelbezüge
Von Excel kennen Sie die sogenannten Zirkelbezüge. Das sind Verweise zwischen Excel-Feldern, bei denen man irgendwann wieder beim Ausgangsfeld landet – und das kann Excel nicht mehr auflösen, weshalb ein Fehler angezeigt wird. In einer reflexiv verknüpften Tabelle wie tblKategorien kann Access einen solchen Zirkelbezug nicht erkennen. Wenn Sie also beispielsweise in das Feld ParentKategorieID des Datensatzes mit dem Wert 1 im Feld KategorieID wieder den Wert 1 eintragen, dann ist das zwar ein Verweis auf sich selbst, aber es gibt keinen Mechanismus, der dies erkennen würde. Sie müssen also in den Elementen der Benutzeroberfläche, die zur Eingabe und Zuordnung von Kategorien dienen, selbst dafür sorgen, dass der Benutzer keine Selbstverknüpfung herstellen kann – weder direkt noch über mehrere Elemente.
Reflexive Beziehung mit Verknüpfungstabelle
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: