Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 5/2008.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erstellen Sie eine Anwendung zum Verwalten Ihrer Büchersammlung.

Techniken

Tabellen, Formulare, VBA

Voraussetzungen

Access 2000 oder höher

Beispieldateien

Buecherverwaltung.mdb

Shortlink

633

Bücherverwaltung

André Minhorst, Duisburg

Bücher verwalten ist ein klassischer Fall für den Einsatz einer Datenbankanwendung. Die in diesem Beitrag vorgestellte Variante ist ein schönes Beispiel dafür, wie man die verschiedenen Beziehungstypen abbilden kann, aber auch die Grundlage für einen weiteren Beitrag, der das Einlesen von Buchinformationen über den Webservice von Amazon beschreibt.

Für Einsteiger

Nachdem die meisten Lösungen der vorherigen Ausgaben von Access im Unternehmen sich nur noch wenig mit den Grundlagen wie der Datenmodellierung und den Basistechniken beim Erstellen der Access-Objekte befassten und sich mehr auf die Spezialitäten der jeweiligen Anwendung konzentrierten, sollen hier mal wieder die Einsteiger zum Zuge kommen. Entscheidungen für den Aufbau des Datenmodells und die Umsetzung in Formulare und Berichte werden hier etwas genauer erläutert. Und bevor fortgeschrittenere Leser nun direkt weiterblättern, sei erwähnt, dass die in diesem Beitrag vorgestellte Lösung noch um ein sehr viel anspruchsvolleres Feature erweitert wird: nämlich um einen Im- und Export von Daten über den Amazon-Webservice. Mehr dazu lesen Sie dann im Beitrag Amazon-Webservices per VBA nutzen (Shortlink 634) in dieser Ausgabe.

Datenmodell

Welche Informationen soll eine Bücherverwaltung enthalten? Im Gegensatz zu einer Literaturverwaltung, die alle möglichen Schriftstücke aufnehmen soll, sind die Daten, die man in einer Bücherverwaltung speichert, wesentlich überschaubarer. Gibt es dort also nur Bücher oder muss man noch andere Objekte berücksichtigen? Das kann man leicht herausfinden, indem man einmal auflistet, welche Eigenschaften von Büchern die Datenbank aufnehmen soll:

  • Titel, Untertitel, Beschreibung
  • Autor(en)
  • Verlag
  • ISBN
  • Erscheinungsdatum
  • Standort
  • Abbildung des Buchs
  • Bindung
  • Preis
  • Maße und Gewicht

Es könnte so einfach sein ...

Eigentlich kann man alle Eigenschaften in einer Tabelle unterbringen. Bei Informationen wie Titel, Untertitel oder ISBN macht man das sowieso, den Verlag kann man auch in ein Textfeld eintragen und auch den Autor. Und wenn ein Buch mehrere Autoren hat, trägt man diese halt durch Kommata getrennt in das Autorenfeld ein. Oder man legt direkt mehrere Felder für die Autoren an, also Autor1, Autor2, Autor3 und so weiter. Das könnte dann wie in Abb. 1 aussehen. Wofür also der ganze Stress mit der Aufteilung von Daten in verknüpfte Tabellen, die man letztlich sowieso über Abfragen wieder zusammenführt und deren Daten sich nur mit Krücken wie Kombinationsfeldern oder Unterformularen vernünftig in Formularen darstellen lassen? Das hier ist doch mal eine klare Linie, oder?

pic001.tif

Abb. 1: Abschreckendes Beispiel einer Tabelle

Nein! Das war natürlich ein Beispiel dafür, wie man es auf keinen Fall machen darf. Die ersten drei Felder kann man durchaus so gestalten, auch wenn Datenbanktheoretiker auch hier noch Änderungsvorschläge einreichen würden - dazu später mehr.

