Komplexe Datenbanken


Die bisher von uns mit MySQL erstellten Datenbanken bestanden immer aus einer Tabelle, in der sämtliche Daten der Datenbank gespeichert waren. Wie wir bei der Problematik Normalisierung von Datenbanktabellen erfahren haben, stellt dies in der Praxis aber eher die Ausnahme als die Regel dar. Wird die einzelne Tabelle zu komplex empfiehlt es sich, wegen Redundanz- und Konsistenzproblemen, Daten in neue Tabellen auszulagern.

Dafür spricht vor allem der folgende Aspekt: Nehmen wir einmal an, dass ein Leser aus unserem Einstiegsbeispiel Bibliothek (siehe db-systeme.htm) mehr als nur ein Buch ausleihen möchte. Dann müsste immer dann wenn ein neues Buch ausgeliehen wird, ein vollständiger neuer Datensatz angelegt werden. Dieser enthält dann jedoch auch Informationen zum Leser selbst, die bereits bei der ersten Ausleihe erfasst worden sind. Hier würden Daten redundant erfasst werden. Dies gilt es jedoch nach Möglichkeit zu vermeiden. Einerseits kann es bei Änderungen zu den persönlichen Angaben zu Inkonsistenzen im Datenbestand führen, wenn man eine oder mehrere Änderungen vorzunehmen vergisst. Andererseits würde man durch die Mehrfacherfassung der Daten auch schlicht und einfach Speicherplatz verschwenden, den man teuer erkaufen muss. Siehe dazu die beiden nachfolgenden Beispiele:

[nach oben]

Wenn man nun einen Teil der Daten in neue Tabellen auslagern möchte, müssen Beziehungen zwischen den einzelnen Tabellen hergestellt werden. Es muss z.B. erkennbar sein, welches Buch von welchem Leser ausgeliehen wurde. Diese Beziehungen werden über die in den Tabellen vereinbarten Schlüssel realisiert.

