Tabellen [basics]: Lookup-Beziehungen

Lookup-Beziehungen sind solche Beziehungen, wo eine Tabelle, wie beispielsweise zum Verwalten von Kundendaten, ein Feld enthält, mit dem genau eine Eigenschaft dieses Kunden aus den Datensätzen einer anderen Tabelle ausgewählt werden kann. Ein schönes Beispiel dafür ist die Anrede des Kunden. Solche Beziehungen lassen sich sehr schön mit dem Nachschlage-Assistenten definieren, den wir bereits in einem weiteren Artikel beschrieben haben. Im vorliegenden Artikel zeigen wir, wie Du solche Beziehungen von Hand definieren und sie gegebenenfalls noch an spezielle Anforderungen anpassen kannst.

Beispieldatenbank

Die Beispiele dieses Artikels findes Du in der Datenbank 2206_TabellenBasics_LookupBeziehungen.accdb.

Arten von 1:n-Beziehungen

Wir unterscheiden grob zwischen zwei Arten von 1:n-Beziehungen. Die erste definiert eine Beziehung von Daten aus zwei Tabellen, die auf jeden Fall in verschiedenen Tabellen gehalten werden müssen, weil sie sonst selbst die grundlegendsten Regeln der Normalisierung von Datenbanken verletzten würden. Das betrifft beispielsweise solche Daten wie Kunden und Projekte. Da jedem Kunden mehrere Projekte zugewiesen werden können, werden diese Daten in zwei verschiedene Tabellen geschrieben. Dabei enthält auch die Tabelle, deren Primärschlüsselfeld an der Beziehung beteiligt ist, einige Felder, die wichtig für Geschäftsprozesse sind. Die Tabellen einer solchen Beziehung sehen, in sehr abgespeckter Form, wie in Bild 1 aus.

1:n-Beziehung mit zwei

Bild 1: 1:n-Beziehung mit zwei “vollwertigen” Tabellen

Bei den von uns so bezeichneten Lookup-Beziehungen hingegen enthält die Tabelle mit dem an der Beziehung beteiligten Primärschlüsselfeld meist nur ein einziges Feld. Dieses Feld enthält Daten, die man auch direkt in ein Feld der Tabelle schreiben könnte, welches mit dem Fremdschlüsselfeld auf die auszuwählenden Daten verweist.

Ein gutes Beispiel ist die Anrede. Die Anrede direkt in ein Feld einer Tabelle zu schreiben ist gerade bei Verwendung von Tabellenkalkulationen wie Excel zur Verwaltung solcher Daten beliebt. Das Problem dabei ist: Neben Herr, Frau und Firma oder anderen Anreden tragen Benutzer auch gern Varianten ein wie Herrn, Herr Dr. und so weiter. Daraus ergibt sich, dass so schnell ein Wildwuchs entsteht und selbst von ein und derselben Anrede mehrere Versionen entstehen können. Um so etwas zu verhindern, kann man eine eigene Tabelle mit Anreden erstellen, die neben dem Feld für die Anreden noch ein Primärschlüsselfeld etwa namens AnredeID enthält.

Damit man diese Anreden nun in einer weiteren Tabelle wie tblKunden nutzen kann, um für die jeweiligen Kunden eine Anrede festzulegen, fügt man dieser ein Fremdschlüsselfeld hinzu. Dafür definiert man auch noch referenzielle Integrität, damit das Feld definitiv nur solche Einträge aufnehmen kann, die auch in der Tabelle mit den Anreden enthalten sind. Andere Beispiele für Daten, die wir in Lookup-Tabellen speichern würden, sind Kategorien, Produktarten, Währung, Mehrwertsteuersatz und viele mehr.

Vorteile von Lookup-Tabellen

Damit haben wir bereits einen Vorteil von Lookup-Tabellen für bestimmte Felder erwähnt: Der Benutzer kann nur noch die in der Lookup-Tabelle gespeicherten Werte wie beispielsweise Herr, Frau oder Firma für eine Anrede auswählen. Damit entstehen nicht mehr verschiedene Versionen ein und der selben Anrede, Kategorie et cetera.

Ein weiterer Vorteil ist, dass eine Auswahl oft viel schneller erfolgen kann als wenn man die Daten von Hand eingeben muss. Gegebenenfalls kann man in einem Formular, in dem dieser Wert noch nicht ausgewählt wurde, sogar das Nachschlagefeld automatisch aufklappen, wenn der Benutzer ein solches Feld aktiviert.

Ein in Anbetracht der heutigen Festplattengrößen weniger wichtiger Faktor ist, dass bei Verwendung von Nachschlagefeldern einige Byte Speicherplatz pro Datensatz eingespart werden können. Logisch: Wenn man eine Anredentabelle hat, welche mit den Werten 1, 2 und 3 die Anreden Herr, Frau und Firma abbildet, dann braucht man in jedem Kundendatensatz nur einen dieser Zahlenwerte zu speichern statt der Zeichenkette.

Außerdem soll die Lookup-Tabelle jeden Wert nur genau einmal enthalten. Auf diese Weise sparen wir nochmal Speicherplatz gegenüber einem entsprechenden Feld in der Kundentabelle.

Nachteile von Lookup-Tabellen