Spätestens beim Feld Verlag sollte man jedoch Bauchschmerzen bekommen. Es ist ganz sicher nicht auszuschließen, dass die Tabelle einmal mehr als ein Buch zum gleichen Verlag erfassen wird. Das bedeutet, dass, wie in Abb. 1, ein Verlag, hier der Beispielverlag, in zwei oder mehr Datensätzen vorhanden ist. Das bringt etwas mit sich, was man in Datenbanken überhaupt nicht gern sieht, nämlich redundante Daten. Diese liefern gleich zwei Probleme:

  • Redundante Daten kosten Speicherplatz. Wenn die Bücher-Tabelle beispielsweise hundert Bücher vom gleichen Verlag enthält, benötigt man hundertmal den Platz für die entsprechende Zeichenkette.
  • Redundante Daten ermöglichen Inkonsistenzen. Es kann passieren, dass man bei der Dateneingabe einmal Beispielverlag und einmal Beispiel-Verlag schreibt. Natürlich weiß man in beiden Fällen, was gemeint ist. Für die Datenbank sind es jedoch verschiedene Verlage, wenn der Benutzer nach Büchern etwa vom Verlag Beispielverlag sucht und diesen als Suchbegriff einträgt. Diese Suche würde alle Bücher auslassen, bei denen der Verlag irrtümlich als Beispiel-Verlag eingetragen wurde.

Daten in Lookup-Tabellen auslagern

Abhilfe schafft in beiden Fällen eine weitere Tabelle, die einfach nur eine eindeutige ID je Verlag und den Namen des Verlags enthält. Dort trägt man alle Verlage ein. Wie aber legt man nun in der Büchertabelle fest, welcher Verlag ein Buch herausgebracht hat? Dazu braucht man kein Feld des Datentyps Text, sondern ein Zahlenfeld. Dieses nimmt einfach die ID des entsprechenden Datensatzes der Tabelle mit den Verlagen auf.

Das bedeutet also, dass man jeden Verlag nur noch einmal erfasst, aber trotzdem für jedes Buch einen Verlag festlegen kann. Wie Sie später sehen werden, geht damit auch bei der Dateneingabe ein gewisser Komfort einher: Sie müssen dann nämlich nicht mehr selbst tippen, sondern können mit einem Kombinationsfeld einen der Verlage auswählen, wenn dieser schon vorhanden ist.

Damit keine Redundanzen mehr auftreten, legen Sie außerdem einen sogenannten eindeutigen Index auf das Feld Verlag der Verlagstabelle. Access stellt so sicher, dass der Benutzer keinen Verlag mehr doppelt eintragen kann.

Im Tabellenentwurf sieht das wie in Abb. 2 aus. Den eindeutigen Index auf das Verlag-Feld legen Sie entweder über den Indizes-Dialog an, indem Sie dort einen neuen Eintrag mit einem Namen wie etwa UniqueKey hinzufügen und seine Eigenschaft Eindeutig auf Ja einstellen oder direkt im Datenentwurf die Eigenschaft Indiziert des Feldes Verlag auf Ja (Ohne Duplikate) festlegen.

pic002.tif

Abb. 2: Verlagstabelle mit eindeutigem Verlag-Feld

Vom Buch zum Verlag

Fehlt noch das passende Feld in der Bücher-Tabelle. Dieses nennen Sie nicht mehr Verlag wie in Abb. 1, sondern VerlagID. Und das Feld soll auch nicht mehr den Datentyp Text, sondern Zahl besitzen. Auf diese Weise erkennen Sie schnell, dass sich dahinter eine Verknüpfung zu einer anderen Tabelle befindet. Wobei es diese Verknüpfung ja noch gar nicht gibt: Bisher haben Sie nur ein Feld, in das Sie eine Zahl eintragen, die möglichst dem Wert des Feldes ID eines der Datensätze der Tabelle tblVerlage entspricht.

Sie sollten aber noch festlegen, dass der Benutzer dort ausschließlich IDs aus der Verlagstabelle eintragen darf. Sonst kann dieser dort nämlich beliebige Zahlen unterbringen, auch wenn diese gar keine Entsprechung im Feld ID der Tabelle tblVerlage aufweisen. Dies erledigen Sie über das Beziehungen-Fenster. Dort öffnen Sie über den Kontextmenüeintrag Tabelle anzeigen den gleichnamigen Dialog und klicken doppelt auf die beiden Tabellen tblBuecher und tblVerlage, damit diese im Beziehungen-Fenster landen (s. Abb. 3).

pic003.tif

Abb. 3: Hinzufügen von Tabellen zum Beziehungen-Fenster ...