Außerdem ist es notwendig, dass man sich schon vor dem Erstellen einer solchen komplexen Datenbank ausführlich Gedanken über die Struktur der zu erstellenden Datenbank macht. Dafür entwickelte der Informatiker Peter Chen im Jahr 1973 das sogenannte Entity - Relationship - Modell. Dieses Werkzeug zur Modellierung von Datenbanken hat sich international durchgesetzt.

  1. Überdenken Sie den Ausleihvorgang für die Bücher in unserer Bibliothek (siehe db-systeme.htm) neu. Erfasst werden sollen sowohl die Leser unserer Bibliothek mit Name, Vorname, Anschrift, PLZ, Ort und Geburtsdatum als auch die auszuleihenden Bücher mit Titel, ISBN-Nr und Autoren. Da ein Buch in der Bibliothek auch mehrfach vorhanden sein kann, wird ein Buch durch seine Inventarnummer eindeutig charakterisiert. Für den Ausleihvorgang sind das Ausleih- und das Rückgabedatum zu erfassen.

    1. Entwerfen Sie zunächst ein ER-Diagramm, das den Ausleihvorgang für unsere Bibliothek modelliert!
    2. Entwickeln Sie aus dem ER-Diagramm ein relationales Modell mit allen zu verwendenden Schlüsseln und Attributen!
    3. Bevor wir unsere Datenbank erstellen, müssen wir uns zunächst etwas mit möglichen Formaten von Datenbanktabellen beschäftigen, die das DBMS MYSQL anbietet. In älteren Versionen wurde standardmäßig das Tabellenformat MYISAM (siehe hierzu http://de.wikipedia.org/wiki/MyISAM) verwendet. Dieses Format unterstützt jedoch keine Transaktionen (siehe http://de.wikipedia.org/wiki/Transaktion_(Informatik)) und auch keine referenzielle Integrität über Fremdschlüssel (siehe http://de.wikipedia.org/wiki/Referenzielle_Integrität), die jedoch gerade beim Einsatz komplexer Datenbanken ein ganz wichtiges Feature darstellen. Da wir für unsere verknüpften Tabellen aber referenzielle Integrität fordern wollen, müssen wir das Tabellenformat InnoDB (http://de.wikipedia.org/wiki/InnoDB) verwenden. Ab Version 5.5 sollte MYISAM dieses Tabellenformat standardmäßig verwenden. InnoDB unterstützt ebenfalls Row level locking, welches im Falle eines Schreibzugriffes auf einen Datensatz diesen für andere Transaktionen solange sperrt, bis dieser abgeschlossen ist.
      Überprüfen Sie dementsprechend, ob auf Ihrem System das Tabellenformat InnoDB aktiviert ist (siehe Abbildung).
    4. Wir wollen nun gemeinsam das entwickelte Modell unserer Datenbank mit Hilfe von MySQL umsetzen. Legen Sie dazu zunächst die benötigten Tabellen Leser, Ausleihe und Buch samt der erforderlichen Datenfelder an! Wählen Sie als Tabellenformat jeweils InnoDB. Legen Sie die Primärschlüssel der Tabellen Leser und Buch fest.

      Zu Festlegung der Fremdschlüssel müssen diese in der Tabelle Ausleihe indiziert werden.

      Indizes festlegen
    5. Jetzt füllen wir unsere neuen Tabellen mit einigen Daten. Importieren Sie dazu die Daten aus den folgenden CSV-Dateien: Leserdaten, Buecherdaten und Ausleihdaten.
    6. Nun folgt der schwierigste Teil. Wir müssen jeweils eine 1 : n - Beziehung zwischen den entsprechenden Tabellen herstellen. Dabei zeigt der Fremdschlüssel der n-Relation auf den Primärschlüssel der 1-Relation.

      Wählen Sie dazu den Reiter Designer in der Datenbanksicht.

      phpMyAdmin-Designer

      Anschließend zieht man mit der Maus den Schlüssel der einen Tabelle auf den Schlüssel der anderen Tabelle, die miteinander verknüpft werden sollen.

      Herstellen der Beziehungen

      Kontrollieren Sie anschließend den Erfolg Ihrer Aktion in der Beziehungsübersicht der Tabelle Ausleihe.

      Beziehungsuebersicht

      Die im Designer erstellten Beziehungen sollten nun zu sehen sein.

      Kontrolle der Beziehungen

      Legen Sie nun in der Beziehungsübersicht der Tabellen Leser den Namen und in der Tabelle Buch den Titel als anzuzeigende Spalten fest.

      anzuzeigende Spalte festlegen

      Wir sollten unbedingt auch die referenzielle Integrität für die festgelegten Beziehungen testen. Darunter versteht man, dass für jeden Wert eines Datenfeldes, das als Fremdschlüssel definiert ist, ein entsprechender Wert in der damit verbundenen Tabelle vorhanden sein muss. Es darf also z.B. nicht vorkommen, dass in der Tabelle Ausleihe ein Leser angegeben ist, der in der Tabelle Leser nicht existiert. Das DBMS hat dabei folgende zwei Aufgaben zu erfüllen:

      • Wird in der Tabelle Ausleihe ein neuer Datensatz eingefügt, dann muss sichergestellt werden, dass für den Wert in LeserNr ein Datensatz in der Tabelle Leser vorhanden ist.
      • Wird in der Tabelle Leser ein Datensatz gelöscht, dann muss das DBMS prüfen, ob es in der Tabelle Ausleihe Einträge gibt, die auf diesen Datensatz verweisen.

      Probieren Sie nun die referenzielle Integrität aus, indem Sie, wie oben beschrieben, in der Tabelle Ausleihe einen neuen Datensatz mit einer nicht existenten LeserNr bzw. ein Buch mit einer nicht existenten InvNr einfügen. Das DBMS wird die Operation verweigern. Versuchen Sie anschließend, den Datensatz für einen Leser zu löschen, der ein Buch ausgeliehen hat. Auch diese Operation wird das DBMS verweigern (siehe Fehlermeldung).

      SQL-Fehlermeldung

    Vergleichen Sie abschließend ihre Modelle und ihre DB mit der Musterlösung.

    [nach oben]
  2. sinngemäß entnommen aus: Lehr- und Übungsbuch Informatik, Fachbuchverlag Leipzig

    Die Mitarbeiter eines Projektierungsbüros bearbeiten Projekte für gewisse Firmen. An einem Projekt arbeiten in der Regel mehrere Mitarbeiter. Ein Mitarbeiter kann auch gleichzeitig an mehreren Projekten mitwirken. Von den Firmen sind zu erfassen der Firmenname und der Ort des Firmensitzes. Zur eindeutigen Identifizierung bekommt jede Firma eine Nummer. Von den Mitarbeitern sind zu erfassen die Mitarbeiternummer, Name, Vorname, Geburtsdatum und Gehalt. Ein Projekt wird beschrieben durch die Projektnummer, den Projektnamen, die Personalnummer des Projektleiters, und den Fertigstellungstermin.

    1. Entwerfen Sie zunächst ein ER-Modell für die Datenbank Projektierungsbüro! Geben Sie die Kardinalität der Beziehungen zwischen den Entity-Sets an!
    2. Entwickeln Sie ausgehend von Ihrem ER-Modell ein relationales Modell mit allen Attributen und Schlüsseln!
    3. Setzen Sie nun Ihren Entwurf mit Hilfe von MySQL um!
    4. Importieren Sie die vorbereiteten Daten in Ihre Tabellen: Firmendaten, Projektdaten, Mitarbeiterdaten und MitProdaten.
    5. Stellen Sie die Beziehungen zwischen den Tabellen her! Richten Sie die Attribute FName, PName und Name als anzuzeigende Spalten ein! Testen Sie jeweils die referenzielle Integrität der eingerichteten Beziehungen!

    Vergleichen Sie abschließend ihre Modelle und ihre DB mit der Musterlösung.

    [nach oben]

zuletzt geändert am:
Eine Seite von Mirko Hans