Der Vorteil ist in manchen Fällen auch gleichzeitig der Nachteil: Es wäre nämlich praktisch, wenn man einem Nachschlagefeld auch neue Einträge hinzufügen könnte – zum Beispiel für Kategorien oder Produktarten. Allerdings lässt sich dies in Formularen mit ein wenig VBA leicht realisieren – dazu jedoch in einem späteren Artikel mehr.

Ein weiterer Nachteil von Lookup-Tabellen ist, dass man, wenn man die in den Lookup-Tabellen enthaltenen Daten für irgendeinen Zweck benötigt, immer erst noch auf die Daten aus einer weiteren Tabelle zugreifen muss.

Das ist vor allem bei Berechnungen hinderlich, deshalb würde man beispielsweise bei der Mehrwertsteuer genau prüfen, ob man diese in einer externen Tabelle speichert oder doch direkt im Feld einer Produkttabelle oder einer Tabelle mit Bestellpositionen.

Erstellen einer Lookup-Tabelle aus einem Feld einer Haupttabelle

Stellen wir uns vor, wir hätten eine Tabelle aus einer Excel-Datei von einem Kunden übernommen, deren Daten wir nun in ein Access-Datenmodell überführen sollen. Diese Tabelle enthält die Kundendaten und darunter eine Spalte namens Anrede, welche bereits bereinigte Anreden wie Herr, Frau und Firma enthält. Wir stehen nun vor der Aufgabe, diese Daten in eine Lookup-Tabelle zu überführen und in der Kundentabelle ein Fremdschlüsselfeld anzulegen, mit dem wir auf die Daten dieser Lookup-Tabelle zugreifen wollen.

Die Ausgangstabelle sieht in der Datenblattansicht wie in Bild 2 aus.

Tabelle mit Anreden in einem Textfeld

Bild 2: Tabelle mit Anreden in einem Textfeld

Lookup-Tabelle erstellen

Bevor wir in diesem Fall die Lookup-Tabelle erstellen, brauchen wir nicht groß nachzudenken – die Werte des Feldes Anrede werden kaum einmal um neue Werte erweitert, das Auswählen wäre eine Erleichterung für den Benutzer und wir sparen noch eine Menge Speicherplatz, da in der Kundentabelle immer nur ein Zahlenwert statt der kompletten Anrede gespeichert werden muss.

Also erstellen wir eine neue Tabelle mit dem Namen tblAnreden und fügen dieser zwei Felder hinzu:

  • AnredeID: Primärschlüsselwert mit Autowert-Funktion
  • Anrede: Bezeichnung der Anrede

Eindeutiger Schlüssel für das Inhaltsfeld

Das Feld der Lookup-Tabelle, das den eigentlichen Wert enthält, benötigt eine weitere Anpassung: Wir müssen die Eigenschaft Indiziert auf den Wert Ja (Ohne Duplikate) einstellen. Schließlich wollen wir die Tabelle auch deshalb nutzen, damit wir nicht die gleichen Werte mehrfach abspeichern müssen. Diese Einstellung nehmen wir im Tabellenentwurf im Bereich Feldeigenschaften für das Feld Anrede vor (siehe Bild 3).

Entwurf der Lookup-Tabelle für die Anreden

Bild 3: Entwurf der Lookup-Tabelle für die Anreden

Nachdem wir das erledigt haben, können wir die Tabelle entweder von Hand füllen oder wir erledigen das mit einer Anfügeabfrage. Diese würde alle Werte, die sich im Feld Anrede der Tabelle tblKunden befinden, in die Tabelle tblAnreden eintragen. Allerdings kann es auch sein, dass dort noch Anreden enthalten sind, die wir nicht in die Tabelle tblAnreden übernehmen wollen. Also fügen wir die gewünschten Anreden lieber von Hand in die Tabelle tblAnreden ein. Das Ergebnis sehen wir in Bild 4.

Die Tabelle tblAnreden mit Daten

Bild 4: Die Tabelle tblAnreden mit Daten

Lookup-Beziehung herstellen

Nun gehen wir einen Schritt weiter und fügen der Tabelle tblKunden ein neues Feld namens AnredeID hinzu. Dies soll unser Fremdschlüsselfeld werden, in das wir nur Daten aus dem Feld AnredeID der Tabelle tblAnreden eintragen wollen – also 1, 2 oder 3 für Herr, Frau und Firma.

Das Feld fügen wir gleich unter dem vorhandenen Feld Anrede ein. Als Felddatentyp legen wir Zahl fest mit der Feldgröße Long Integer (siehe Bild 5).

Das neue Fremdschlüsselfeld AnredeID in der Tabelle tblKunden

Bild 5: Das neue Fremdschlüsselfeld AnredeID in der Tabelle tblKunden

Wichtig ist, dass wir prüfen, ob für dieses Feld automatisch als Standardwert der Wert 0 eingestellt wurde. In diesem Fall leeren wir diese Eigenschaft. Wir könnten zwar einen Standardwert vorgeben, wenn die Kunden beispielsweise überwiegend Männer, Frauen et cetera enthalten würden – dann könnte man den Standardwert auf einen der Werte der Tabelle tblAnreden festlegen. Der Wert 0 ergibt aber gar keinen Sinn, denn die Tabelle tblAnreden enthält ja keinen Datensatz, der in dem zu verknüpfenden Feld AnredeID den Wert 0 aufweist.

Wichtig: Datentypen der verknüpften Felder müssen übereinstimmen!

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:

Schreibe einen Kommentar