Eine Beziehung besteht deshalb noch nicht. Die fügen Sie hinzu, indem Sie das Feld, das zur Auswahl der Daten aus der anderen Tabelle dienen soll, auf das Feld dieser Tabelle ziehen, mit dem die Verknüpfung erzeugt werden soll - hier also das Feld ID (s. Abb. 4).

Sie haben nun eine 1:n-Beziehung hergestellt, mit der Sie einen Verlag beliebigen Büchern zuweisen können, aber jedem Buch nur einen Verlag. Das Feld VerlagID dient dabei als Fremdschlüsselfeld, das Feld ID der Tabelle tblVerlage als Primärschlüsselfeld der Beziehung. Damit das Feld VerlagID aber auch ausschließlich die in der Tabelle tblVerlage gespeicherten IDs annehmen kann, müssen Sie noch die Eigenschaften der Beziehung anpassen. Dazu klicken Sie einfach doppelt auf den Beziehungspfeil, was den Dialog aus Abb. 4 hervorruft. Der dort markierte Bereich zeigt die betroffenen Eigenschaften. Die Option Mit referentieller Integrität sorgt dafür, dass Access meckert, wenn man einen Wert in das Feld VerlagID einträgt, der nicht im Feld ID der Tabelle tblVerlage enthalten ist, und das Einfügen unterbindet.

pic004.tif

Abb. 4: ... und Anlegen einer Verknüpfung

Sie könnten hier noch weitere Optionen für die Beziehung aktivieren, von denen die erste aber hier keine Rolle spielt: Die Aktualisierungsweitergabe sorgt dafür, dass die Einträge in VerlagID angepasst werden, wenn sich die Werte des Feldes ID in tblVerlage ändern, was aber normalerweise nicht passieren sollte.

Die Löschweitergabe hingegen ist interessant: Wenn man diese Option aktiviert und einen Verlag aus der Tabelle tblVerlage löscht, dann werden auch alle Bücher gelöscht, die von diesem Verlag veröffentlicht wurden. Über den Sinn oder Unsinn dieser Einstellung kann man trefflich streiten: Sollte ein Buch nicht in der Datenbank verbleiben, wenn sein Verlag gelöscht wird? Und wenn ja, wie geht man mit Büchern um, die keinen Verlag haben? Vielleicht sollte man einfach davon ausgehen, dass niemand einen Verlag aus der Tabelle löscht, außer dieser ist - zusammen mit seinem Buch - fälschlicherweise angelegt worden.

Ob man die Löschweitergabe aktiviert, ist also von Fall zu Fall zu entscheiden. Wichtig ist zu wissen, dass immer die Datensätze aus der Tabelle, die den Primärschlüssel der Beziehung liefert, den Löschvorgang anstoßen müssen, und nicht andersherum.

Autoren

Wie hilft uns die obige Vorgehensweise nun bei den Autoren weiter? Falls ein Buch nur einen einzigen Autor hätte, könnte man genau so wie oben vorgehen. Eine 1:n-Beziehung, wie sie dort realisiert wurde, würde völlig ausreichen. Allerdings kann ein Buch auch mal mehr als einen Autor haben. Was dann - vielleicht mehrere Verknüpfungsfelder anlegen, in die man jeweils die ID eines der beteiligten Autoren einträgt (s. Abb. 5)? Oder vielleicht kann man auch Kombinationen von Autoren in der Autorentabelle unterbringen, also beispielsweise einen Datensatz mit dem Autor Sascha Trowitzsch, André Minhorst? Als erfahrener Datenbankentwickler werden Sie über diese Vorschläge schmunzeln, aber die Realität zeigt, dass solche Varianten durchaus vorkommen.

pic005.tif

Abb. 5: Diese Konstellation schreit nach einer m:n-Beziehung

Sinnvoll sind diese natürlich nicht: Die Variante mit mehreren Feldern zum Speichern der Autoren in der Bücher-Tabelle oder auch nur zum Speichern der IDs der in einer verknüpften Tabelle gespeicherten Autoren kostet erstmal Speicherplatz, weil nicht alle Felder für alle Buch-Datensätze belegt sein werden. Zweitens kann man so nicht ohne größeren Aufwand prüfen, ob derselbe Autor nicht zweimal dem gleichen Buch zugewiesen wurde. Drittens ist es schwer, die richtige Anzahl der benötigten Felder abzuschätzen: Wer kann schon garantieren, dass fünf Felder für die Angabe von Autoren ausreichen?

Auch die Variante zum Speichern eines oder mehrerer Autorennamen in einem einzigen Textfeld ist problematisch, da sie Redundanzen mit sich bringen kann. Dabei tritt dann ein Autor einmal als Einzelautor auf und einmal zusammen mit einem weiteren Autor. Schreibt man den Namen doppelt vorkommender Autoren dann nicht immer gleich, tritt die bereits oben beschriebene Inkonsistenz ein.

m:n-Beziehung

Die Lösung für die Zuordnung von Autoren zu Büchern liegt in zwei Tabellen, von denen die eine, bereits bekannte, alle Bücher enthält und die zweite alle Autoren. Nun fügt man aber nicht der Büchertabelle ein oder mehrere Felder zur Zuweisung von Autoren hinzu, sondern man arbeitet mit einer völlig neuen Tabelle. Und die besitzt im Wesentlichen zwei Felder des Datentyps Zahl, in die man alle gewünschten Kombinationen von Büchern und Autoren einträgt - jeweils eine Kombination pro Datensatz.

Sie können also in dieser Tabelle jeweils ein Buch auswählen - und einen Autor. Wenn Ihnen das bekannt vorkommt, liegen Sie richtig: Diese Beziehungen entsprechen prinzipiell genau der 1:n-Beziehung, die wir weiter oben zwischen Büchern und Verlagen hergestellt haben.

Durch die Kombination dieser beiden Verknüpfungen in einer Tabelle erzeugen Sie eine m:n-Beziehung zwischen den beiden Tabellen tblBuecher und tblAutoren. Voraussetzung dafür ist, dass sich das Fremdschlüsselfeld, also das Feld zum Festlegen des Primärschlüsselfelds der jeweils anderen Tabelle, beider 1:n-Beziehungen in derselben Tabelle befindet, der sogenannten Verknüpfungstabelle.

Zum Herstellen dieser Beziehung legt man zunächst die Verknüpfungstabelle tblBuecherAutoren mit drei Feldern an: einem Primärschlüsselfeld namens ID und zwei Fremdschlüsselfeldern namens BuchID und AutorID. Die Beziehung erzeugen Sie wiederum im Beziehungen-Fenster durch das Ziehen der Primärschlüsselfelder auf die Fremdschlüsselder der beteiligten Tabellen (s. Abb. 6). Außerdem legen Sie für die beiden Beziehungen Löschweitergabe fest, damit beim Löschen eines Buchs oder Autors auch der entsprechende Datensatz in der Verknüpfungstabelle gelöscht wird.

pic006.tif

Abb. 6: Anlegen einer m:n-Beziehung über zwei 1:n-Beziehungen

Zusammengesetzter eindeutiger Schlüssel

In den meisten Fällen soll jede Kombination der Datensätze der beiden verknüpften Tabellen nur einmal vorkommen. So auch hier: Jedes Buch soll jedem Autor nur einmal zugeordnet werden können und umgekehrt. Auch hierfür kann man eine Regel verankern. Das Stichwort lautet "zusammengesetzter eindeutiger Schlüssel". Einen einfachen eindeutigen Schlüssel haben wir bereits weiter oben für das Feld Verlag der Tabelle tblVerlage eingerichtet. Diesmal sollen zwei Felder daran beteiligt sein, was sich ausschließlich im Indizes-Dialog der Entwurfsansicht der Verknüpfungstabelle realisieren lässt. Hier legen Sie wiederum einen neuen Index an, dem Sie zunächst das Feld BuchID hinzufügen. Den zweiten Teilnehmer des zusammengesetzten Schlüssels wählen Sie einfach in der leeren Zeile direkt unterhalb der ersten Zeile dieses Indexes aus (s. Abb. 7).

pic007.tif

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Verwandte Beiträge:

Amazon Webservices per VBA nutzen

Bilder on the fly

m:n-Beziehung per Kontrollkästchen verwalten

Access 2007: Bilder und Schaltflächen

Indizierung mit Access

Google Earth ferngesteuert, Teil II

Bilder skalieren

Daten aus verknüpften Tabellen kopieren

© 2003-2015 André Minhorst Alle Rechte vorbehalten.