Diplomarbeit Datenbank-Entwurf durch „Reverse Engineering“ von

Werbung
Diplomarbeit
Datenbank-Entwurf durch
„Reverse Engineering“ von
relationalen Datenbanken
Stefan Rollert
Matrikelnummer 1443941
Betreuer: Prof. Dr. Udo Lipeck
Institut für Informatik
Universität Hannover
Februar 1996
- ii -
Zusammenfassung
In den letzten Jahren haben sich in allen Bereichen, in denen größere Datenmengen gespeichert werden
müssen, „relationale Datenbanksysteme“ durchgesetzt. Grundlage des Entwurfes einer relationalen
Datenbank ist meist ein „(erweitertes) Entity-Relationship-Schema“ (EER-Schema). Mit Hilfe von
Werkzeugen zum Datenbank-Entwurf läßt sich ein EER-Schema in ein Relationenschema umsetzen.
Da sich im Laufe ihrer Existenz die Anforderungen an eine Datenbank ändern, erfährt die relationale
Struktur typischerweise zahlreiche Korrekturen, die das Relationenschema unverständlich werden
lassen. An dieser Stelle wäre es hilfreich, aus einem relationalen Datenbank-Schema das zugehörige
EER-Schema zurückzugewinnen.
Für diese Art von „Reverse Engineering“ lassen sich bereits einige Verfahren in der Literatur finden.
Dabei erweist sich das Verfahren von Chiang / Barron / Storey als das leistungsfähigste, weil bei diesem
Algorithmus mehr strukturelle Eigenschaften aus dem Relationenschema wiedergewonnen werden als
bei anderen Verfahren. Jedoch werden Kardinalitäten von Beziehungen, bestimmte Beziehungsarten
und einige weitere Strukturen nicht erkannt. Ziel dieser Arbeit ist daher, auf Basis des Verfahrens von
Chiang einen Algorithmus zu entwickeln, der über Anfragen versucht, weitere Informationen über die
relationale Struktur einer Datenbank zu gewinnen. Alle Tabellen und ihre Attribute werden bei diesem
Verfahren bestimmten Entity- bzw. Beziehungs- Klassen zugeordnet und in Objekte eines EER-Schemas
umgesetzt.
- iii -
Das zu diesem Algorithmus in der Programmiersprache „C“ entwickelte Programm liest ein Schema aus
einer Oracle-Datenbank. Zu den Informationen über Tabellen, die aus dem Oracle-Data-Dictionary
gewonnen werden, kann der Anwender zusätzliche Schlüsselkandidaten und Fremdschlüssel bestimmen.
Durch Datenbank-Anfragen werden die Vermutungen des Benutzers überprüft und gegebenenfalls
zurückgewiesen.
Das auf diese Weise gewonnene Relationenschema kann mit Hilfe des entwickelten Verfahrens in ein
EER-Schema umgesetzt, aber auch mit anderen Tools weiterverarbeitet werden.
Zur Überprüfung des Verfahrens wird eine Fallstudie angefertigt, die einen Ausschnitt der relationalen
Studenten-Datenbank der Hochschul-Informations-Systeme GmbH (HIS) in ein EER-Schema umsetzt.
- iv -
Inhaltsverzeichnis
ZUSAMMENFASSUNG ..................................................................................... ii
1 EINLEITUNG.................................................. Fehler! Textmarke nicht definiert.
2 GRUNDLAGEN ................................................................................................4
2.1 WOZU DIENT „REVERSE ENGINEERING“ ? ...........................................................4
2.2 WAS MUß EIN RE-ALGORITHMUS TUN ? ..............................................................5
2.3 WELCHE OBJEKTE ENTHÄLT DAS ZIELMODELL ?..................................................5
2.4 WIE IST DAS QUELLMODELL AUFGEBAUT ?........................................................10
2.5 WIE KANN DIE QUALITÄT EINES SCHEMAS BEWERTET WERDEN ? .......................12
2.6 WIE WIRD EIN EER-SCHEMA IN EIN RELATIONENSCHEMA UMGESETZT ?............13
2.7 WELCHE VERFAHREN ZUM „REVERSE ENGINEERING“ WURDEN BEREITS
VERÖFFENTLICHT ?......................................................................................19
2.8 WIE SIND DIE VERFAHREN ZU BEWERTEN ? .......................................................20
2.9 AUF WELCHE WEISE SETZEN DIE ALGORITHMEN EIN RELATIONENSCHEMA IN
„IHR“ ZIELMODELL UM ?..............................................................................20
2.10 WIE ARBEITET DER ALGORITHMUS VON CHIANG ?...........................................21
2.11 WAS MACHT CHIANGS VERFAHREN AUS DER HIS-DB ? ..................................26
2.12 WELCHE PROBLEME TRETEN BEI CHIANG AUF ?...............................................32
2.13 WIE ARBEITEN DIE ANDEREN ALGORITHMEN ? ................................................35
3 LÖSUNGSANSATZ ........................................................................................41
3.1 ERMITTELN VON PRIMÄR- UND FREMDSCHLÜSSELN..........................................42
3.2 KLASSIFIKATION DER RELATIONEN UND ATTRIBUTE..........................................45
-v-
3.3 ERZEUGUNG EINES (E)ER-SCHEMAS ................................................................49
3.3.1 Starke Entity-Relationen ..........................................................................50
3.3.2 Besondere Entity-Relationen ....................................................................51
3.3.3 Schwache Entity-Relationen .....................................................................51
3.3.4 Spezielle Beziehungs-Relationen ..............................................................52
3.3.5 Reguläre Beziehungsrelationen ................................................................54
3.3.6 Sonderfall bei Beziehungsrelationen ........................................................55
3.3.7 Fremdschlüssel-Beziehungen....................................................................56
3.3.8 Aggregationen..........................................................................................57
3.3.9 Fremdschlüssel besonderer Entity-Relationen ..........................................58
3.3.10 Kardinalitäten........................................................................................61
3.4 BEWERTUNG DES EIGENEN VERFAHRENS ..........................................................66
4 ALGORITHMUS UND CODIERUNG ..........................................................73
4.1 MARKOWITZ-TOOLS ........................................................................................74
4.2 PROGRAMMENTWICKLUNG ...............................................................................75
4.2.1 ora2rel.....................................................................................................78
4.2.2 rel2pre .....................................................................................................88
4.2.3 Übrige Programme ..................................................................................97
4.3 FALLSTUDIE: UMSETZUNG EINER STUDENTEN-DATENBANK ..............................98
4.3.1 Vorbereitung ............................................................................................98
4.3.2 Programmstart.......................................................................................100
4.3.3 Relationenschema erstellen ....................................................................101
4.3.4 Umsetzung des Relationenschemas in ein PRE-Schema..........................112
4.3.5 Umwandlung in ein SDT-Schema ...........................................................116
4.3.6 Vergleich der erzeugten SDT-Schemata..................................................118
4.3.7 Grafische Ausgabe des Schemas.............................................................120
4.4 BEWERTUNG DER RESULTATE .........................................................................127
4.5 FOLGERUNGEN FÜR DAS RELATIONENSCHEMA ................................................129
4.6 VERGLEICH MIT CHIANGS VERFAHREN ...........................................................130
4.7 S-DESIGNOR PROFESSIONAL...........................................................................131
- vi -
5 AUSBLICK....................................................................................................134
GLOSSAR.........................................................................................................137
LITERATURHINWEISE.................................................................................139
ANHANG..........................................................................................................141
ANHANG A: FORMATE.........................................................................................141
a Relationen-Format.......................................................................................141
b PRE-Format ................................................................................................142
c SDT-Format.................................................................................................143
ANHANG B: BENUTZERHANDBUCH ......................................................................144
a Programmquellen ........................................................................................144
b Systemvoraussetzungen ................................................................................144
c Installation...................................................................................................145
d Benutzung ....................................................................................................146
e Fehlermeldungen / Warnungen.....................................................................149
ANHANG C: UMSETZUNG EINER LITERATUR-DATENBANK ....................................151
ANHANG D: BEISPIEL-INSTANZEN DER TEST-DATENBANK ...................................156
ANHANG E: PROGRAMMQUELLEN .......................................................................158
a eingabe.h .....................................................................................................158
b eingabe.c .....................................................................................................159
c menu.h .........................................................................................................162
d menu.c .........................................................................................................163
e ora2rel.pc ....................................................................................................166
f rel2pre.c .......................................................................................................185
g haupt.c.........................................................................................................198
h pre2sdt.sed...................................................................................................201
i crschema.sql .................................................................................................201
-7-
-1-
1 Einleitung
In den vergangenen Jahren haben sich in allen Bereichen, wo größere Datenmengen
gespeichert werden müssen, die sogenannten „relationalen Datenbanken“ durchgesetzt
und alte Modelle wie z.B. das Netzwerkmodell abgelöst. Heute trifft man auf allen
Betriebssystemen fast ausschließlich auf Datenbanksysteme, die ihre Daten in Form von
Tabellen speichern. Dies gilt nicht nur für den professionellen Bereich - auch im
Heimbereich haben die relationalen Datenbanksysteme ihren Einzug gehalten.
Grundlage für den Entwurf einer relationalen Datenbankstruktur bildet heute das
sogenannte „Entity-Relationship-Modell“, in dem die zu speichernden Daten und ihre
Beziehungen zueinander grafisch dargestellt werden. Algorithmen wurden entwickelt, die
ein so entstandenes ER-Schema in die Tabellenstruktur einer relationalen Datenbank
übertragen. Der Vorteil eines solchen systematischen Vorgehens ist die einfache und
leicht änderbare Struktur und die anwendungsnahe Semantik, die eine auf diese Weise
erzeugte Datenbank erhält.
Ist hingegen bereits eine Datenbank oder ein Dateisystem vorhanden, die in das
Relationenmodell umgesetzt werden soll, so sparen sich die meisten Entwickler den
„Umweg“ über ein (E)ER-Modell und übertragen die Daten einfach in eine
Tabellenstruktur. Vielfach wissen die Entwickler überhaupt nicht, welche Daten sich
hinter den einzelnen Attributen einer Datenbank verbergen, wenn z.B. die Entwickler der
„Ur-“Datenbank nicht mehr „verfügbar“ sind. Die Folge ist, daß das relationale System
unübersichtlich wird und nicht mehr klar erkennbar ist, in welcher Form die Daten in der
Datenbank abgelegt werden. Eine Änderung der Struktur oder ein Übertragen der Daten
in ein neues Modell (beispielsweise ein objektorientiertes Modell) wird auf diese Weise
immer schwieriger.
Die gleichen Probleme treten auf, wenn sich die Anforderungen an ein
Datenbanksystem im Laufe der Zeit ändern. Die Entwickler stehen häufig unter
Zeitdruck, so daß ein Modellieren der neuen Anforderungen ausbleibt und z.B. Attribute
einfach in die bestehende Datenbank eingefügt werden.
-2-
„Reverse Engineering“ (RE) von einer relationalen Datenbank bezeichnet den
Vorgang, aus einer Tabellenstruktur ein (E)ER-Schema zu entwickeln. Das Ergebnis
eines solchen Vorgangs ist ein aussagekräftiges Modell der Datenbankstruktur, die es
auch einem Außenstehenden ermöglicht, die Inhalte der Daten zu verstehen und das
Schema gegebenenfalls zu rekonstruieren. Häufig ist ein so gewonnenes (E)ER-Schema
sogar besser als das originale Entwurfsschema, weil sich die Anforderungen nach dem
ersten Datenbankentwurf geändert und verschiedene Entwickler die Tabellenstruktur
bearbeitet haben können.
Der Begriff „Reverse Engineering“ stammt ursprünglich aus der HardwareEntwicklung, wo versucht wird herauszufinden, wie Systeme anderer Unternehmen
funktionieren. Bei Software-Systemen wird hingegen meist untersucht, wie das eigene
System läuft. Hier ist Ziel des Reverse Engineering-Prozesses, Software-Komponenten
zu identifizieren und ihre Beziehungen untereinander zu ermitteln. Auch die Analyse der
Anforderungen an ein solches Software-System ist Aufgabe des Reverse Engineering.
Alte Systeme (in der englischsprachigen Literatur tritt häufig der Begriff „legacy
systems“ auf) werden in der Realität immer wieder geändert und erweitert, obwohl der
Entwickler nicht alle Funktionen des Systems verstanden hat. Hier wird Reverse
Engineering dazu benutzt, Algorithmen zu verstehen und Programmteile eventuell
wiederzuverwenden. Im Programm implementierte Unternehmens-Regeln, die nur im
System präzise definiert und sonst schlecht dokumentiert wurden, können so aufgespürt
und Mängel erkannt werden.
Aus denselben Gründen wird Reverse Engineering auch bei Datenbanken
angewendet. Besonders bei Portierung einer Datenbank auf eine andere Plattform ist die
Anwendung eines Reverse Engineering-Verfahrens sinnvoll.
Ziel dieser Arbeit ist, einen Algorithmus zu entwerfen, mit dem man aus einer
Menge von Relationen ein bezüglich der Entwurfskriterien „gutes“ (E)ER-Schema
erstellen kann. Dazu werden die in der Literatur beschriebenen Verfahren verglichen und
bewertet (siehe Kapitel 2). Im Anschluß daran soll ein eigener Algorithmus entwickelt
werden, der mit möglichst wenigen Eingaben des Anwenders auskommt (Kapitel 3,4).
-3-
An dieser Stelle möchte ich mich bei Herrn Prof. Dr. Udo W. Lipeck für die gute
Betreuung während der letzten sechs Monate bedanken. Seine Anregungen und Hinweise
haben mir bei Bearbeitung dieser Arbeit sehr geholfen.
Viele hilfreiche Diskussionen konnte ich auch mit Herrn Michael Gertz führen.
Vielen Dank dafür.
Kommentare zu Vorversionen dieser Arbeit habe ich außerdem von Claudia
Wehrhahn und Patricia Giesemann erhalten. Auch für ihre Hilfe bin ich dankbar.
-4-
2 Grundlagen
2.1 Wozu dient „Reverse Engineering“ ?
Es gibt verschiedene Gründe, eine vorhandene relationale Datenbank in ein ER-Schema
zu übersetzen. Die grafische Darstellung einer Datenbank-Struktur ist leicht zu verstehen
und hat eine anwendungsnahe Semantik. Ein ER-Diagramm ist dadurch aussagekräftiger
und einfacher zu ändern als eine relationale Datenbankstruktur. So können zum Beispiel
unnötige Tabellen-Attribute oder Redundanzen (mehrfache Speicherung derselben
Daten) entfernt und Inkonsistenzen in der Struktur leichter aufgefunden werden. Zum
anderen kann eine Umsetzung in ein grafisches Modell Dokumentationszwecke erfüllen.
Die genannten Änderungen werden erforderlich, wenn sich Anforderungen an eine
Datenbank im Laufe der Zeit ändern. Der Wunsch, Programme beim ersten Mal perfekt
zu erstellen, ist deshalb nicht zu erfüllen. RE versucht, aus den vorhandenen Relationen
die Aufgaben des Systems abzuleiten. Manchmal ist es allerdings sehr schwierig, ein
grafisches Modell zu produzieren, weil auch Datenbank-Experten die Regeln eines guten
Datenbankentwurfs verletzen.
Andererseits ermöglicht erst das grafische Schema eine Übersetzung der Datenbank
in andere Modelle. Aber auch der Wechsel von einem relationalen Datenbanksystem zu
einem anderen kann eine Umstrukturierung der Datenbank erfordern, wenn zum Beispiel
das Schema speziell für ein System optimiert wurde. Das ER-Modell ist unabhängig von
der physikalisch implementierten Datenbank.
-5-
altes Rel.Schema
ER-Schema
restrukturiertes
ER-Schema
neues Rel.Schema
Erweiterung
Dokumentation
objektorient.
Datenmodell
hierarchisches
Datenmodell
2.2 Was muß ein RE-Algorithmus tun ?
Im Grunde muß ein Reverse-Engineering-Algorithmus „nur“ den Prozeß des „Forward
Engineering“ (s.u.) aufheben und umkehren. Dazu sollten alle verfügbaren Informationen
ausgewertet werden: das Schema sowie die Daten. Zusätzliche Informationen, die ein
Anwender eingibt, können sehr hilfreich sein.
Weil die vorhandenen Informationen über die Datenbank meist nicht ausreichen, um
eine eindeutige Modellierungs-Entscheidung zu treffen, ist bei RE viel Kommunikation
mit dem Anwender erforderlich. Zum Beispiel ist oft nicht zu ermitteln, ob eine Relation
ein Entity oder eine Beziehung repräsentieren soll. Ebenso muß der Nutzer
Integritätsbedingungen eingeben, wenn diese in dem benutzten Datenbanksystem nicht
gespeichert werden.
2.3 Welche Objekte enthält das Zielmodell ?
Als Zielmodell des „Reverse Engineering“-Prozesses dient in der Literatur ein
„erweitertes Entity-Relationship (EER) Modell“. In diesem „semantischen“ Modell wird
die Realität auf hoher Abstraktionsebene repräsentiert, so daß es leicht zu verstehen und
interpretieren ist. Im Gegensatz dazu ist das Relationenmodell ein „logisches“ Modell,
das Daten in einer physikalisch leicht zu speichernden Form ablegt.
Es gibt zum Teil recht unterschiedliche Erweiterungen des Entity-Relationship
Modells. Auch in den Artikeln, die sich mit Reverse Engineering von relationalen
Datenbanken beschäftigen, sind Unterschiede im Zielmodell zu verzeichnen.
-6-
In der Vergangenheit hat sich aber das Modell von Batini/Ceri/Navathe [3] als ein
Quasi-Standard etabliert. Dieses EER-Modell wird auch am häufigsten von den Autoren
der betrachteten Artikel benutzt. Es soll deshalb an dieser Stelle näher erläutert werden.
Die Basis eines ER-Modells bilden die Klassen Entities, Beziehungen und Attribute:
Entities repräsentieren Objekte der realen Welt. Gleichartige Objekte werden in
Entity-Typen wie z.B. „Student“ oder „Professor“ zusammengefaßt. In grafischer
Notation werden Entity-Typen durch Rechtecke dargestellt.
Wie in der Literatur üblich soll im folgenden statt Entity-Typ einfach Entity
geschrieben werden. Muß zwischen Entity und Entity-Typ unterschieden werden, so
wird explizit darauf hingewiesen.
Beziehungen stellen Zusammenhänge zwischen zwei oder mehr Entities her. Der
Grad einer Beziehung ist gleich der Anzahl der teilnehmenden Entities. Am häufigsten
treten binäre Beziehungen, also Beziehungen vom Grad 2, auf. Zwischen „Student“ und
„Professor“ besteht zum Beispiel die Beziehung „wird betreut“, die im Modell als
Raute dargestellt wird.
Ein Ring ist eine binäre Beziehung, die ein Entity mit sich selbst verbindet. Ringe
werden oft auch als rekursive Beziehungen bezeichnet.
Die Kardinalität legt fest, an wievielen Beziehungs-Instanzen ein Entity teilnehmen
kann. Sie wird durch ein Paar ganzer Zahlen (Minimum, Maximum) angegeben. Ein N
bzw. M als Minimum bzw. Maximum bedeutet „beliebig viele“. Es gibt drei
grundlegende Kardinalitätsverhältnisse für binäre Beziehungen: 1:1, N:1 und N:M. Das
passende Verhältnis für eine Beziehung hängt von der Situation in der realen Welt ab, die
durch
die
Beziehung
modelliert
wird.
Auf
folgende
Art
kann
aus
dem
Kardinalitätsverhältnis einer Beziehung die Kardinalität ermittelt werden:
Kardinalitätsverhältnis
(Min,Max) von Entity 1
(Min,Max) von Entity 2
N:M
N:1
1:1
(0,N)
(0,1)
(0,1)
(0,M)
(0,N)
(0,1)
-7-
Die Beziehung „wird betreut“ ist zum Beispiel eine typische N:1-Beziehung, denn ein
Student kann nur von einem Professor betreut werden, ein Professor hingegen betreut in
der Regel mehrere Diplomarbeiten.
Student
(0,1)
wird betreut
(0,N)
Professor
Attribute enthalten die gespeicherten Daten von Entities und Beziehungen. Alle
externen Informationen werden in Attributen abgelegt. Attribute vom Entity „Student“
sind beispielsweise der Name und die Matrikelnummer des Studenten, die
folgendermaßen notiert werden:
Name
Student
Matrikelnr
oder
Matrikelnr, Name
Student
Batini/Ceri/Navathe erweitern dieses Modell um folgende Elemente:
Ein Entity-Typ E ist eine Generalisierung einer Gruppe von Entity-Typen E1,...,En,
wenn jedes Objekt der „speziellen“ Typen E1,...,En auch Objekt des „generellen“ EntityTyps E ist. So ist zum Beispiel der Entity-Typ „Person“ Vereinigung der Entity-Typen
„Mann“ und „Frau“. Da kein Objekt sowohl in „Mann“ als auch in „Frau“ stehen kann,
handelt es sich hierbei um eine exklusive Generalisierung. Im Gegensatz dazu ist es bei
einer überlappenden Generalisierung erlaubt, daß Objekte in mehr als einem Entity-Typ
Ei gespeichert werden. Außerdem wird zwischen totaler und partieller Generalisierung
unterschieden: Nur bei partieller Generalisierung ist es möglich, daß E Objekte enthält,
die in keinem Ei enthalten sind. Bei folgendem Beispiel handelt es sich also um eine totale
exklusive Generalisierung:
Person
Mann
Frau
-8-
Der Vorteil einer derartigen Generalisierung ist, daß Attribute, die in allen EntityTypen E1,...,En gespeichert werden, nur im generellen Entity-Typ E abgelegt werden
müssen und aus den speziellen Entity-Typen entfernt werden können. Zum Beispiel hat
jede „Person“ einen Namen, so daß das Attribut „Name“ nur in „Person“ stehen muß,
nicht jedoch in den Entity-Typen „Mann“ bzw. „Frau“.
Ein besonderer Fall einer Generalisierungs-Hierarchie ist die Spezialisierung. Hier
sind die Objekte in einem Entity-Typ einfache Untermenge der Objekte eines anderen
Entity-Typs. Nach obiger Bezeichnungsweise ist die Spezialisierung eine partielle
exklusive Generalisierung mit nur einem speziellen Entity-Typ.
Mitarbeiter
Manager
Einige Attribute fungieren als Schlüssel. Der Primärschlüssel dient dabei der
eindeutigen Identifikation eines Datentupels. Sei E ein Entity, A1,...,An Attribute von E.
Seien E1,...,Em weitere Entities mit Primärschlüssel P1,...,Pm, die mit E über binäre 1:1oder N:1-Beziehungen R1,...,Rm verbunden sind. Ein möglicher Primärschlüssel ist dann
die Menge P={A1,...,An,P1,...,Pm}, n≥0, m≥0, n+m≥1. Zu beachten ist dabei die Gefahr,
rekursive Primärschlüssel-Definitionen zu erhalten. Da eine solche Schlüssel-Definition
keinen Sinn macht, seien rekursive Primärschlüssel verboten. Als Primärschlüsselwert P
für ein bestimmtes Tupel e bezeichnet man die Zusammensetzung aller Werte der
Attribute Ai und alle Tupel der Entities Ej, die mit e in Beziehung stehen.
Ein Primärschlüssel P von E hat folgende Eigenschaften:
- Es kann nicht zwei Tupel von E mit demselben Primärschlüsselwert geben.
- Der Primärschlüssel ist in dieser Eigenschaft minimal, d.h. wenn wir ein beliebiges
Attribut Ai oder einen beliebigen Primärschlüssel Pj von Entity Ej aus dem
Primärschlüssel P entfernen, so gilt die erste Eigenschaft nicht mehr.
Es ist zu beachten, daß der Primärschlüssel keineswegs eindeutig sein muß. Es kann
zum Beispiel in einem Entity mehrere Schlüsselkandidaten geben, aus denen einer als
Primärschlüssel ausgewählt wird.
Eine Klassifikation der Schlüssel wird durch folgende Definitionen vorgenommen:
Ein Schlüssel heißt einfach, wenn n+m=1 gilt, bzw. zusammengesetzt, wenn n+m>1
ist. Er heißt intern für m=0, extern für n=0 oder gemischt für n>0 und m>0.
-9-
Mit diesen Definitionen können Entities in zwei Klassen unterteilt werden: Starke
Entities haben einen internen Primärschlüssel, der nur aus Attributen des Entities besteht.
Schwache Entities E hingegen können nicht eindeutig über ihre internen Attribute
identifiziert werden. Ihr Primärschlüssel besteht zum Teil aus Attributen anderer Entities
Ej, die Eigentümer genannt werden und mit E über binäre 1:1- oder N:1-Beziehungen
verbunden sind. Wenn m>1 ist, so hat E mehrere Eigentümer verschiedenen Typs.
Jedes Entity benötigt im Datenbankentwurf mindestens einen Primärschlüssel. Im
Datenbank-Schema werden Attribute, die zum Primärschlüssel gehören, unterstrichen.
Bei einem schwachen Entity E ist zu beachten, daß nicht nur die unterstrichenen internen
Attribute von E zu seinem Primärschlüssel gehören, sondern zusätzlich die
Primärschlüsselattribute der Eigentümer für eine eindeutige Identifikation der Tupel
notwendig sind. Die Eigentümer werden im Schema dadurch kenntlich gemacht, daß an
der (binären) Beziehung zu E ein senkrechter Strich steht.
Zum Beispiel seien die Entities „Abteilung“, „Projekt“ und „Mitarbeiter“ gegeben.
Einer Abteilung können dabei mehrere Projekte zugeordnet werden, die von jeder
Abteilung durchnumeriert werden. Ein Mitarbeiter wiederum kann immer nur an einem
Projekt arbeiten. Folgendes Schema bietet sich an:
Abteilung
(0,N)
betreut
(1,1)
Projekt
(1,N)
arbeitet
Projektnr, Projname
Abteilnr
(0,1)
Mitarbeiter
Name
Arbeiternr
Das starke Entity „Abteilung“ hat als Primärschlüssel das Attribut „Abteilnr“. Es
handelt sich hierbei also um einen einfachen internen Schlüssel. Analog dazu ist der
Primärschlüssel von „Mitarbeiter“ einfach und intern, das Entity ist deshalb stark.
„Projekt“ hingegen ist ein schwaches Entity, da sein Primärschlüssel aus dem Attribut
„Projektnr“ und dem Primärschlüssel des Entities „Abteilung“, also dem Attribut
„Abteilnr“, zusammengesetzt ist. Der Schlüssel von „Projekt“ ist damit gemischt und
zusammengesetzt, der einzige Eigentümer von „Projekt“ ist das Entity „Abteilung“, das
mit Entity „Projekt“ über die binäre 1:N-Beziehung „betreut“ verbunden ist.
Eine
Aggregation
ist
eine
Art
der
Abstraktion,
indem
eine
Anzahl
zusammenhängender Objekte zu einem abstrakten Entity zusammengefaßt werden.
Dadurch ist es möglich, daß eine Beziehung an einer anderen Beziehung teilnimmt, denn
- 10 -
ein abstraktes Entity kann genauso Bestandteil einer Beziehung sein wie ein anderes
Entity. Mit Hilfe der Ersetzung derartiger Teilschemata durch abstrakte Entity-Typen
können ER-Schemata übersichtlicher gestaltet werden, indem die einzelnen Bestandteile
einer solchen Aggregation separat modelliert werden.
Zum Beispiel kann in obigem Schema ein abstrakter Entity-Typ „Arbeitsplatz“ die
Entity-Typen „Abteilung“ und „Projekt“ sowie die Beziehung „betreut“ ersetzen. Es ist
leicht einzusehen, daß bei Ersetzung eines viel größeren Teilschemas das Diagramm an
Übersichtlichkeit gewinnt.
Abteilung
(0,N)
betreut
(1,1)
Projekt
(1,N)
arbeitet
(0,1)
Mitarbeiter
Arbeitsplatz
⇔
Arbeitsplatz
(1,N)
arbeitet
(0,1)
Mitarbeiter
2.4 Wie ist das Quellmodell aufgebaut ?
Als Quellmodell wird das relationale Datenmodell benutzt. Die Basis dieses Modells
bilden Tabellen, in denen verschiedene Attribute zusammengefaßt werden. Ein Tupel
einer solchen Relation ist eine Zeile der Tabelle, also die Sammlung von Werten jedes
Attributs. Schlüssel sind im Relationenmodell ähnlich definiert wie im EER-Modell: Ein
Schlüssel einer Relation ist eine Menge von Attributen dieser Relation, die ein Tupel
eindeutig identifizieren. Im Gegensatz zum EER-Modell sind hier ausschließlich interne
Schlüssel erlaubt.
Auch eine Relation kann mehrere Schlüsselkandidaten haben, von denen einer als
Primärschlüssel gewählt wird.
Beziehungen wie im ER-Modell gibt es im Relationenmodell nicht. Stattdessen
werden zur Repräsentation von Beziehungen Joins zwischen Attributen verschiedener
- 11 -
Tabellen benutzt. Dies bedeutet: Wenn die Tupel zweier Tabellen zueinander in
Beziehung stehen, dann müssen die Werte der Attribute, über denen der Join definiert ist,
übereinstimmen.
Auf einem Relationenschema werden weiterhin Integritätsbedingungen definiert, die
für alle Instanzen des Schemas gelten. Besonders drei Arten von Integritätsbedingungen
sollten beachtet werden:
Schlüssel-Bedingungen spezifizieren die Schlüsselkandidaten einer Relation. Die
Werte der Schlüsselkandidaten müssen für alle Tupel eindeutig sein.
Entity-Integritätsbedingungen legen fest, daß kein Wert eines Primärschlüssels leer
sein kann. Dies ist notwendig, weil der Wert des Primärschlüssels die Tupel der Relation
identifiziert.
Referentielle Integritätsbedingungen werden im Gegensatz zu den anderen beiden
genannten Bedingungsarten zwischen zwei Relationen definiert. Sie sind für die
Aufrechterhaltung der Konsistenz zwischen Tupeln zweier Tabellen verantwortlich und
besagen, daß die Tupel einer Relation, die mit einer anderen Relation in Beziehung steht,
auf bestehende Tupel in dieser Relation verweisen müssen.
Um diese referentiellen Integritätsbedingungen
Relationenschema
Fremdschlüssel
definiert.
Die
zu
speichern,
Bedingungen,
die
werden
zu
im
einem
Fremdschlüssel gehören, spezifizieren eine Integritätsbedingung zwischen den Relationen
R1 und R2. Eine Menge von Attributen FS aus Relation R1 definiert einen
Fremdschlüssel, wenn FS dieselben Daten wie der Primärschlüssel von R2 speichert.
Man sagt auch, daß FS auf Relation R2 verweist. Außerdem muß jeder Wert von FS
eines Tupels von R1 auch Wert des Primärschlüssels (PS) eines Tupels von R2 oder leer
sein. Es gilt also: ∀t:R1 ∃t′:R2 mit t.FS=t′.PS.
Oft müssen weitere (referentielle) Abhängigkeiten angegeben werden, um andere
Integritätsbedingungen zu repräsentieren, die durch die Definition von Fremdschlüsseln
nicht übernommen werden können. Sie werden durch sogenannte Inklusionen definiert:
Definition:
Seien R1,R2 Relationen, M und N eine Menge von Attributen
derselben Anzahl aus R1 bzw. R2. Dann sei: R1.M→R2.N :⇔ ∀t:R1 ∃t′:R2 mit t.M=t′.N
(Werte in R1.M sind Untermenge der Werte von R2.N)
- 12 -
Mit Hilfe dieser Definition können die Fremdschlüssel-Bedingungen auch wie folgt
geschrieben werden:
Definition:
Seien R1,R2 Relationen, FS und N eine Menge von Attributen
derselben Anzahl aus R1 bzw. R2. FS ist Fremdschlüssel von R1, wenn N Primärschlüssel
von R2 ist und R1.FS→R2.N gilt.
In den heute erhältlichen kommerziellen Datenbank-Management-Systemen sind
meist nicht alle diese Integritätsbedingungen definierbar. In diesem Fall muß sie der
Datenbank-Administrator gesondert notieren.
2.5 Wie kann die Qualität eines Schemas bewertet
werden ?
Um festzustellen, „wie gut“ ein Schema ist, müssen zunächst Kriterien festgelegt werden,
nach denen die Güte eines Schemas bewertet werden kann. Sieben Qualitätsmerkmale
werden von Batini/Ceri/Navathe [3] vorgeschlagen:
Vollständigkeit: Ein Schema wird vollständig genannt, wenn es alle relevanten
Merkmale des Anwendungsgebietes repräsentiert.
Korrektheit: Ein Schema heißt korrekt, wenn es geeignete Objekte des (E)ERModells benutzt. Dabei muß zwischen syntaktisch und semantisch korrekt unterschieden
werden. Ein Schema heißt syntaktisch korrekt, wenn die im Modell benutzten Objekte
richtig definiert werden. So ist zum Beispiel ein Schema, in dem Generalisierungen
zwischen
Beziehungen
verwendet
werden,
nicht
syntaktisch
korrekt,
denn
Generalisierungs-Hierarchien werden nur für Entities definiert. Semantisch korrekt nennt
man ein Schema, wenn seine Objekte (Entities, Beziehungen, usw.) gemäß ihrer
Definition benutzt werden. So ist zum Beispiel die Benutzung eines Attributes für die
Speicherung von Produkten semantisch falsch, wenn mehrere Produkt-Eigenschaften
(wie Bezeichnung, Preis, Lagerbestand, ...) in der Datenbank abgelegt werden sollen.
Stattdessen wäre das Anlegen eines Entities „Produkt“ semantisch korrekt.
Minimalität: Ein Schema ist minimal, wenn alle Aspekte der Anforderungen nur
einmal im Schema erscheinen, wenn also kein (E)ER-Objekt ohne Informationsverlust
aus dem Schema gelöscht werden kann.
- 13 -
Ausdrucksstärke: Ein Schema heißt ausdrucksvoll, wenn es alle Anforderungen in
natürlicher leicht verständlicher Weise repräsentiert, ohne weitergehende Erklärungen zu
benötigen.
Selbsterklärung: Ein Schema wird als selbsterklärend bezeichnet, wenn es
weitestgehend durch die Strukturen des Datenmodells modelliert wird und keine
Zusatzerklärungen benötigt.
Lesbarkeit: Dieses Qualitätsmerkmal, das ausschließlich das grafische Modell
betrifft, wird von unterschiedlichen Menschen auch sehr unterschiedlich bewertet. Wie
gut ein Modell lesbar ist, ist eine „persönliche Geschmacksfrage“. Allen Lesern
gemeinsam sind jedoch die Forderungen, daß sich im Modell möglichst wenige Objekte
und Verbindungen überschneiden und daß gleiche (E)ER-Objekte auch die gleiche
Darstellungs-Größe haben sollen.
Änderbarkeit: Ein Schema kann leicht geändert und an neue Anforderungen
angepaßt werden, wenn es sich in Teile (Module) zerlegen läßt.
Normalität: Dieses Qualitätsmerkmal stammt aus der Normalisierungs-Theorie des
relationalen Modells und steht etwas abseits der anderen Qualitätskriterien. Je höher die
im Schema geltende Normalform (erste bis fünfte bzw. Boyce-Codd) ist, desto besser ist
seine Qualität bezüglich dieses Merkmals. Das Ziel ist, daß die Transformation des
(E)ER-Schemas
automatisch
normalisierte
Relationen
liefert.
Die
anderen
Qualitätsmerkmale (Selbsterklärung, Ausdrucksstärke, ...) implizieren dieses Kriterium
weitestgehend, wegen der besonderen Beziehung zum Relationenmodell wird es aber in
der Regel gesondert betrachtet.
2.6 Wie wird ein EER-Schema in ein Relationenschema
umgesetzt ?
Es gibt mehrere Verfahren, ein EER-Schema in ein Relationenschema zu übersetzen.
Eines soll hier genauer betrachtet werden:
Beim Prozeß des „Forward Engineering“ ist zu beachten, daß im Relationenmodell
Beziehungen und Integritätsbedingungen zwischen Attributen verschiedener EERObjekte nicht dargestellt werden können und gesondert genannt werden.
- 14 -
Auf folgende Weise wird ein Relationenschema aus dem EER-Modell erzeugt:
Starke Entities werden in Relationen umgesetzt, deren Attribute und Schlüssel mit
denen des entsprechenden Entities übereinstimmen.
Ein schwaches Entity wird in eine Relation umgesetzt, deren Primärschlüssel sowohl
aus den „internen“ Schlüssel-Attributen (auch „hängende Schlüsselattribute“ genannt) als
auch aus dem Primärschlüssel des Eigentümers zusammengesetzt ist. Die Beziehungen
zu dem bzw. den Eigentümer(n) werden dann nicht weiter behandelt und „vergessen“, da
sie durch die „importierten“ Primärschlüsselattribute repräsentiert werden.
Im Beispiel werden die beiden Relationen „Abteilung“ und „Projekt“ erzeugt. Der
Primärschlüssel „Abteilnr“ des starken Entities wird dabei in die Tabelle „Projekt“
importiert und dient als Fremdschlüssel, wodurch die Beziehung „betreut“ repräsentiert
wird.
Abteilung
(0,N)
betreut
(1,1)
Projekt
Projektnr, Projname
Abteilnr
Es werden also die folgenden Relationen gebildet (Primärschlüssel sind einfach
unterstrichen, Fremdschlüssel punktiert unterstrichen):
Abteilung
(Abteilnr)
Projekt
(Abteilnr, Projektnr, Projname)
Weil „Abteilnr“ in Relation „Projekt“ Fremdschlüssel ist, gilt die Integritätsbedingung
Projekt.Abteilnr→Abteilung.Abteilnr.
- 15 -
Bei binären Beziehungen zwischen Entities A und B muß unterschieden werden:
A
(v,w)
R
(x,y)
A1,A2,A3
B
B1,B2
A und B haben Kardinalität (1,1):
(v=w=x=y=1)
Wenn A und B denselben Schlüssel P haben (P=A1=B1), dann definiere die
Relationen A (P,A2,A3) und B (P,B2) und folgende Abhängigkeiten für die
referentielle Integrität: A.P→B.P und B.P→A.P
Eine weitere Möglichkeit ist die „Fusion“ der Relationen, die mit A bzw. B
korrespondieren. Alle Attribute beider Relationen müssen dann in die neue
Tabelle aufgenommen werden. Der Primärschlüssel wird aber nur einmal
definiert: A_B (P,A2,A3,B2)
Wenn A und B verschiedene Schlüssel haben, dann importiere den Schlüssel von
A als Fremdschlüssel in B, den Schlüssel von B als Fremdschlüssel in A, oder
beides. Also z.B. A (A1,A2,A3,B1), B (B1,B2)
Wieder gilt die Fremdschlüsselbedingung A.B1→B.B1
Auch die „Fusion“ beider Relationen ist möglich, jedoch müssen beide Schlüssel
in der neuen Relation erscheinen, von denen einer als Primärschlüssel ausgewählt
wird: A_B (A1,A2,B1,B2,B3)
Nur ein Entity aus A und B hat die Kardinalität (1,1) (z.B. B), das andere hat
Kardinalität (0,1) (z.B. A):
(v=0, w=x=y=1)
In diesem Fall ist es sinnvoll, den Primärschlüssel des einen Entities jeweils in die
Tabelle, die das andere Entity repräsentiert, als Fremdschlüssel zu importieren,
also z.B. A (A1,A2,A3,B1), B (B1,B2,A1). Dabei ist zu beachten, daß für Tupel
aus A in B1 NULL-Werte erlaubt sind, weil in der dargestellten Beziehung nicht
umbedingt zu jedem Tupel aus A ein Tupel aus B existieren muß. Hingegen
existiert zu jedem Tupel aus B genau ein Tupel aus A, so daß Tupel aus B in
Attribut A1 keine NULL-Werte enthalten darf.
Weiterhin gelten die Integritätsbedingungen A.B1→B.B1 und B.A1→A.A1
Alternativ dazu kann zusätzlich zu den Relationen A (A1,A2,A3) und B (B1,B2)
eine neue Relation R erzeugt werden, die die Schlüssel beider Entities enthält.
- 16 -
Nur der Schlüssel des Entities mit Kardinalität (1,1) ist Primärschlüssel von R,
weil der Schlüssel des anderen Entities NULL-Werte erlauben muß, um die
dargestellte Beziehung zu repräsentieren: R (A1,B1)
Zusätzlich gelten die Fremdschlüsselbedingungen R.A1→A.A1, R.B1→B.B1
A und B haben Kardinalität (0,1):
(v=x=0,w=y=1)
Genauso wie eben werden wechselseitig die Primärschlüssel des jeweils anderen
Entities als Fremdschlüssel importiert und dieselben Fremdschlüsselbedingungen
definiert. Jedoch erlauben hier beide Fremdschlüssel NULL-Werte, also auch in
Tupeln aus B kann das Attribut A1 leer sein.
Ein Entity aus A, B hat Kardinalität (1,1) (z.B. A), das andere hat Kardinalität (1,N)
oder (0,N) (z.B. B): (v=w=x=1,y=N)
Wenn A und B denselben Schlüssel P haben (P=A1=B1), dann definiere eine der
beiden folgenden Abhängigkeiten: A.P→B.P (wenn A Kardinalität (1,1) hat) oder
B.P→A.P (wenn B Minimum/Maximum-Werte (1,1) hat).
Wenn A und B verschiedene Schlüssel haben, dann importiere den Schlüssel des
Entities, das die Kardinalität (1,N) aufweist, als Fremdschlüssel in die Relation,
die dem Entity mit Kardinalität (1,1) entspricht. Natürlich gilt wieder die
Fremdschlüsselbed.: A (A1,A2,A3,B1), B (B1,B2), A.B1→B.B1
Ein Entity aus A, B hat Kardinalität (0,1) (z.B. A), das andere hat Kardinalität (1,N)
oder (0,N) (z.B. B): (v=0,w=x=1,y=N)
Es wird eine neue Relation R erstellt, die die Schlüssel von A und B enthält. Der
Schlüssel des Entities mit Kardinalität (0,1) wird als Primärschlüssel der neuen
Relation auserwählt. R (A1,B1)
Es gelten die Integritätsbedingungen R.A1→A.A1, R.B1→B.B1
Alle anderen binären Beziehungen und allgemein Beziehungen vom Grad > 2:
Erzeuge eine neue Relation R mit einem Primärschlüssel, der aus allen Schlüsseln
der an der Beziehung beteiligten Entities zusammengesetzt wird. Für alle diese
Schlüssel gelten außerdem die Fremdschlüsselbedingungen. Zum Beispiel gilt für
(v=x=1,w=y=N): R (A1,B1) und R.A1→A.A1, R.B1→B.B1
- 17 -
Generalisierungs-Hierarchien werden umgesetzt, indem die Abhängigkeiten für die
referentielle Integrität definiert werden (analog zu oben: Wenn etwa A generelles Entity
ist und B ein spezielles Entity mit gleichem Primärschlüssel P, dann definiere B.P→A.P).
Haben die speziellen Entities andere Primärschlüssel als das generelle Entity, dann muß
vor Festlegung der Abhängigkeiten der Primärschlüssel des generellen Entities als
Fremdschlüssel in die Relationen importiert werden, die mit den speziellen Entities
korrespondieren. Die Abhängigkeiten werden dann entsprechend über die neuen
Fremdschlüssel der speziellen Entities definiert.
Name, Straße, Ort
Mitarbeiternr, Gehalt
Person
Mitarbeiter
Kunde
Kundennr
Hier entstehen folgende Relationen und Integritätsbedingungen:
Person
(Name, Straße, Ort)
Mitarbeiter
(Mitarbeiternr, Gehalt, Name)
Kunde
(Kundennr, Name)
Mitarbeiter.Name→Person.Name, Kunde.Name→Person.Name
Bei Aggregationen muß das Relationenschema für alle Bestandteile der Aggregation wie
eben beschrieben erweitert werden. Ein Spezialfall wird dabei gesondert betrachtet: Für
Beziehungen, die zwischen einem Entity und einer anderen Beziehung bestehen, müssen
folgende Fälle unterschieden werden:
Entity hat Kardinalität (1,1):
Primärschlüssel des Entities wird zum Fremdschlüssel in der Relation, die der
Beziehung entspricht.
Entity hat Kardinalität (0,1):
Erzeuge entweder eine neue Relation oder verfahre wie eben im vorherigen Fall.
Sonst:
Erzeuge eine neue Relation.
- 18 -
Der Primärschlüssel der neuen Relation wird aus dem Schlüssel des Entities und den
Primärschlüsseln der an der Beziehung beteiligten Entities zusammengesetzt.
A
R_A
R_B
(0,1)
(1,N)
B
(1,1)
A1,A2,A3
B1,B2
Bei Umsetzung dieses Schemas wird zuerst die Aggregation wie ein Entity behandelt.
Nach obigem Verfahren muß also Entity B den Primärschlüssel der Aggregation als
Fremdschlüssel importieren. Anschließend wird Entity A in eine Tabelle umgesetzt und
dann eine Relation R_A erzeugt:
B
(B1,B2,A1)
A
(A1,A2,A3)
R_A
(A1,B1)
B.A1→A.A1, R_A.A1→A.A1, R_A.B1→B.B1
Zu bemerken ist, daß bei Umsetzung eines EER-Schemas in ein Relationenschema
Informationen verloren gehen, sofern nicht zusätzlich zum Schema weitere
Integritätsbedingungen notiert werden. Zum Beispiel sind aus einem „reinen“
Relationenschema keinerlei Informationen über Kardinalitäten zu erhalten.
Werden hingegen derartige zusätzliche Bedingungen erfaßt, so läßt sich ein
Relationenschema finden, das bezüglich der gespeicherten Daten zu dem ursprünglichen
EER-Schema äquivalent ist. Beide Schemata enthalten dieselben Zustandsmengen. Wie
eben gezeigt sind aber grafische Entwurfs-Elemente wie Aggregationen im
Relationenschema nicht mehr zu erkennen, da es im Relationenmodell keine Struktur
gibt, die zu einer Aggregation äquivalent ist. Dasselbe Problem gibt es auch in
umgekehrter
Richtung:
Nicht
alle
Integritätsbedingungen,
die
auf
einem
Relationenschema definiert werden können, sind im EER-Schema wiederzuerkennen.
- 19 -
2.7 Welche Verfahren zum „Reverse Engineering“
wurden bereits veröffentlicht ?
Seit nahezu zehn Jahren findet man in den Fachzeitschriften immer wieder Artikel, die
sich mit dem Thema „Reverse Engineering von Datenbanken“ auseinandersetzen. Es ist
wegen der Verbreitung der relationalen Datenbanksysteme kaum verwunderlich, daß sich
die Verfasser dieser Texte fast ausschließlich mit relationalen Datenbanken befassen. Als
Zielmodell
wählten
die
Autoren
meist
ein
EER-Modell
wie
oben
mit
Spezialisierungen/Generalisierungen und Aggregationen [2,3,4,5,10,13,16,17]. Der
Algorithmus aus [7] bildet ein „einfaches“ ER-Diagramm. Nur Shoval/Shreiber [19]
entwickeln anhand ihres Verfahrens ein „Binary Relationship Model“. Interessant ist auch
die Variante des ER-Entwurfs, die in [23] beschrieben wird: Wenguang/Carlson/Dreyer
benutzen als Zielmodell ein „Nested ER-Model“. Dieses Diagramm zeichnet sich dadurch
aus, daß es aus mehreren Stufen bzw. Ebenen besteht. Jede dieser Ebenen enthält ein
eigenes ER-Schema. Auf diese Weise kann man z.B. ganze Gruppen von Entities und
zugehörige Beziehungen in einer höheren Ebene als ein einziges Entity schreiben. Die
Darstellung wird dadurch übersichtlicher und einfacher verständlich.
Fast alle Algorithmen bauen auf dem Schema einer vorhandenen relationalen
Datenbank auf und klassifizieren die Relationen in bestimmte Kategorien. Dabei wird
immer vorausgesetzt, daß das Schema in der „dritten Normalform“ vorliegt und auch
Angaben über die Primärschlüssel enthält. Nur die Algorithmen aus [2] und [17] bilden
hier eine Ausnahme: Sie bewerten die Tabellen anhand von Anfragen bzw. anhand von
denjenigen Programmen, die Attribute aus der Datenbank benutzen. Der Nachteil dieser
beiden Verfahren ist, daß das entstehende ER-Modell stark vom jeweiligen DatenbankZustand abhängig ist. So können zum Beispiel Beziehungen zwischen Tabellen nicht
erkannt werden, wenn die Datensätze in den Tabellen gerade zufällig voneinander
unabhängig sind. Andererseits können aber durch Anfragen Gemeinsamkeiten zwischen
Relationen erkannt werden, die ein Datenbank-Schema nicht liefert.
- 20 -
2.8 Wie sind die Verfahren zu bewerten ?
Kriterien/Fragen zur Bewertung der Algorithmen sind:
• Was für eine Art von Schema entsteht ?
• Was für Voraussetzungen werden an das Relationenschema gestellt ?
• An welchen Stellen sind Eingaben vom Nutzer erforderlich ?
• Wie groß ist der Automatisierungsgrad ?
• Kann der Nutzer den Algorithmus beeinflussen ?
• Werden sinnvolle Annahmen gemacht ?
• Ist die Übersetzung semantisch korrekt ?
• Wie ist die Qualität der Ergebnisschemata ?
• Wird Pseudo-Code für spätere Programmierung geliefert ?
Zu einigen Verfahren stehen allerdings nicht ausreichend Informationen zur
Verfügung, um sie nach all diesen Kriterien bewerten zu können.
2.9 Auf welche Weise setzen die Algorithmen ein
Relationenschema in „ihr“ Zielmodell um ?
Die Verfahren werden jetzt kurz erläutert und bewertet. Für nähere Informationen sei
hiermit auf die jeweiligen Artikel (siehe Literaturhinweise) verwiesen.
Eine große Anzahl an veröffentlichten Algorithmen lassen sich zu einer Gruppe
zusammenfassen, denn die Verfahren aus [3,4,5,10,13,16] arbeiten alle mit Hilfe einer
Klassifikation der Tabellen und anschließender Umsetzung in ein EER-Schema (wie oben
beschrieben) unter Zuhilfenahme dieser Einordnung der Relationen in unterschiedliche
Klassen. Das Verfahren von Chiang/Barron/Storey [4,5] erweist sich bei der Bewertung
mit Hilfe oben genannter Kriterien als das beste bisher veröffentlichte, weil hier dem
Anwender die Arbeit weitestgehend erleichtert wird, der Algorithmus auf der anderen
Seite aber sehr viele Informationen des Relationenschemas bzw. des Anwenders
ausnutzen und auswerten kann. Aus diesem Grund soll Chiangs Verfahren ausführlicher
betrachtet werden.
- 21 -
2.10 Wie arbeitet der Algorithmus von Chiang ?
Input:
Voraussetzung:
Relationenschema in dritter Normalform
Primärschlüssel (Fremdschlüssel empfehlenswert, s.u.)
Datensätze aus der Datenbank
In der Datenbank müssen Tupel gespeichert sein.
Attribute gleichen Namens speichern gleiche Inhalte.
Diese Datensätze dienen der Kontrolle einiger Annahmen, die der Algorithmus macht.
1. Relationenschema und Informationen über Primärschlüssel (PS) (und
Fremdschlüssel) aus Datenbank lesen oder vom Anwender eingeben lassen. Das
Relationenschema muß in der dritten Normalform vorliegen.
Um zu ermitteln, welche Tabellen welche Art von EER-Objekten (Entity oder
Beziehung) repräsentieren, werden die Relationen zunächst in vier verschiedene
Klassen eingeteilt. Durch Umkehr des oben erläuterten „Forward Engineering“Prozesses kann dann ein EER-Schema erzeugt werden.
2. Klassifikation der Tabellen: Sei A betrachtete Relation mit PS P, X und Y
beliebige weitere Relationen mit PS Q bzw. R. Mit Kleinbuchstaben werden
Attribute bezeichnet, mit ∆ die Menge aller Relationen der Datenbank.
Annahme: Attribute haben gleiche Namen, wenn in ihnen dieselben Inhalte
gespeichert werden. Es wird unterschieden zwischen:
Wenn ∀X∈(∆\{A}) gilt Q⊄P, dann ist A „starke Entity-Relation“ (SER).
(PS von A enthält keinen PS einer anderen Relation)
Wenn gilt: ∃Q⊂P ∧ ∃a∈P: ∀Y∈(∆\{A}) a∉R, dann wird A als „schwache EntityRelation“ bzw. „weak Entity-Relation“ (WER) klassifiziert.
(PS enthält sowohl Attribute, die Schlüssel einer anderen Relation sind, als auch
Attribute, die zu keiner anderen Tabelle gehören)
Gilt P=Q1∪...∪Qn, n>1, Qi PS, so wird A als „reguläre Beziehungs-Relation“ (RBR)
bezeichnet.
(PS ist Zusammensetzung von mindestens zwei PS anderer Tabellen)
Übrige Tabellen nennt man „spezielle Beziehungs-Relationen“ (SBR).
Analog zur Klassifikation der Relationen werden auch die Attribute in Klassen
unterteilt. Dies ist deshalb sinnvoll, weil viele Attribute in den Tabellen einzig der
Speicherung von Beziehungen zwischen Relationen dienen (z.B. Fremdschlüssel). Diese
Attribute werden bei der Erstellung der Beziehungen im EER-Schema beachtet.
ACHTUNG: Die Definition von „Primärschlüsselattributen“ ist hier anders als im
allgemeinen üblich.
- 22 -
3. Klassifikation der Attribute: Sei A betrachtete Relation mit PS P, ER:=SER∪WER,
BR:=RBR∪SBR.
a∈P heißt „Primärschlüsselattribut“, wenn:
A∈SER
∨
A∈WER ∧ a∈Q mit Q ist PS von (A≠)X∈ER
∨
A∈BR ∧ a∈Q mit Q ist PS von (A≠)X∈∆
(Die Menge aller Primärschlüsselattribute aus A werde mit ϕ bezeichnet, die
Menge der Primärschlüsselattribute einer Relation (A≠)X∈∆ sei ζ)
a∈P heißt „hängendes Schlüsselattribut“, wenn A∈WER ∧ a∉ϕ
a∈P heißt „allgemeines Schlüsselattribut“, wenn A∈SBR ∧ a∉ϕ
a∉P heißt „Fremdschlüsselattribut“, wenn a∈ζ für beliebiges X∈(∆\{A})
sonst heißt a∉P „Nichtschlüsselattribut“.
Die Klassifikation, die der Algorithmus vornimmt, ist abhängig von den Daten, die der
Anwender dem Verfahren vorgibt. Oftmals kann der Algorithmus aber nicht den
eigentlichen Zweck einer Relation ermitteln, so daß hier eine Nachbearbeitung durch
den Nutzer erforderlich wird. Besonders zu erwähnen ist hier die Klassifikation
zwischen schwacher Entity-Relation und spezieller Beziehungs-Relation: Manchmal
dient nämlich eine Tabelle, die als WER klassifiziert wurde, eigentlich der
Repräsentation einer Beziehung zwischen starken Entities, die bei Erzeugung des
Relationenschemas aber nicht in eigenständige Tabellen umgesetzt wurden. Durch die
Eingriffs-Möglichkeiten, die an dieser Stelle der Anwender hat, können derartige
Modellierungs-Fehler verhindert werden.
4. Klassifikation wird vom Nutzer überprüft und gegebenenfalls korrigiert.
Insbesondere unterscheidet er zwischen WER und SBR, denn alle Tabellen, die
als WER klassifiziert worden sind, können stattdessen auch als SBR behandelt
werden. Alle Klassifikations-Änderungen des Nutzers werden durch DatenbankAnfragen kontrolliert und der Anwender auf vermutete Fehler hingewiesen.
Wichtig für die spätere Erstellung von Beziehungen, Generalisierungs-Hierarchien und
Aggregationen ist die Ermittlung von Abhängigkeiten. Das Verfahren versucht,
möglichst viele Abhängigkeiten automatisch zu finden. Eine Nachbearbeitung durch den
Nutzer ist hier sehr wichtig, da die Heuristiken nicht dazu geeignet sind, alle
Abhängigkeiten zu finden. Besonders von Interesse ist hier die Kenntnis von
Fremdschlüsseln: Ohne deren Spezifikation werden über die Heuristiken kaum
Abhängigkeiten gefunden.
5. Ermitteln von Abhängigkeiten:
Seien A,B Tabellen aus ∆, N eine Menge von Attributen. Folgende Heuristiken
werden angewendet:
N ist PS von A∈SER und von B∈SER,
dann vermute A.N→B.N ∨ B.N→A.N
- 23 -
N ist PS von A∈ER und Fremdschlüssel von B (sofern FS bekannt),
dann
B.N→A.N
N ist PS von A∈ER und Teil des Primärschlüssels von B∉SER,
dann vermute B.N→A.N
Durch Anfragen werden diese Vermutungen überprüft und redundante
Abhängigkeiten gelöscht:
Ist πN(B)⊄πN(A), dann widerspricht dies der Vermutung B.N→A.N.
Gilt A.N→B.N ∧ B.M→C.M ∧ M⊂N, so ist A.M→C.M redundant und
wird verworfen.
Die Abhängigkeiten können vom Anwender editiert oder gelöscht werden. Auch
ein Hinzufügen von Abhängigkeiten ist möglich.
Die Umsetzung beginnt natürlich mit der Erzeugung der starken und schwachen
Entities, weil Beziehungen, an denen sie beteiligt sind, erst hinterher erstellt werden
können.
6. Erzeugung von starken Entities: Sei R betrachtete Relation.
∀R∈SER erzeuge starkes Entity mit PS:=Primärschlüsselattribute(R).
Name des neuen Entities:=Name von R
7. Erzeugung von schwachen Entities:
∀R∈WER erzeuge schwaches Entity mit PS:=hängende Schlüsselattr.(R) und
N:1-Beziehung zwischen neuem Entity und Eigentümer, der durch
Primärschlüsselattribute(R) bestimmt wird:
X:=Primärschlüsselattribute(R) bilden PS von A∈ER ∧ R.X→A.X,
dann ist A Eigentümer von R
Ist der Eigentümer von R nicht eindeutig festzustellen, weil mehrere Relationen A
obiger Bedingung genügen, so muß er durch den Nutzer bestimmt werden.
Name des neuen Entities:=Name von R
Name der Beziehung:=‘ABHÄNGIG’
Durch „Umkehr“ des „Forward Engineering“-Prozesses werden nun die Beziehungen,
Hierarchien und Aggregationen erstellt.
8. Erzeugung von „is a“-Beziehungen:
Wenn P ist PS von A∈SER und B∈SER ∧ A.P→B.P gilt,
dann bilde „is a“-Beziehung zwischen A und B
mit Kardinalitätsverhältnis 1:1
9. Erzeugung von Spezialisierungs-/Generalisierungs-Hierarchien:
Hat „generelles“ Entity V mehrere „is a“-Beziehungen zu „speziellen“ Entities, so
wird mit Hilfe von Anfragen geprüft, ob alle Daten von V in genau einem
speziellen Entity vorkommen. Trifft dies zu, so erzeuge Hierarchie zwischen V und
speziellen Entities.
(Dieses Verfahren erkennt also nur totale exklusive Generalisierungen)
- 24 -
10. Erzeugung von binären Beziehungen aufgrund von Fremdschlüsseln:
Für alle Fremdschlüssel Fi von B∈ER wiederhole:
Sei F:=Fremdschlüssel Fi, P:=PS von A∈∆.
Wenn F=P ∧ B.F→A.F gilt, dann bilde Beziehung zwischen A und B.
Genügt mehr als eine Relation A dieser Bedingung, so muß der Anwender eine
Tabelle auswählen
Hat B.F eindeutige (unique) Werte (wird über Anfragen vermutet und durch
Anwender überprüft), so folgt Kardinalitätsverhältnis 1:1, sonst folgt
Kardinalitätsverhältnis 1:N zwischen A und B.
Name der Beziehung:=‘HAT’
11. Erzeugung von binären Beziehungen aufgrund von Nichtschlüsseln:
Seien M:=Nichtschlüssel von B∈∆ und N:=Nichtschlüssel von A∈∆
Wenn B.M→A.N gilt, dann bilde Beziehung zwischen A und B.
Hat B.M eindeutige (unique) Werte, so folgt Kardinalitätsverhältnis 1:1, sonst 1:N
Name der Beziehung:=‘HAT’
12. Behandlung der regulären Beziehungs-Relationen: Sei R betrachtete Relation mit
R∈RBR, P der Primärschlüssel von R. W sei Menge von Entity-Relationen.
W:=∅. Für alle A∈ER wiederhole
Q sei PS von A. Wenn Q⊂P ∧ R.Q→A.Q, so sei W:=W∪A
Genügen mehrere Entities obiger Bedingung, muß der Nutzer
ein Entity aus diesen bestimmen.
Bilde n-fache Beziehung zwischen allen Entities A∈W.
Kardinalitätsverhältnis jeder binären Beziehung:=N:M
Name der Beziehung:=Name von R
13. Behandlung der speziellen Beziehungs-Relationen: Sei R betrachtete Relation mit
R∈SBR, P die Menge der Primärschlüsselattribute von R, G Menge der
allgemeinen Schlüsselattribute von R, W eine Menge von Entity-Relationen.
W:= ∅. Erzeuge starkes Entity A mit PS:=G. Wenn G>1, so
entscheidet der Anwender, wieviele neue starke Entities A
erzeugt werden sollen. W:=W∪A.
Name des neuen Entities:=(Nutzereingabe)
Für alle A∈ER wiederhole
Q sei PS von A. Wenn Q⊂P ∧ R.Q→A.Q, so sei W:=W∪A
Genügen mehrere Entities obiger Bedingung, muß der Nutzer
ein Entity aus diesen bestimmen.
Bilde n-fache Beziehung zwischen allen Entities A∈W.
Kardinalitätsverhältnis jeder binären Beziehung:=N:M
Name der Beziehung:=Name von R.
- 25 -
14. Identifikation von Aggregationen: Sei F Fremdschlüssel von R∈BR, P PS von
A∈ER.
Gilt P=F ∧ R.F→A.P, so bilde abstraktes Entity W, in dem R und alle an
dieser Beziehung beteiligten Entities zusammengefaßt werden.
Genügen mehrere A∈ER der Bedingung, muß der Nutzer entscheiden
Bilde Beziehung zwischen A und W mit Kardinalitätsverhältnis 1:N.
Name von W:=Name von R
Name der Beziehung:=(Nutzereingabe)
Den Abschluß des Verfahrens bildet die Zuweisung der Attribute zu den EER-Objekten.
15. Zuweisung der Nichtschlüsselattribute:
(Sämtliche Schlüsselattribute wurden bereits in den vorhergehenden Schritten
behandelt, denn entweder sie fungieren im EER-Schema als Primärschlüssel,
oder sie dienten der Identifikation von Beziehungen)
Sei A∈∆ Relation, V Menge der Nichtschlüsselattribute von A.
A∈ER hat keine Fremdschlüsselattribute
⇒
V wird dem Entity A′ zugeordnet, das mit A korrespondiert
A∈ER hat Fremdschlüsselattribute
⇒
V wird wahlweise A′ oder einer der durch die Fremdschlüssel
identifizierten binären Beziehungen zugeordnet
A∈BR hat keine Fremdschlüsselattribute
⇒
V wird der Beziehung A′ zugeordnet, die mit A korrespondiert
A∈BR hat Fremdschlüsselattribute
⇒
V wird wahlweise A′ oder einer der durch die Fremdschlüssel
identifizierten binären Beziehungen zugeordnet
Das fertig erzeugte EER-Schema wird in der Regel noch nicht den Wünschen des
Anwenders entsprechen. Zum Beispiel fehlt noch die Zuweisung der Kardinalitäten zu
den Objekten, da kein Algorithmus in der Lage ist, diese automatisch anhand des
Relationenschemas zu ermitteln. Die Informationen über Kardinalitäten gehen beim
„Forward Engineering“-Prozeß verloren bzw. können nur durch zusätzliche
Integritätsbedingungen ins Relationenmodell übertragen werden. Einzig die
Kardinalitätsverhältnisse werden durch das Verfahren festgestellt.
16. Korrektur: Abschließend hat der Anwender die Möglichkeit, das entstandene
Schema zu modifizieren. Dies ist besonders dann notwendig, wenn vor Beginn
des Umsetzungsprozesses nicht alle Abhängigkeiten gefunden bzw. eingegeben
worden sind.
- 26 -
2.11 Was macht Chiangs Verfahren aus der HIS-DB ?
Dieser Algorithmus soll nun auf Teile der relationalen Datenbank angewendet werden,
die bei Hochschul-Informations-Systeme GmbH Hannover (HIS) der Verwaltung von
Studentendaten dient.
Wir betrachten folgende Tabellen (Primärschlüssel sind einfach unterstrichen,
Fremdschlüssel sind punktiert unterstrichen):
• SOS
Feste Studentendaten
(MtkNr, Semester, Status, Name, Strasse, Ort, Staat,
HmKfzKz, HmKfz, ImmDat, RueDat, ExmDat, ExmGrund)
• STG
Veränderliche-Studentendaten (für jedes Semester Einträge)
(MtkNr, Semester, StgNr, Status, Stg, Abschl, BeuGrund,
EndeGrd)
• K_STG
Schlüsseltabelle für Studiengang
(Stg, Ktxt, Dtxt, AStat)
• K_ABINT
Schlüsseltabelle für Abschluß (intern)
(Abschl, Ktxt, Dtxt, AStat)
• K_ABSTG
Verknüpfung Studiengang-Abschluß
(AbStg)
• K_AKFZ
Schlüsseltabelle Auslandskennzeichen
(AKfz, Ktxt, Dtxt, AStat, EGMitgl)
• K_IKFZ
Schlüsseltabelle Inlandskennzeichen
(IKfz, Ktxt, Dtxt, AStat)
• K_GDEX
Schlüsseltabelle Exmatrikulationsgrund
(GdEx, Ktxt, Dtxt, AStat)
• K_GDBU
Schlüsseltabelle Beurlaubungsgrund
(GdBu, Ktxt, Dtxt, AStat)
Folgende für die Umsetzung wichtige Informationen sind nicht aus dem Schema
abzulesen:
I) Die Tabelle STG enthält für jeden Studenten für jedes Semester, in dem der
Student eingeschrieben ist, und für jedes Fach, das er belegt, einen eigenen
- 27 -
Datensatz. In der SOS-Relation wird hingegen in den Attributen Semester und
Status nur der Stand des aktuellen bzw. letzten Semesters gespeichert. Die
Inhalte in beiden Attributen stimmen mit den Inhalten des Satzes mit maximalem
Semester der STG-Tabelle überein. Nur für exmatrikulierte Studenten ist dies
nicht der Fall: Bei ihnen wird der SOS.Status auf ‘exmatrikuliert’ gesetzt, der
STG.Status bleibt unverändert.
II) Das einzige Attribut der Relation K_ABSTG ist zusammengesetzt aus den
Primärschlüsseln der Tabellen K_STG und K_ABINT - Stg bzw. Abschl.
Damit
das
Verfahren
diese
Tabelle
richtig
behandelt,
sei
also
AbStg:=Stg+Abschl.
III) Der Fremdschlüssel HmKfz aus Tabelle SOS verweist auf die Relationen
K_IKFZ oder K_AKFZ, je nachdem, welchen Inhalt das Attribut HmKfzKz hat.
HmKfzKz bestimmt, ob die Anschrift im In- oder Ausland liegt, und nimmt
entsprechend die Werte ‘I’ oder ‘A’ an. Zum Beispiel kann in HmKfz der
Eintrag ‘B’ stehen. Ist HmKfzKz auf ‘I’ gesetzt, so bedeutet dies, daß der
Student aus Berlin kommt. Im anderen Fall steht in HmKfzKz ein ‘A’ und der
Student kommt aus Belgien („aufgespaltene referentielle Integritätsbedingung“).
Die nachstehenden Abhängigkeiten sind bekannt:
A) SOS.HmKfz→K_AKFZ.AKfz,
B) SOS.HmKfz→K_IKFZ.IKfz,
C) SOS.ExmGrund→K_GDEX.GdEx,
D) STG.Stg→K_STG.Stg,
E) STG.Abschl→K_ABINT.Abschl,
F) STG.BeuGrund→K_GDBU.GdBu,
G) STG.EndeGrd→K_GDEX.GdEx,
H) STG.MtkNr→SOS.MtkNr,
I) K_ABSTG.Stg→K_STG.Stg,
J) K_ABSTG.Abschl→K_ABINT.Abschl.
- 28 -
Dieses Relationenschema wird durch das beschriebene Verfahren von Chiang umgesetzt.
Es wird erst einmal davon ausgegangen, daß Fremdschlüssel der Tabellen und
Abhängigkeiten dem Anwender bekannt sind. Die Schrittnummern entsprechen denen im
Algorithmus:
1. Schema an Algorithmus übergeben.
2. SOS, K_AKFZ, K_IKFZ, K_GDEX, K_GDBU, K_STG und K_ABINT sind SER,
STG ist WER, K_ABSTG ist RBR. Letzteres geht aber erst aus der
Zusatzinformation II) hervor - sonst würde K_ABSTG als SER klassifiziert werden.
3. Primärschlüsselattribute (im Sinne des Verfahrens) sind in den SER und RBR die im
Schema unterstrichenen Attribute des Primärschlüssels, in STG ist es einzig das
Attribut MtkNr. Die anderen Attribute des PS von STG (Semester und StgNr)
sind hängende Schlüsselattribute. Fremdschlüsselattribute sind in den Tabellen SOS
und STG zu finden, und zwar in SOS die Attribute HmKfz und ExmGrund, in
STG Stg, Abschl, BeuGrund und EndeGrd. Alle übrigen Attribute sind
Nichtschlüsselattribute.
4. Änderungen sind nicht erforderlich.
5. Die erste Heuristik findet keine Abhängigkeit, denn es gibt keine zwei Tabellen mit
demselben Primärschlüssel. Wären die Namen der Primärschlüsselattribute von
K_AKFZ und K_IKFZ gleich, so würde eine Abhängigkeit zwischen beiden
Relationen gefunden werden. Diese würde aber aufgrund der Überprüfung am Ende
von Schritt 5 wieder wegfallen. Die Fremdschlüssel geben die Abhängigkeiten A) bis
G) vor, die dritte Heuristik liefert H) bis J).
Alle Abhängigkeiten werden nun auf die beiden im Verfahren aufgeführten
Bedingungen hin überprüft:
Weil es Werte in K_AKFZ gibt, die nicht in K_IKFZ auftauchen, und umgekehrt,
das Attribut SOS.HmKfz aber sowohl Werte der einen als auch der anderen Tabelle
annimmt (je nach Eintrag in SOS.HmKfzKz, siehe Zusatzinformation III), werden
die Abhängigkeiten A) und B) verworfen. Der Anwender wird sie aber wieder
hinzufügen.
- 29 -
6. Starke Entity-Typen werden erzeugt:
MtkNr
SOS
K_IKFZ
K_AKFZ
K_GDEX
K_GDBU
K_ABINT
K_STG
IKfz
AKfz
GdEx
GdBu
Abschl
Stg
7. Erzeugung des schwachen Entities: Durch H) erweist sich Entity SOS als
Eigentümer.
MtkNr
SOS
Semester,StgNr
1
ABHÄNGIG
N
STG
K_IKFZ
K_AKFZ
K_GDEX
K_GDBU
K_ABINT
K_STG
IKfz
AKfz
GdEx
GdBu
Abschl
Stg
8. Da keine zwei Relationen denselben PS aufweisen, wird keine „is a“-Beziehung
erstellt. Wie bereits in 5. angesprochen wäre eine solche Beziehung zwischen
K_AKFZ und K_IKFZ erzeugt worden, wenn nicht die Inhalte beider Tabellen dem
widersprechen würden.
9. Hierarchien werden nicht erzeugt.
- 30 -
10. Fremdschlüssel-Beziehungen auswerten: Die Abhängigkeiten A) und B) beziehen
sich auf denselben Fremdschlüssel SOS.HmKfz. Der Nutzer muß also hier eine
Abhängigkeit auswählen, die ins Schema übernommen werden soll. Die Wahl fällt
dabei auf Abhängigkeit B). In Schritt 16. muß aber daran gedacht werden, daß auch
Abhängigkeit A) beachtet werden muß (siehe III).
MtkNr
Semester,StgNr
1
SOS
N
B
N
ABHÄNGIG
N
STG
N
C
HAT
G
HAT
1
HAT
F
N
E
HAT
1
N
N
D
HAT
1
HAT
1
1
K_IKFZ
K_AKFZ
K_GDEX
K_GDBU
K_ABINT
K_STG
IKfz
AKfz
GdEx
GdBu
Abschl
Stg
11. Beziehungen aufgrund von Nichtschlüssel-Abhängigkeiten werden nicht gebildet.
12. Übernahme von K_ABSTG mit den Abhängigkeiten I) und J) in das Schema:
MtkNr
Semester,StgNr
1
SOS
N
ABHÄNGIG
N
HAT
STG
N
HAT
1
N
1
HAT
1
N
N
N
HAT
HAT
HAT
1
1
1
K_IKFZ
K_AKFZ
K_GDEX
K_GDBU
IKfz
AKfz
GdEx
GdBu
K_ABINT
K_STG
Abschl
Stg
M
K_ABSTG
13. Spezielle Beziehungs-Relationen wurden nicht im Schema entdeckt.
N
- 31 -
14. Die einzige Beziehungs-Relation (K_ABSTG) des betrachteten Relationenschemas
enthält keine Fremdschlüssel.
15. Zunächst werden die Nichtschlüsselattribute der Relationen K_STG, K_ABINT,
K_AKFZ, K_IKFZ, K_GDEX und K_GDBU jeweils dem korrespondierenden
Entity zugeordnet, denn diese Tabellen enthalten keine Fremdschlüssel. Bei den
Tabellen SOS und STG hat man die Wahl, ob die Nichtschlüsselattribute den
Entities SOS bzw. STG oder einer ihrer binären ‘HAT’-Beziehungen zugeordnet
werden sollen. Hier wird der einfache Fall gewählt, so daß SOS die Attribute
Semester, Status, Name, Strasse, Ort, Staat, HmKfzKz, ImmDat, RueDat und
ExmDat zugeordnet werden, während STG das Attribut Status erhält. Die übrigen
Attribute beider Tabellen, die nicht zum PS gehören, sind Fremdschlüssel und dienen
ausschließlich der Identifikation von Beziehungen. Als letztes wird K_ABSTG
behandelt. Diese Tabelle hat aber keine Nichtschlüsselattribute.
16. Einige Verbesserungen sind noch an dem entstandenen EER-Schema durchzuführen:
So werden vor allem die Namen der Entities und Beziehungen in sprechendere
Bezeichnungen umgewandelt. Nicht zu vergessen ist auch die Modellierung der
Abhängigkeit A) (siehe 10.). Die Beziehung K_ABSTG mit den Entities K_ABINT
und K_STG können zu einem abstrakten Entity zusammengefaßt werden. Die
beiden ‘HAT’-Beziehungen fallen dann weg und werden durch eine neue Beziehung
ersetzt. Zusätzlich werden die Kardinalitäten aller Beziehungen definiert. Die
Nichtschlüssel aus 15. werden der Übersichtlichkeit halber nicht ins Schema
übernommen.
- 32 -
MtkNr
Semester,StgNr
(1,N)
(0,1)
Student
(0,1)
(0,N)
Fach
(1,N)
(0,1)
wohnt in
studiert
(0,1)
wohnt in
(0,N)
(0,1)
exmatrikuliert
exmatrikuliert
(0,N)
(0,N)
(0,1)
im
beurlaubt
(0,N)
(1,N)
Studiengang
ermöglicht
(1,N)
(1,N)
Stadt
(Inland)
Land
(Ausland)
Exmatr.grund
Beurlaub.grund
Abschluß
Stud.gang
IKfz
AKfz
GdEx
GdBu
Abschl
Stg
2.12 Welche Probleme treten bei Chiang auf ?
Bei Bearbeitung obigen Beispiels fallen schon einige Probleme auf, die der Algorithmus
mit sich bringt:
Eine Schwierigkeit, die bei jedem Verfahren auftritt, ist die Namensgebung der
EER-Objekte. Meist sind die Namen der Relationen nicht als Namen der erzeugten
Objekte zu gebrauchen, da oft im Relationenschema Abkürzungen angewendet werden.
Dieses Problem ist aber nicht durch einen Automatismus zu lösen, da kein Algorithmus
ermitteln kann, welche Art von Daten in welcher Relation gespeichert werden. Die
Namen, die Chiang verwendet, sind deshalb zwar nicht sehr aussagekräftig, stellen aber
doch eine dem Problem entsprechende Lösung dar. Hier ist der Anwender gefordert,
bessere Namen zu vergeben.
Unverständlich ist hingegen die Reihenfolge der Erstellung von Beziehungen.
Sicherlich wäre es besser, Beziehungen, die aus Fremdschlüsseln oder Nichtschlüsseln
resultieren (Schritte 10. und 11.), erst nach der Umsetzung von Beziehungs-Relationen
(Schritte 12. und 13.) zu erzeugen. Sonst kann es passieren, daß Fremdschlüssel, die in
Beziehungs-Relationen stehen, nicht beachtet werden.
- 33 -
In dieser Hinsicht ist auch die Voraussetzung für die zweite Heuristik in Schritt 5.
nicht zu begreifen, denn auch Beziehungs-Relationen können Fremdschlüssel enthalten.
Durch die Voraussetzung A∈ER werden sie aber nicht als solche erkannt. Gerade diese
Fremdschlüssel liefern aber für Schritt 14. die notwendigen Hinweise auf Aggregationen.
Um ein EER-Schema zu erhalten, das aussagekräftig ist und die Beziehungen
zwischen den anderen Objekten geeignet darstellt, ist die Kenntnis von Primär- und
Fremdschlüsseln unerläßlich. Hier liefert das Verfahren von Chiang leider keine
Unterstützung. Hingegen wird vom Anwender verlangt, daß er die Schlüssel
kennzeichnet. Dabei ist es nicht weiter schwierig, Heuristiken analog zu 5. zu finden, die
mögliche Schlüsselattribute suchen. Zum Beispiel geben „unique“-Indexe Aufschluß auf
mögliche Schlüsselkandidaten, während die Namensgebung von Attributen auf
Fremdschlüssel deuten können. Wenn ein Attribut einer Tabelle den gleichen Namen wie
der Primärschlüssel einer anderen Relation besitzt, so kann vermutet werden, daß es sich
hierbei um ein Fremdschlüsselattribut handelt. Diese Annahmen können anhand der
Datenbank-Inhalte überprüft und vom Nutzer korrigiert werden. Primärschlüssel sollten
wegen ihrer Wichtigkeit bei der Klassifikation der Relationen deklariert sein.
Weitere Verbesserungen im Bereich der Automatisierung des Algorithmus sind
denkbar, indem der Anwender nicht sofort zu einer Entscheidung im Zweifelsfalle
gezwungen wird, sondern der Algorithmus eine „vorläufige“ Entscheidung trifft und den
Nutzer erst in Schritt 16. auf derartige Fälle hinweist.
Eine weitere Möglichkeit, den Grad der Automatisierung zu erhöhen, liegt im 15.
Schritt bei der Zuweisung der Nichtschlüsselattribute zu den EER-Objekten. Es ist
rätselhaft, warum Chiang hier dem Anwender die Wahl läßt, die Attribute einer über
Fremdschlüssel spezifizierten binären Beziehung zuzuordnen, denn diese Möglichkeit ist
semantisch gleichwertig zu dem gebräuchlichen Vorgehen, die Attribute dem Entity bzw.
der Beziehung zuzuweisen. Im oben betrachteten Beispiel ist es unerheblich, ob das
Attribut Status dem (schwachen) Entity FACH oder der Beziehung STUDIERT
zugeordnet wird. Nimmt man dem Anwender diese Entscheidungsmöglichkeit bzw.
Entscheidungspflicht, so kann auf einfachste Art und Weise der Nutzer entlastet werden.
Die Annahmen, die das Verfahren macht, sind in der Regel sinnvoll und können so
übernommen werden. Problematisch ist die Überprüfung der vermuteten Abhängigkeiten
(Schritt 5) und die Ermittlung der Kardinalitätsverhältnisse (Schritte 10 und 11), denn
- 34 -
hierzu werden Daten-Instanzen verwendet. Dadurch wird die Erstellung des EERSchemas abhängig vom Datenbank-Zustand. Wenn nur wenige Daten gespeichert sind,
können falsche Kardinalitätsverhältnisse vermutet werden. Allerdings hat dieses
Vorgehen den Vorteil, daß der Anwender entlastet wird, denn viele Abhängigkeiten
werden auf diese Weise automatisch gefunden, die der Nutzer sonst selbständig eingeben
müßte.
Ebenso werden in Schritt 9 Daten-Instanzen verwendet. Unglücklicherweise findet
Chiangs Verfahren nicht alle Arten von Generalisierungs-Hierarchien. Nur totale
exklusive Generalisierungen werden erkannt, und die auch nur dann, wenn entsprechende
Daten gespeichert sind.
Die Voraussetzung, daß Attribute gleichen Namens gleiche Inhalte speichern, ist
leider unrealistisch. Schon das angegebene Beispiel zeigt, daß Attribute, die dieselben
Daten speichern, nicht den gleichen Namen haben müssen (z.B. STG.BeuGrund und
K_GDBU.GdBu). Noch schwerwiegender ist aber der Fehler in der anderen Richtung,
denn wenn zwei Entities STUDENT und PROFESSOR beide ein Attribut „Name“
enthalten, so werden in diesen beiden Attributen nicht unbedingt dieselben Daten
gespeichert.
Eine weitere Idee zur Verbesserung des Verfahrens ist, daß Integritätsbedingungen
bei der Transformation ebenfalls beachtet werden sollten. Der Nutzer sollte die
Möglichkeit bekommen, Integritätsbedingungen - wie in I) bis III) definiert - zusammen
mit dem Relationenschema anzugeben. Der Algorithmus muß diese dann bei der
Umsetzung beachten und ausnutzen. Außerdem kann auch die Auswertung der
Schlüsselkandidaten in vielen Fällen hilfreich sein, denn die Tabellen können bei
Verwendung eines anderen Primärschlüssels völlig anders klassifiziert werden. Als
Beispiel soll die oben genannte Tabelle STG betrachtet werden: Nimmt man hier die
Attribute MtkNr, Semester und Stg als Primärschlüssel, so wird das Attribut Stg als
Primärschlüsselattribut behandelt. Relation STG hat dann zwei Primärschlüsselattribute
(MtkNr und Stg) und kann somit nicht als schwache Entity-Relation, sondern nur als
spezielle Beziehungs-Relation klassifiziert werden. Das EER-Schema hätte dann
folgendes „ideale“ Aussehen:
- 35 -
MtkNr
SOS
Stg
STG
K_STG
Semester
Semester
2.13 Wie arbeiten die anderen Algorithmen ?
Im Unterschied zu Chiang verlangt der Algorithmus von Batini/Ceri/Navathe [3] neben
der Angabe von Primärschlüsseln auch die Nennung aller Fremdschlüssel und
Schlüsselkandidaten. Anhand der Primärschlüssel und deren Vergleich werden die
Relationen des eingegebenen Schemas in die Klassen „primary“, „weak primary“ und
„secondary relation“ unterteilt. Dabei ist die Klasse der „secondary“-Tabellen analog zu
den beiden Beziehungs-Relationen in Chiangs Algorithmus (s.o.). Alle Schlüssel werden
nach der Klassifikation miteinander verglichen, um über Namensgleichheit Beziehungen
zu finden. Auch dieses Vorgehen ist dem von Chiang sehr ähnlich, jedoch hat der Nutzer
keine vom Verfahren vorgesehene Eingriffsmöglichkeit. „Primary relations“ werden
anschließend in Entities, „secondary relations“ in Beziehungen umgesetzt. Wie bei
Chiang werden Tabellen der Kategorie „weak primary“ im EER-Modell als schwache
Entities mit zugehöriger „is a“-Beziehung dargestellt. Weitere Beziehungen werden aus
den Bedingungen zur referentiellen Integrität bei Fremdschlüsseln gefolgert.
Der Vorteil dieses Verfahrens gegenüber dem Algorithmus von Chiang ist, daß der
Anwender zu keinem Zeitpunkt vor einem Entscheidungszwang steht. Erkauft wird dies
aber damit, daß zu Beginn sämtliche Schlüssel und Schlüsselkandidaten angegeben
werden müssen. Gerade das Finden von Schlüsselkandidaten stellt einen Anwender vor
größere Probleme. Leider hat er später keine Möglichkeit, den ablaufenden Algorithmus
zu beeinflussen. Dafür versucht der Algorithmus anhand der Schlüsselkandidaten einen
Primärschlüssel zur bearbeiteten Relation zu finden, der mit dem Primärschlüssel einer
anderen Relation übereinstimmt, um so eventuell vorhandene Beziehungen zu finden.
- 36 -
Jedoch geht dieses Verfahren wieder von der oben kritisierten Annahme aus, daß
Namensgleichheit auf Inhaltsgleichheit schließen läßt.
Die Verfahren von Johannesson/Kalman [10] und Markowitz/Makowsky [13] sind
völlig analog zu dem von Batini/Ceri/Navathe [3]. Einziger Unterschied zwischen diesen
Algorithmen ist, daß in [10,13] zusätzlich zu den Schlüsseln und Schlüsselkandidaten
auch alle Abhängigkeiten eingegeben werden müssen, ohne daß das Verfahren wie bei
Chiang Heuristiken liefert, die derartige Abhängigkeiten vermuten können. Anhand
dieser Inklusionen werden (wie bei Chiang) weitere Beziehungen gebildet, Klassifikation
und Umsetzung der Tabellen verlaufen aber genauso wie in [3]. Vor- und Nachteile
entsprechen ebenfalls denen des Verfahrens aus [3].
Input des Verfahrens von Navathe/Awong [16] sind neben dem Relationenschema
auch die Angabe von Primär- und Fremdschlüsseln sowie die Definition der
Abhängigkeiten zwischen den Tabellen. Die Klassifikation der Tabellen und Attribute ist
mit der bei Chiang [4,5] identisch. Bei Erzeugung des EER-Diagramms werden zuerst
die Relationen umgesetzt, bevor anhand der eingegebenen Fremdschlüssel und
Abhängigkeiten weitere Beziehungen in das Schema eingefügt werden. Gibt es bei der
Umsetzung der Fremdschlüssel mehrere Relationen, deren Primärschlüssel zu dem
Fremdschlüssel der betrachteten Tabelle paßt, so muß der Anwender eine auswählen.
Außerdem hat er Einfluß auf die Bildung von Spezialisierungen/Generalisierungen, indem
er die entstandenen Entities gruppieren und einordnen kann.
Der Algorithmus aus [16] entspricht nahezu vollständig dem aus [4,5]. Auch hier
werden vom Anwender sehr viele Eingaben verlangt. Jedoch können Navathe/Awong
nicht ganz soviele Informationen ermitteln und verarbeiten wie der Algorithmus von
Chiang. Es fehlen zum Beispiel Heuristiken, die dem Anwender die Eingabe von
Abhängigkeiten erleichtert. Während Aggregationen überhaupt nicht erkannt werden,
müssen Spezialisierungen/Generalisierungen vom Nutzer angegeben werden.
Auch im Verfahren von Davis/Arora [7] werden Relationen und Attribute in
dieselben Klassen eingeteilt wie bei Chiang [4,5]. Jedoch verwenden Davis/Arora als
Zielmodell ein „einfaches“ ER-Modell mit Entities und Beziehungen. Aggregationen oder
Spezialisierungen/Generalisierungen entstehen in diesem Algorithmus nicht.
- 37 -
Ein Problem, das allen hier besprochenen Verfahren angelastet werden kann, ist, daß
die entstehenden ER-Schemata sehr eng an das ursprüngliche Relationenschema
gebunden sind und somit meist nur die physikalisch vorhandene Datenbank
repräsentieren. Gewünscht wird hingegen ein leicht verständliches Schema, das
unabhängig von der Implementation ist. Vor allem auf den Algorithmus aus [7] trifft
dieses Kriterium zu. Hier werden Entities und Beziehungen rein aufgrund des
eingegebenen relationalen Schemas erzeugt, so daß ein ER-Diagramm entsteht, das nur
die physikalische Implementation der Datenbank grafisch darstellt und somit nicht den
Erwartungen des Anwenders entspricht. Für ein Relationenschema wie
Person
(Name, Straße, Ort)
Mitarbeiter
(Mitarbeiternr, Gehalt, Name)
Kunde
(Kundennr, Name),
bei dem ein Schema der Form
Name, Straße, Ort
Mitarbeiternr, Gehalt
Person
Mitarbeiter
Kunde
Kundennr
gewünscht wird, entsteht im Gegensatz dazu das Schema
Name, Straße, Ort
Mitarbeiternr, Gehalt
Person
ist
ist
Mitarbeiter
Kunde
Kundennr
Die Information, daß es sich hierbei um eine partielle überlappende Generalisierung
(Mitarbeiter können auch Kunden sein!) handelt, geht verloren.
Der Algorithmus von Shoval/Shreiber [19], der ein „Binary Relationship Model“
erstellt, verlangt als Eingabedaten das Relationenschema und die Primärschlüssel.
Wahlweise können auch Fremdschlüssel, Schlüsselkandidaten und Abhängigkeiten
angegeben werden. Das spätere Schema wird dann umso besser und gehaltvoller, je mehr
Informationen
der
Anwender
eingeben
kann.
Damit
alle
wichtigen
- 38 -
Integritätsbedingungen der Datenbank im Schema veranschaulicht werden, ist besonders
die Eingabe von Abhängigkeiten und Fremdschlüsseln zwingend. Alle Nutzereingaben
werden durch Datenbank-Anfragen überprüft und eventuell wieder verworfen. Die
Relationen werden nach Anzahl und Art der Attribute im Primärschlüssel klassifiziert und
umgesetzt. Diese Klassifikation ist allerdings sehr schwer verständlich und kaum
nachvollziehbar. Die Bildung zusätzlicher Beziehungen ergibt sich aus den angegebenen
Abhängigkeiten. Sämtliche Nutzerkommunikation wickelt das Verfahren aus [19] vor
Beginn der Umsetzung ab. Der Vorteil daran ist, daß der Algorithmus automatisch
abläuft, obwohl der Anwender großen Einfluß nehmen kann.
Wenguang/Carlson/Dreyer [23] verlangen in ihrem Verfahren neben dem
Relationenschema auch die Eingabe sämtlicher Inklusionen. Der Algorithmus soll dann
rekursiv die verschiedenen Ebenen eines sogenannten „Nested ER-Models“ erzeugen.
Jedoch ist das Verfahren zu kurz beschrieben. Das ungewöhnliche Zielmodell läßt sich
zwar gut in grafischer Form ausgeben, ist aber nicht so leicht zu lesen wie ein EERSchema, weil nicht alle Informationen in einer Stufe sichtbar sind.
Einen ganz anderen Weg als die bisher beschriebenen Verfahren geht der
Algorithmus aus [17] von Petit/Kouloumdjian/Boulicaut/Toumani: Hier werden
Anfragen dazu benutzt, die Eigenschaften einer relationalen Datenbank zu ermitteln.
Erwartet wird als Input das Relationenschema und alle „unique“- und „not null“Eigenschaften
der
Attribute.
Diese
werden
als
Kennzeichen
für
mögliche
Schlüsselattribute verwendet. Über Anfragen werden dann die Tabellen untersucht und in
die verschiedenen Elemente eines EER-Modells umgesetzt. Dazu wird eine SQL-Anfrage
vom System erzeugt, in der zwei Relationen über einen „Join“ miteinander verbunden
werden. Der Anwender muß entscheiden, ob diese Anfrage sinnvoll ist oder nicht, indem
er das Ergebnis der Anfrage angezeigt bekommt. Der Join einer „sinnvollen“ Anfrage
wird dann vom Verfahren genauer untersucht: Besteht der Join aus allen Attributen der
Primärschlüssel der ersten wie auch der zweiten Tabelle, so wird eine Beziehung
angenommen. Die genaue Art der Beziehung wird über weitere Anfragen ermittelt, die
der Algorithmus bildet. Sie zählen die Anzahl der Datensätze in den einzelnen Tabellen
bzw. die Datensätze, die in beiden Tabellen vorhanden sind. Wenn z.B. kein einziger
Datensatz in beiden Relationen zu finden ist, so sind die Tabellen voneinander
unabhängig. Sind hingegen nicht alle Attribute des Primärschlüssels einer Relation an
- 39 -
dem Join beteiligt, so wird angenommen, daß es sich hierbei um ein schwaches Entity
handelt.
Der Algorithmus, der in [17] verwendet wird, enthält einige interessante Ideen.
Jedoch hat er den schwerwiegenden Nachteil, daß er vom jeweiligen Datenbank-Zustand
abhängig ist. Außerdem wird aus dem veröffentlichten Artikel nicht klar, wie die
Anfragen vom System erstellt werden und auf welche Weise das Verfahren „sinnvolle“
Joins findet.
Dieselben Probleme bereitet auch das Verfahren von Andersson [2]. Andersson
benutzt Programme, die Daten der Relationen manipulieren oder Daten selektieren. Als
Eingabe wird der Quellcode von Programmen erwartet, die mit der Datenbank arbeiten.
Aus diesen schneidet der Algorithmus die SQL-Anweisungen heraus und ermittelt die
Eigenschaften der Tabellen mit diesen Anweisungen. Das Verfahren ist an dieser Stelle
mit dem in [17] veröffentlichten vergleichbar, weshalb auch die gleichen Probleme
auftauchen.
Die besonderen Eigenschaften der Verfahren sollen in folgender Tabelle noch einmal
der Übersicht halber dargestellt werden:
(Soweit nichts anderes angegeben wird, ist die Ausgabe ein Schema in oben
erläutertem EER-Modell)
- 40 -
Verfahren
Chiang [4,5]
Input
Schema in 3.NF
Primärschlüssel
Datensätze in DB
empfohlen: Fremdschl.
Batini [3]
Schema in 3. NF
Primärschlüssel
Fremdschlüssel
Schlüsselkandidaten
Johannesson [10], Schema in 3. NF
Markowitz [13]
Primärschlüssel
Fremdschlüssel
Schlüsselkandidaten
Abhängigkeiten
Navathe [16]
Schema in 3. NF
Primärschlüssel
Fremdschlüssel
Abhängigkeiten
Davis [7]
Shoval [19]
Wenguang [23]
Petit [17]
Andersson [2]
Umsetzung
Besonderheiten
Klassifikation der
Relationen in vier
Klassen
Viel Kommunikation
mit dem Anwender
Heuristiken zum Finden
von Abhängigkeiten
Keine Einflußnahme
durch den Anwender
möglich
Klassifikation in
drei Klassen
wie in [3]
Klassifikation in
vier Klassen, wie
in [4,5]
wie in [3], aber
Abhängigkeiten geben
weitere Beziehungen
vor
Keine automatische
Bildung von
Spezialisierungen oder
Aggregationen, müssen
von Anwender
eingegeben werden
Schema in 3. NF
Klassifikation in
Ziel ist ER-Schema
Primärschlüssel
vier Klassen, wie ohne Erweiterungen
Abhängigkeiten
in [4,5]
(wie z.B.
Aggregationen)
Schema in 3. NF
Klassifikation der Ziel ist „Binary
Primärschlüssel
Relationen anhand Relationship Model“
empfohlen: Fremdschl. ihrer Primärschl.
Überprüfung aller
Abhängigkeiten
Nutzereingaben durch
optional:
DB-Anfragen
Schlüsselkandidaten
Nutzerkommunikation
vor Beginn des
Algorithmus
Schema in 3. NF
Rekursive
Ziel ist „Nested ERPrimärschlüssel
Erzeugung der
Model“
Abhängigkeiten
Ebenen des
Zielmodells
Schema in 3. NF
Joins „sinnvoller“ Völlig andere
„unique“Anfragen werden Vorgehensweise bei der
Eigenschaften
untersucht
Umsetzung
„not null“-Eigensch.
Abhängigkeit vom DBZustand
Quellcode von
Untersuchung der wie in [17]
Programmen, die mit Anfragen wie bei
DB arbeiten
Petit [17]
- 41 -
3 Lösungsansatz
Im vorherigen Kapitel wurde gezeigt, auf welche Weise in bereits veröffentlichten
Verfahren das Problem des „Reverse Engineering“ gelöst wird. Der Vergleich basierte
dabei hauptsächlich auf dem Verfahren von Chiang [4,5], welches sich als das bisher
beste herauskristallisierte. Aus diesem Grund soll auch in diesem Kapitel dieser
Algorithmus, der in Kapitel 2 ausführlich dargestellt wurde, die Grundlage bilden. Wie
bereits gezeigt wurde, läßt sich Chiangs Verfahren an einigen Stellen verbessern. Bei der
Erstellung eines eigenen Verfahrens sollen möglichst viele Probleme behoben und vor
allem die Arbeit des Anwenders weiter erleichtert werden.
Eine Möglichkeit, den Nutzer zu entlasten, ist dabei, Heuristiken anzugeben, die
mögliche Schlüsselattribute suchen. Viele Datenbanksysteme (wie z.B. Informix) haben
keine Möglichkeit, in der relationalen Datenbank Schlüssel zu vergeben. Hingegen
verwenden sie Indexe, die „unique“- und „not null“-Bedingungen enthalten können. Mit
Hilfe dieser Informationen, die wie das Schema ohne weiteres aus dem Datenbanksystem
auszulesen sind, lassen sich Vermutungen über mögliche Schlüssel formulieren. Der
Anwender kann dann diese Vermutungen bestätigen oder verwerfen. Über DatenbankAnfragen können derartige Vermutungen genauso wie auch Vermutungen über
Abhängigkeiten überprüft werden. Es ist jedoch zu beachten, daß diese Prüfung immer
abhängig vom jeweiligen Datenbank-Zustand ist.
Weiterhin würde die Beachtung von Integritätsbedingungen das EER-Schema
erheblich aussagekräftiger gestalten. Allerdings müßten diese, sofern sie nicht (wie in
Oracle) in der relationalen Datenbank definiert werden, vom Anwender eingegeben
werden, denn über Heuristiken sind viele Integritätsbedingungen nicht zu finden.
Schwierig ist auch die Beachtung von Schlüsselkandidaten. Das angestrebte
Verfahren muß hier Kriterien finden, nach denen es einen geeigneten Primärschlüssel aus
den Schlüsselkandidaten auswählt.
- 42 -
3.1 Ermitteln von Primär- und Fremdschlüsseln
Auch in der eigenentwickelten Strategie zum „Reverse Engineering“ soll vorausgesetzt
werden, daß die relationale Datenbank in der dritten Normalform vorliegt. Mit dieser
Voraussetzung wird man davor bewahrt, daß innerhalb einer Relation noch funktionale
Abhängigkeiten beachtet werden müssen, die durch die Definition eines Primärschlüssels
oder Schlüsselkandidaten nicht abgedeckt werden.
Werden Schlüssel-Definitionen im Datenbank-System gespeichert, so ist es möglich,
diese Definitionen einfach aus der Datenbank auszulesen. Sonst muß der Anwender die
Schlüssel jeder Tabelle bestimmen. Der Algorithmus soll aber den Anwender durch
Heuristiken unterstützen:
Primärschlüssel zu finden ist kein einfaches Unterfangen. Werden in der Datenbank
Indexe angelegt, so kann die Definition eines „unique“-Indexes darauf hinweisen, daß die
Attribute dieses Indexes ein Schlüsselkandidat für die Relation ist. Um weitere
Schlüsselkandidaten zu vermuten, können Anfragen gestellt werden. Ist jeder Wert der
Ergebnismenge dabei nur genau einmal vorhanden („unique“), so hat man eventuell einen
Schlüsselkandidaten gefunden. Die Suche nach diesem Prinzip läuft also auf den
Vergleich der Ergebnismengen folgender Anfragen hinaus:
A:={SELECT <Attribut> FROM <Tabelle>}
B:={SELECT DISTINCT <Attribut> FROM <Tabelle>}
WENN (A=B), DANN vermute <Attribut> als Schlüsselkandidaten
Mit einer Anfrage kann man formulieren:
SELECT COUNT(*) INTO z FROM <Tabelle> GROUP BY <Attribut>
HAVING COUNT(*)>1
WENN (z<2), DANN vermute <Attribut> als Schlüsselkandidaten
Problematisch ist dabei, daß <Attribut> auch die Kombination mehrerer Attribute der
Tabelle sein kann. Bei Tabellen mit vielen Attributen bekommt man derart viele
Kombinations-Möglichkeiten, daß der Sinn einer Überprüfung nach obigem Verfahren
eher zweifelhaft erscheinen muß. Jedoch liefert die Definition von Indexen nicht
hinreichend Hinweise auf mögliche Primärschlüssel. Wenn der Anwender die
Primärschlüssel
nicht
kennt,
so
ist
also
dieser
Weg
zur
Ermittlung
der
Schlüsselkandidaten der einzig mögliche. Abhilfe bietet hier nur der Weg, den Anwender
- 43 -
bestimmen zu lassen, welche Attribut-Kombinationen getestet werden sollen. Man muß
allerdings - wie bereits oben bemerkt - beachten, daß das Verfahren auf Anfragen
zurückgreift, deren Ergebnismenge vom Zustand der Datenbank abhängig ist.
Etwas einfacher ist das Finden von Fremdschlüsseln. Hier liefert die Namensgebung
Hinweise auf mögliche Zusammenhänge. Hat ein Attribut bzw. eine Menge von
Attributen gleiche Namen wie der bzw. die Attribute des Primärschlüssels oder eines
Schlüsselkandidaten einer anderen Tabelle, so kann zwischen den Attributen eine
Beziehung vermutet werden. Über Anfragen können die Inhalte auf Unterschiede geprüft
werden. Werden Unterschiede gefunden, so kann es sich um keine FremdschlüsselBeziehung handeln.
A:={SELECT DISTINCT <Primärschlüssel P> FROM <Tabelle1>}
B:={SELECT DISTINCT <Fremdschlüssel F> FROM <Tabelle2>}
WENN (B⊄A), DANN verwerfe Fremdschlüssel-Vermutung
SONST merke Abhängigkeit <Tabelle1.F>→<Tabelle2.P>
Wiederum läßt sich dies auch in einer Anfrage formulieren:
SELECT COUNT(*) INTO z FROM <Tabelle1>
WHERE NOT EXISTS (
SELECT <Primärschlüssel P> FROM <Tabelle2>
WHERE <Tab2>.<Primärschl. P>=<Tab1>.<Fremdschl. F>
)
WENN (z>0), DANN verwerfe Fremdschlüssel-Vermutung
SONST merke Abhängigkeit <Tabelle1.F→Tabelle2.P>
Diese Überprüfung eines Fremdschlüsselverdachtes ist allerdings vom DatenbankZustand abhängig. Deshalb sind Fremdschlüssel-Vermutungen, die diesem Test
standhalten, keineswegs zwangsläufig zutreffend. Vielmehr muß der Anwender den
Verdacht prüfen.
Zu beachten ist, daß auch Attribute, die zu einem Schlüsselkandidaten oder dem
Primärschlüssel einer Tabelle gehören, gleichzeitig zu einem Fremdschlüssel gehören
können.
Eine weitere Idee, mögliche Primärschlüssel oder Fremdschlüssel zu finden, kann
man aus dem Verfahren von Petit [17] adaptieren: Wenn dem Nutzer einige Anfragen
aus Programmen, die mit der relationalen Datenbank arbeiten, bekannt sind, so können
anhand der Selektionsbedingungen Primärschlüssel und Fremdschlüssel vermutet werden.
- 44 -
Sei also beispielsweise die folgende Anfrage vorgegeben:
SELECT <beliebige Attribute> FROM A,B
WHERE A.a1=B.b1 AND A.a2=B.b2
A und B sind dabei selbstverständlich Tabellen, a1,a2,b1,b2 beliebige Attribute in
Relation A bzw. B. Aus dieser Anfrage kann nun gefolgert werden, daß zwischen den
Tabellen A und B eine Beziehung besteht. Wenn durch weitere Anfragen (wie oben)
herausgefunden wird, daß die Ergebnisse von (a1∪a2) bzw. von (b1∪b2) eindeutig sind,
so wird angenommen, daß a1 und a2 bzw. b1 und b2 den Primärschlüssel der Relation A
bzw. B bilden und die jeweils anderen beiden Attribute Fremdschlüssel sind.
Alle derartigen Vermutungen müssen durch den Anwender überprüft und
gegebenenfalls korrigiert werden. Nur der Anwender hat die Möglichkeit, einen
Schlüssel-Verdacht zu prüfen, weil kein Verfahren anhand von Anfragen mit Sicherheit
herausfinden kann, daß bestimmte Attribute einer Relation einen Schlüsselkandidaten
bilden. Durch Ausgabe der Ergebnismengen kann das Verfahren dem Nutzer aber die
Entscheidung
erleichtern.
Außerdem
obliegt
es
dem
Benutzer,
aus
allen
Schlüsselkandidaten einen Primärschlüssel auszuwählen. Dies ist für die Klassifikation
der Relationen wichtig. Die weiteren Schlüsselkandidaten sollten jedoch dabei keinesfalls
in Vergessenheit geraten, um dem Anwender bei der Klassifikation anzuzeigen, welche
Konsequenzen die Wahl eines anderen Primärschlüssels auf das Ergebnis des Verfahrens
hätte.
Wenn hingegen auch die Wahl des Primärschlüssels aus einer Reihe von
Schlüsselkandidaten durch das Verfahren vorgenommen werden soll, so sind folgende
Kriterien (in der Reihenfolge ihrer Wichtigkeit) zu beachten:
1. Schlüsselkandidat erscheint auf der rechten Seite einer Abhängigkeit.
2. Schlüsselkandidat besteht zum Teil aus Fremdschlüsselattributen.
3. Schlüsselkandidat besteht aus wenigen Attributen.
Je besser bzw. häufiger diese Kriterien auf einen Schlüsselkandidaten zutreffen, desto
eher handelt es sich dabei um den Primärschlüssel der Relation.
Unabhängig davon, ob Fremdschlüssel vom Verfahren oder vom Anwender
angegeben werden, müssen die entsprechenden Abhängigkeiten definiert werden. Dies
bedeutet, daß der Nutzer, wenn er die Fremdschlüssel der Tabellen selbst definiert, auch
die Relation angeben muß, auf die der Fremdschlüssel verweist.
- 45 -
Alle weiteren Integritätsbedingungen, die in der relationalen Datenbank gelten,
können nicht aus dem Relationenschema abgeleitet werden. Sie werden im DatenbankBetrieb entweder durch Programme, oder bestenfalls durch die Definition sogenannter
„Trigger“ sichergestellt. Leider ist aber nicht bei allen Datenbank-Management-Systemen
die
Möglichkeit
gegeben,
Trigger
zur
Einhaltung
von
zusätzlichen
Integritätsbedingungen zu verwenden.
Wenn Trigger in einer relationalen Datenbank definiert wurden, so lassen sich diese
einfach aus den Systemtabellen der Datenbank auslesen und so weiterverwenden. Ihre
Auswertung soll allerdings nicht Gegenstand dieser Arbeit werden. Anderenfalls gibt es
leider
keine
andere
Möglichkeit,
als
den
Anwender
aufzufordern,
die
Integritätsbedingungen einzugeben.
3.2 Klassifikation der Relationen und Attribute
Nach den vorhergehenden Überlegungen soll nun in den folgenden Abschnitten davon
ausgegangen werden, daß sowohl Primär- als auch Fremdschlüssel der Relationen
bekannt sind.
Die Definition der Primärschlüssel jeder Relation im vorhergehenden Schritt bildet
die Grundlage für die Klassifikation. Dabei ist zu beachten, daß die Auswahl des
Primärschlüssels aus einer Reihe von Schlüsselkandidaten die Klassifikation und damit
auch das folgende Verfahren erheblich beeinflussen kann, denn je nach Wahl wird aus der
Relation beispielsweise entweder ein Entity oder eine Beziehung erzeugt. Das
Programm,
deren
Entwicklung
in
Kapitel
3.2
ansteht,
sollte
anhand
der
Schlüsselkandidaten auf die unterschiedlichen Klassifikations-Möglichkeiten hinweisen.
Teile des Primärschlüssels einer Relation können gleichzeitig als Fremdschlüssel
fungieren. Dieses ist ein wichtiges Kriterium bei der Klassifikation:
Besteht der Primärschlüssel P der Relation A ausschließlich aus Attributen, die nicht
Bestandteil eines beliebigen Fremdschlüssels von A sind, so repräsentiert A ein starkes
Entity. In Anlehnung an Chiangs Algorithmus wird A dann „starke Entity-Relation“
(SER) genannt.
- 46 -
Zum Beispiel sind „Student“ und „Professor“ starke Entity-Relationen:
Student
(Matrikelnr, Name, Straße, Ort)
Professor
(Name, Gehalt, Fachbereich)
Student
Professor
Ebenso einfach ist die Klassifikation, wenn der Primärschlüssel von A ausschließlich aus
Fremdschlüsseln zusammengesetzt ist. In diesem Fall ist es naheliegend, daß A eine
Beziehung repräsentiert. Relation A wird dann als „reguläre Beziehungs-Relation“
(RBR) bezeichnet.
Die Relation „Betreuung“ ist zum Beispiel eine solche RBR, denn der
Primärschlüssel besteht ausschließlich aus Fremdschlüsseln, die auf die oben genannten
Tabellen „Student“ und „Professor“ verweisen.
Betreuung
(Matrikelnr→Student, ProfName→Professor, Beginn, Ende)
Betreuung
Ein Sonderfall muß an dieser Stelle berücksichtigt werden: Es gibt Relationen, deren
Primärschlüssel aus nur einem Fremdschlüssel zusammengesetzt ist. Dies ist in
Generalisierungen der Fall sowie in binären Beziehungen, bei denen nur Kardinalitäten
(1,1) auftreten. Die gespeicherten Abhängigkeiten können dann weitere Hinweise auf die
geeignete Umsetzung geben. Hier sollen derartige Relationen lediglich als „besondere
Entity-Relationen“ (BER) klassifiziert werden.
Tabelle „Manager“ ist eine BER. Der Primärschlüssel „Mitarbeiternr“ von
„Manager“ ist gleichzeitig sein einziger Fremdschlüssel. Er verweist auf Relation
„Mitarbeiter“ mit dem gleichen Primärschlüssel „Mitarbeiternr“. Würde auch
„Mitarbeiternr“ in „Manager“ als Fremdschlüssel klassifiziert werden, so würde eine
binäre Beziehung zwischen „Mitarbeiter“ und „Manager“ vorliegen. In diesem Fall
handelt es sich hingegen um eine Spezialisierung:
- 47 -
Mitarbeiter
(Mitarbeiternr, Name, Gehalt)
Manager
(Mitarbeiternr→Mitarbeiter, Arbeitsbereich)
Mitarbeiter
Manager
Schwieriger wird es, eine geeignete Klassifikation für Tabellen zu finden, deren
Primärschlüssel nur zum Teil aus Fremdschlüsseln besteht. Ohne Nutzerkommunikation
ist es dann nicht möglich zu unterscheiden, ob eine Relation A eine Beziehung oder ein
schwaches Entity repräsentiert. Da in EER-Schemata schwache Entities mit mehreren
Eigentümern aber eher selten anzutreffen sind, gehen wir in der Regel davon aus, daß A
als eine Beziehung dargestellt werden soll, wenn sein Primärschlüssel mehrere
Fremdschlüssel enthält. Das Verfahren unterscheidet also analog zu Chiangs Algorithmus
wie folgt:
Wenn der Primärschlüssel von A genau einen Fremdschlüssel enthält, so klassifiziere
A als „schwache (weak) Entity-Relation“ (WER).
Zum Beispiel ist „Projekt“ (siehe Kapitel 2) eine WER, denn „Abteilnr“ ist ein
Fremdschlüssel und verweist auf Tabelle „Abteilung“. „Abteilung“ ist also der
Eigentümer von „Projekt“.
Projekt
(Abteilnr→Abteilung, Projektnr, Projname)
Projekt
Wenn der Primärschlüssel von A mehrere Fremdschlüssel enthält, so klassifiziere A als
„spezielle Beziehungs-Relation“ (SBR). Die Attribute des Primärschlüssels von A, die
nicht zu einem Fremdschlüssel gehören, bilden dann den Primärschlüssel eines neuen
Entities, das Teilnehmer an der repräsentierten Beziehung ist.
Enthält zum Beispiel der Primärschlüssel von Tabelle „Projekt“ zusätzlich ein
Attribut „Standort“, das auf eine weitere Relation „Ort“ verweist, so wird „Projekt“ als
SBR klassifiziert.
Projekt
(Abteilnr→Abteilung, Standort→Ort, Projektnr, Projname)
betreut
Projekt
- 48 -
Bei dieser Art der Klassifikation sollte aber keinesfalls vergessen werden, daß auch
Tabellen als schwache Entity-Relationen klassifiziert werden, die sinnvoller als spezielle
Beziehungs-Relationen behandelt werden sollten, und umgekehrt. Die Entscheidung,
welche Klassifikation die bessere ist, muß aber letztlich beim Anwender bleiben.
Weiterhin ist gerade hier die Wahl des Primärschlüssels aus einer Reihe von
Schlüsselkandidaten von entscheidender Bedeutung, denn oft ist es möglich, ein Attribut
des Primärschlüssels durch ein anderes auszutauschen, das dann unter Umständen ein
Fremdschlüssel der Tabelle ist. Bestes Beispiel hierfür ist die Umsetzung der Tabelle
„STG“ aus Kapitel 2.
Die Klassifikation der Attribute ist im Gegensatz zur Tabellen-Klassifikation
eindeutig. Hier sollen aber die Klassen, in die die Attribute eingeordnet werden, etwas
anders definiert werden als bei Chiang. So soll zum Beispiel die Definition von
„Primärschlüsselattributen“ analog zur allgemein gebräuchlichen Art erfolgen:
Sei also a ein Attribut aus Relation A mit Primärschlüssel P. Alle Attribute a∈P
werden „Primärschlüsselattribute“ genannt. Alle Attribute, die zu einem Fremdschlüssel
gehören, bezeichnet man als „Fremdschlüsselattribute“. Diese Klassen sind nicht
exklusiv, das heißt es gibt Attribute, die sowohl Primär- als auch Fremdschlüsselattribute
sind. Zum Beispiel sind bei regulären Beziehungs-Relationen alle Primärschlüsselattribute
gleichzeitig Fremdschlüsselattribute.
Die Primärschlüsselattribute einer schwachen Entity-Relation, die nicht zu einem
Primärschlüssel eines Eigentümers gehören, werden als „hängende Schlüsselattribute“
bezeichnet. Ein „allgemeines Schlüsselattribut“ ist Bestandteil des Primärschlüssels einer
speziellen Beziehungs-Relation, gehört aber zu keinem Primärschlüssel einer weiteren
Tabelle. Alle anderen Attribute werden als „Nichtschlüsselattribute“ bezeichnet.
Bei Betrachtung obiger Tabellen werden folgende Klassifikationen vorgenommen:
Student
(Matrikelnr, Name, Straße, Ort)
„Matrikelnr“ ist Primärschlüsselattribut, „Name“, „Straße“ und „Ort“ sind
Nichtschlüsselattribute.
- 49 -
Professor
„Name“
ist
(Name, Gehalt, Fachbereich)
Primärschlüsselattribut,
„Gehalt“
und
„Fachbereich“
sind
Nichtschlüsselattribute.
Betreuung
„Matrikelnr“
(Matrikelnr→Student, ProfName→Professor, Beginn, Ende)
und
„ProfName“
sind
gleichzeitig
Primärschlüssel-
und
Fremdschlüsselattribute, „Beginn“ und „Ende“ sind Nichtschlüsselattribute.
Projekt1
(Abteilnr→Abteilung, Projektnr, Projname)
„Abteilnr“ ist Primär- und Fremdschlüsselattribut, „Projektnr“ ist ein hängendes
Schlüsselattribut. „Projname“ ist ein Nichtschlüsselattribut.
Projekt2
(Abteilnr→Abteilung, Standort→Ort, Projektnr, Projname)
Wie eben ist „Abteilnr“ gleichzeitig Primär- und Fremdschlüsselattribut. Ebenso
wird „Standort“ klassifiziert. „Projektnr“ ist ein allgemeines Schlüsselattribut,
„Projname“ ein Nichtschlüsselattribut.
Auch auf diese Klassifikation hat die Auswahl des Primärschlüssels aus einer Menge
von Schlüsselkandidaten erheblichen Einfluß, der nicht vernachlässigt werden darf.
3.3 Erzeugung eines (E)ER-Schemas
Im Folgenden soll I die Menge aller Inklusionen sein, die in Kapitel 3.1.1 gefunden bzw.
durch den Anwender eingegeben wurden. Es ist einfacher, für die Erstellung von
Beziehungen nicht die Namensgleichheit von Attributen im Relationenschema als
Kriterium heranzuziehen, denn namensgleiche Attribute verschiedener Tabellen wurden
schon in 3.1.1 auf Abhängigkeiten hin geprüft. Stattdessen sollte die Menge der
Abhängigkeiten untersucht werden.
Weiterhin sei ER:=SER∪WER∪BER die Menge aller Entity-Relationen, die Menge
aller Beziehungs-Relationen sei BR:=RBR∪SBR.
- 50 -
3.3.1 Starke Entity-Relationen
Die Objekte, die am leichtesten zu identifizieren sind, sind die starken Entities. Diese
werden einfach aus den starken Entity-Relationen erzeugt, wobei die Primärschlüssel der
Tabellen auch Primärschlüssel in den Entities werden. Alle Nichtschlüsselattribute der
Relationen werden den jeweiligen Entities zugeordnet. Fremdschlüsselattribute dienen
der Identifikation von Beziehungen und werden nicht in das EER-Schema aufgenommen.
Sei
Alg1)
A∈SER
mit
Primärschlüssel
P,
N
sei
die
Menge
der
Nichtschlüsselattribute von A. Dann erzeuge ein starkes Entity namens A mit
Primärschlüssel P und weise alle Attribute von N dem neuen Entity zu.
Beispiel:
Für die Tabelle
Student
(Matrikelnr, Name, Straße, PLZ→Ort)
wird das folgende Entity erzeugt:
Name
Matrikelnr
Student
Straße
Das Attribut „PLZ“ ist ein Fremdschlüssel, der auf eine andere Tabelle „Ort“ verweist.
Aus diesem Grund wird „PLZ“ bereits bei der Verarbeitung der Relation „Ort“ gemerkt
und muß hier nicht beachtet werden.
Ein weiteres Beispiel ist die Relation
Abteilung
(Abteilnr)
Sie wird in folgendes Schema umgesetzt:
Abteilnr
Abteilung
- 51 -
3.3.2 Besondere Entity-Relationen
Bei den besonderen Entity-Relationen (BER) wird zunächst die Tatsache
vernachlässigt, daß ihr Primärschlüssel gleichzeitig als Fremdschlüssel klassifiziert wurde.
Alle Relationen dieser Klasse werden wie starke Entity-Relationen behandelt: Aus ihnen
werden starke Entities erzeugt.
3.3.3 Schwache Entity-Relationen
Nachdem alle starken und besonderen Entity-Relationen umgesetzt worden sind,
werden die schwachen Entity-Relationen ausgewertet. Für jede Tabelle, die dieser Klasse
angehört, wird ein schwaches Entity erzeugt, dessen Primärschlüssel aus den hängenden
Schlüsselattributen der Relation besteht. Der bzw. die Eigentümer werden aufgrund der
Abhängigkeiten in der Menge I wie folgt bestimmt:
Alg2)
Sei A∈WER mit Primärschlüssel P, H⊂P sei die Menge aller
hängenden
Schlüsselattribute
von
A,
M
die
Menge
der
sonstigen
Primärschlüsselattribute M=P\H, N die Menge der Nichtschlüsselattribute von A. Dann
erzeuge ein schwaches Entity namens A mit Primärschlüssel H und weise alle
Attribute von N dem neuen Entity zu.
Durchsuche dann die Menge der Inklusionen I nach Vorkommen von M auf der
linken Seite von Abhängigkeiten: Wenn (A.M→X.P)∈I mit beliebiger Tabelle X∈ER mit
Primärschlüssel P, dann ist X ein Eigentümer von A. Erstelle dann binäre Beziehung
‘ABHÄNGIG’
1
zwischen Entity A und dem Entity, das mit der Relation X
korrespondiert, also den Namen X hat.
Beispiel:
„Projekt“ ist eine WER (siehe oben). Es wird also ein schwaches Entity „Projekt“
erstellt, dessen Primärschlüssel das hängende Schlüsselattribut „Projektnr“ bildet. Das
weitere Primärschlüsselattribut „Abteilnr“ findet man in der Menge der Abhängigkeiten I
nur unter Projekt.Abteilnr→Abteilung.Abteilnr. Daher verweist „Abteilnr“ auf Tabelle
1
Da in einem EER-Schema die Namen von Entities und Beziehungen eindeutig sein müssen, werden
den „ABHÄNGIG“-Beziehungen ebenso wie den „SPEZIELL“-Entities die Relationennamen
angehängt, aus denen sie erzeugt wurden. Die „HAT“-Beziehungen werden durchnumeriert. Der
laufende Text wird durch Weglassen der Nummern bzw. Relationennamen vereinfacht.
- 52 -
„Abteilung“, die bereits in ein gleichnamiges starkes Entity umgewandelt worden ist.
„Abteilung“ ist also der einzige Eigentümer von „Projekt“.
Abteilung
(Abteilnr)
Projekt
(Abteilnr→Abteilung, Projektnr, Projname)
Abteilnr
Abteilung
ABHÄNGIG
Projektnr
Projekt
Projname
3.3.4 Spezielle Beziehungs-Relationen
Wenn alle Entity-Relationen verarbeitet worden sind, sollen die BeziehungsRelationen umgesetzt werden. Für die allgemeinen Schlüsselattribute einer Tabelle, die
als spezielle Beziehungs-Relation klassifiziert wurde, wird ein neues Entity erzeugt. Die
anderen Primärschlüsselattribute legen jene Entities fest, die neben dem neuen Entity an
der zu erzeugenden Beziehung teilnehmen.
Alg3)
allgemeinen
Sei A∈SBR mit Primärschlüssel P, H⊂P sei die Menge aller
Schlüsselattribute
von
A,
M
die
Menge
der
sonstigen
Primärschlüsselattribute M=P\H, N sei die Menge der Nichtschlüsselattribute von A.
Dann erzeuge ein starkes Entity namens ‘SPEZIELL’ mit Primärschlüssel H und
weise alle Attribute von N dem neuen Entity zu.
Erzeuge anschließend eine n-fache Beziehung namens A, an der alle Entities
einer Menge W teilnehmen. W wird wie folgt initialisiert: W:=‘SPEZIELL’. Überprüfe
für alle Relationen R∈ER, ob der Primärschlüssel Q von R Teil des Primärschlüssels
von A ist, ob also Q⊂M gilt. Ist dies der Fall, so prüfe, ob (A.Q→R.Q)∈I gilt. Wenn
beide Bedingungen zutreffen, so nimmt das Entity, das mit Tabelle R korrespondiert,
an der Beziehung teil und es sei W:=W∪R.
Beispiel:
Die folgende Tabelle „Projekt“ ist eine derartige spezielle Beziehungs-Relation.
Zunächst wird ein Entity „SPEZIELL“ erzeugt, dessen Primärschlüssel das einzige
allgemeine Schlüsselattribut „Projektnr“ bildet. Die Primärschlüsselattribute „Abteilnr“
bzw. „Standort“ verweisen auf die Entities „Abteilung“ bzw. „Ort“, die bereits bei der
Umsetzung der starken Entity-Relationen erzeugt worden sind. An der neuen Beziehung
- 53 -
„Projekt“ nehmen also die Entities „Abteilung“, „Ort“ und „SPEZIELL“ teil. In der
Menge I müssen die Abhängigkeiten Projekt.Abteilnr→Abteilung.Abteilnr sowie
Projekt.Standort→Ort.Standort definiert sein. Das Nichtschlüsselattribut „Projname“
wird dem neuen Entity „SPEZIELL“ zugeordnet.
Abteilung
(Abteilnr)
Ort
(Standort, Mitarbeiterzahl)
Projekt
(Abteilnr→Abteilung, Standort→Ort, Projektnr, Projname)
(Die Namen, die im EER-Schema automatisch verwendet werden, sind an dieser Stelle
nicht sehr passend. Der Anwender sollte später die Namen ändern.)
Projektnr
Abteilnr
Abteilung
Projekt
SPEZIELL
Projname
Standort
Ort
Mitarbeiterzahl
Der Grund dafür, daß im Gegensatz zu Chiangs Verfahren hier als erstes die
Beziehungen erzeugt werden, die aus den speziellen Beziehungs-Relationen folgen, ist
bei Betrachtung obigen Beispiels leicht einzusehen:
Wenn eine weitere Tabelle
Mitarbeiter
(Name, Projektnr→Projekt)
existiert, so muß der Fremdschlüssel „Projektnr“ auf das Entity „SPEZIELL“
verweisen, denn „Projektnr“ ist ein allgemeines Schlüsselattribut in „Projekt“. Dieser
Verweis kann nur dann erzeugt werden, wenn die spezielle Beziehungs-Relation
„Projekt“ vorher verarbeitet worden ist. Derartige Abhängigkeiten, bei denen ein
Fremdschlüssel einer Entity-Relation auf allgemeine Schlüsselattribute einer speziellen
Beziehungs-Relation zeigen, können mit Chiangs Algorithmus nicht ausgewertet werden.
- 54 -
3.3.5 Reguläre Beziehungsrelationen
Analog zu den speziellen Beziehungs-Relationen werden auch die regulären BeziehungsRelationen umgesetzt. Bei diesen ist es aber nicht erforderlich, neue Entities zu erzeugen:
Sei
Alg4)
A∈RBR
mit
Primärschlüssel
P,
N
sei
die
Menge
der
Nichtschlüsselattribute von A. Erzeuge eine n-fache Beziehung namens A und weise
alle Attribute von N dieser neuen Beziehung zu. Um festzustellen, welche Entities an
der Beziehung teilnehmen, überprüfe (analog zu oben) für alle Relationen R∈ER, ob
der Primärschlüssel Q von R Teil des Primärschlüssels von A ist, ob also Q⊂P gilt. Ist
dies der Fall, so prüfe, ob (A.Q→R.Q)∈I gilt. Wenn beide Bedingungen zutreffen, so
nimmt das Entity, das mit Tabelle R korrespondiert, an der Beziehung teil und es sei
W:=W∪R. In der Menge W werden so alle Entity-Namen abgelegt, die an der
Beziehung A teilnehmen. Bei Erzeugung dieser Beziehung müssen also alle Entities
aus W durch A miteinander verbunden werden.
Beispiel:
Die Tabelle „Betreuung“ ist eine reguläre Beziehungs-Rel., deren Primärschlüssel die
beiden Teilnehmer der Beziehung, „Student“ und „Professor“, bestimmt. Dazu müssen
die Abhängigkeiten Betreuung.Matrikelnummer→Student.Matrikelnummer und
Betreuung.ProfName→Professor.Name in der Menge I vorhanden sein. Die
Nichtschlüsselattribute „Beginn“ und „Ende“ werden
der
neuen
Beziehung
„Betreuung“ zugeordnet.
Student
(Matrikelnr, Name, Straße, Ort)
Professor
(Name, Gehalt, Fachbereich)
Betreuung
(Matrikelnr→Student, ProfName→Professor, Beginn, Ende)
Matrikelnr
Name
Straße
Ort
Student
Betreuung
Beginn
Professor
Ende
Name
Gehalt
Fachbereich
- 55 -
3.3.6 Sonderfall bei Beziehungsrelationen
Einen Fall haben wir bei der Behandlung der Beziehungs-Relationen bisher außer
acht gelassen: Es ist denkbar (wenn auch ungewöhnlich), daß ein Primärschlüsselattribut
einer Beziehungs-Relation A∈BR gleichzeitig als Fremdschlüsselattribut klassifiziert
wurde, die Abhängigkeit in I aber auf eine spezielle Beziehungs-Relation verweist. Mit
den oben angegebenen Verfahren werden nur Entities als Teilnehmer an Beziehungen
erkannt, die aufgrund von Entity-Relationen entstanden sind. Der Fall, daß ein Entity,
das aus einer speziellen Beziehungs-Relation gebildet wurde, an einer Beziehung
teilnimmt, wurde bisher (wie bei Chiang) vernachlässigt.
Alg5)
Sei
also
M
eine
Menge
von
Primärschlüsselattributen
einer
Beziehungs-Relation A, die alle auch als Fremdschlüsselattribute klassifiziert wurden,
jedoch nicht auf eine Entity-Relation verweisen. Prüfe für jede Tabelle R∈SER, ob die
allgemeinen Schlüsselattribute Q von R Teil der Menge M sind, ob also Q⊂M gilt. Ist
dies der Fall, so prüfe, ob (A.Q→R.Q)∈I gilt. Trifft beides zu, dann ist das Entity
‘SPEZIELL’, das aufgrund der speziellen Beziehungs-Relation R entstanden ist und
an der Beziehung, die mit R korrespondiert, teilnimmt, Bestandteil der Beziehung, die
aus der Beziehungs-Relation A erzeugt wurde.
Beispiel:
Gegeben seien beispielsweise die schon oben behandelten Tabellen „Abteilung“, „Ort“
und „Projekt“. Zusätzlich wird nun gespeichert, welche Firmen ein Projekt finanziell
unterstützen. Dazu existiert einmal die Tabelle „Firma“, die als starke Entity-Relation
klassifiziert wird, in der die Firmendaten gesichert werden. Zum anderen gibt es eine
reguläre Beziehungs-Relation „Sponsor“, in der den Firmen verschiedene Projekte
zugeordnet werden. Die Schwierigkeit ist, daß das Primärschlüsselattribut „Projektnr“
von „Sponsor“ auf eine spezielle Beziehungs-Relation, nämlich auf „Projekt“, verweist.
Erst durch das zuletzt angegebene Verfahren kann die Beziehung „Sponsor“ erzeugt
werden. In der Menge I werden die Abhängigkeiten Sponsor.Name→Firma.Name
sowie Sponsor.Projektnr→Projekt.Projektnr benötigt.
- 56 -
Abteilung
(Abteilnr)
Ort
(Standort, Mitarbeiterzahl)
Projekt
(Abteilnr→Abteilung, Standort→Ort, Projektnr, Projname)
Firma
(Name, Gesellsch)
Sponsor
(Name→Firma, Projektnr→Projekt)
Projektnr
Abteilnr
Abteilung
Projekt
SPEZIELL
Projname
Standort
Ort
Sponsor
Mitarbeiterzahl
Name
Firma
Gesellsch
3.3.7 Fremdschlüssel-Beziehungen
Weitere (binäre) Beziehungen werden aufgrund von Fremdschlüsseln erzeugt. Dazu
werden alle Entity-Relationen daraufhin untersucht, ob sie Attribute besitzen, die als
Fremdschlüssel klassifiziert wurden, aber nicht gleichzeitig als Primärschlüssel fungieren.
Attribute, die gleichzeitig als Primär- und Fremdschlüsselattribute klassifiziert wurden,
sind bereits in den vorhergehenden Abschnitten behandelt worden.
Die Menge der Abhängigkeiten I wird dann nach Vorkommen des Fremdschlüssels
auf der linken Seite einer Inklusion untersucht, um so die an der Beziehung beteiligte
Relation zu ermitteln.
Mögliche Kardinalitäten für diese funktionalen Beziehungen werden erst im
Abschnitt „Kardinalitäten“ ermittelt.
Alg6)
Sei F Fremdschlüssel einer Tabelle A∈ER. Durchsuche dann die
Menge der Inklusionen I nach Vorkommen von F auf der linken Seite von
Abhängigkeiten: Wenn (A.F→X.M)∈I mit beliebiger Tabelle X∈ER gilt, wobei M
Schlüsselkandidat für Relation X ist, dann erstelle eine binäre Beziehung namens
‘HAT’ zwischen den Entities, die mit den Tabellen A bzw. X korrespondieren.
- 57 -
Beispiel:
Gegeben seien zum Beispiel die beiden Tabellen „Student“ und „Wohnort“. Das
Attribut „Plz“ in „Student“ wird als Fremdschlüsselattribut klassifiziert und die
zugehörige Abhängigkeit Student.Plz→Wohnort.Plz verweist auf die Tabelle
„Wohnort“. Entsprechend wird eine binäre Beziehung „HAT“ zwischen den Entities, die
aus den beiden starken Entity-Relationen entstanden sind, erzeugt.
Student
(Matrikelnummer, Name, Straße, Plz→Wohnort)
Wohnort
(Plz, Ort)
Matrikelnummer
Name
Straße
Plz
Student
HAT
Wohnort
Ort
3.3.8 Aggregationen
Besitzt hingegen eine Beziehungs-Relation einen Fremdschlüssel, so deutet dies auf
eine binäre Beziehung zwischen einer Beziehung und einem Entity hin. Dies ist jedoch
nur im Zusammenhang mit Aggregationen sinnvoll.
Alg7)
Sei F Fremdschlüssel einer Tabelle A∈BR. Durchsuche die Menge der
Inklusionen I nach Vorkommen von F auf der linken Seite von Abhängigkeiten: Wenn
(A.F→X.M)∈I mit beliebiger Tabelle X∈ER gilt, wobei M Schlüsselkandidat für Relation
X ist, dann bilde eine Aggregation und eine neue Beziehung: Die Aggregation
namens A beinhaltet die Beziehung, die mit A korrespondiert, sowie alle an A
beteiligten Entities. Die neue binäre Beziehung ‘HAT’ setzt die Aggregation und das
Entity, das mit X korrespondiert, zueinander in Beziehung.
Beispiel:
Soll beispielsweise in einer Datenbank einer Kombination von „Student“ und
„Professor“ ein „Fachbereich“ zugeordnet werden, so bietet sich eine derartige
Aggregation an. Über die Beziehung „Betreuung“ wird jedem Studenten aus dem
starken Entity „Student“ ein Professor aus dem starken Entity „Professor“ zugeordnet.
Dazu sind in I die Inklusionen Betreuung.Matrikelnr→Student.Matrikelnr und
Betreuung.ProfName→Professor.Name gespeichert. Das Attribut „FB“ aus der
Tabelle „Betreuung“ wird als Fremdschlüssel klassifiziert. Als zugehörige Abhängigkeit
- 58 -
wird Betreuung.FB→Fachbereich.FB ermittelt. „FB“ ist der Primärschlüssel des
starken Entities „Fachbereich“. Wegen der zuletzt genannten Inklusion werden nun die
Beziehung namens „Betreuung“ und alle an ihr teilnehmenden Entities, also „Student“
und „Professor“, einer Aggregation „Betreuung“ zugeordnet. Anschließend wird eine
binäre Beziehung „HAT“ erzeugt, die das Entity „Fachbereich“ mit der Aggregation
verknüpft.
Student
(Matrikelnr, Name)
Professor
(Name)
Betreuung
(Matrikelnr→Student, Name→Professor, FB→Fachbereich)
Fachbereich (FB)
Matrikelnr
Name
Student
Betreuung
Professor
Name
Betreuung
HAT
Fachbereich
FB
3.3.9 Fremdschlüssel besonderer Entity-Relationen
Die einzigen Fremdschlüssel, die bisher noch nicht beachtet wurden, sind die
Primärschlüssel der besonderen Entity-Relationen. Der Primärschlüssel von Tabellen, die
als besondere Entity-Relationen klassifiziert wurden, besteht aus genau einem
Fremdschlüssel. Dies deutet auf eine Generalisierung (bzw. Spezialisierung) hin oder auf
eine binäre Beziehung, bei der nur Kardinalitäten (1,1) auftreten.
Um zu unterscheiden, ob eine binäre Beziehung mit dieser besonderen Eigenschaft,
oder eine Generalisierung vorliegt, müssen die Abhängigkeiten untersucht werden, die im
Zusammenhang mit der jeweiligen besonderen Entity-Relation auftreten. Verweist die
Fremdschlüssel-Bedingung einer solchen Tabelle auf eine andere besondere EntityRelation, so kann von einer binären Beziehung mit Kardinalitäten (1,1) ausgegangen
werden.
Anderenfalls verweist die Abhängigkeit, die zum Primärschlüssel einer besonderen
Entity-Relation gehört, auf eine andersartige Entity-Relation. Gibt es nur eine besondere
- 59 -
Entity-Relation, deren Primärschlüssel auf dieselbe Tabelle zeigt, so handelt es sich hier
um eine Spezialisierung. Sonst liegt eine Generalisierung vor, deren Art über zusätzliche
Anfragen ermittelt werden muß.
Sei also A∈BER mit Primärschlüssel P. P ist gleichzeitig als
Alg8)
Fremdschlüssel klassifiziert worden. Durchsuche I nach Abhängigkeiten, auf deren
linken Seite A.P auftritt. Ist (A.P→X.Q)∈I eine solche Abhängigkeit, bei der X∈ER und
Q Primärschlüssel von X ist, so unterscheide folgende Fälle:
Wenn X∈BER ist und auch (X.Q→A.P)∈I gilt, so bilde eine binäre Beziehung namens
‘GLEICH’ mit Kardinalitäten (1,1) zwischen den Entities, die mit A bzw. X
korrespondieren. Die Attribute des gemeinsamen Primärschlüssels P werden der
neuen Beziehung zugeordnet und aus den Entities entfernt.
Sonst untersuche die Menge I nach weiteren Inklusionen, auf deren rechten Seite
Tabelle X erscheint: Ist (R.M→X.Q)∈I mit R∈BER und M Primärschlüssel von R, so
merke Tabelle R in einer Menge von Relationen GENREL. Unterscheide dann:
Ist GENREL leer, also GENREL=∅, so sei A eine Spezialisierung von X, denn in
diesem Fall ist A die einzige Relation, die zu X.Q in Beziehung steht. Sonst besteht
eine Generalisierungs-Hierarchie zwischen A sowie allen Tabellen R∈GENREL und X.
Die Art der Generalisierung kann nur über zusätzliche Datenbank-Anfragen ermittelt
werden:
Sei GENREL:=GENREL∪{A}. Ist jeder Wert des Primärschlüssels von Tabelle X in
einer der Relationen R∈GENREL gespeichert, so handelt es sich um eine totale
Generalisierung. Sonst liegt eine partielle Generalisierung vor.
Für alle Tabellen R∈GENREL seien folgende Mengen definiert: (n=1,...,|GENREL|)
Rn:={SELECT DISTINCT <Primärschlüssel M> FROM <Tabelle Rn>}
Weiterhin sei für Relation X definiert:
Z:={SELECT DISTINCT <Primärschlüssel Q> FROM <Tabelle X>}
Wenn Z⊂(R1∪...∪R|W|) gilt, so wird aufgrund des aktuellen Datenbank-Zustandes eine
totale Generalisierung vermutet. Ebenso kann zwischen exklusiver und überlappender
Generalisierung unterschieden werden: Wenn für alle i,j=1,...,|W|, i≠j, Ri∩Rj=∅ gilt, so
handelt es sich vermutlich um eine exklusive, sonst um eine überlappende
Generalisierung.
- 60 -
Unabhängig davon, ob eine Spezialisierung oder eine Generalisierung vorliegt, wird
der Primärschlüssel der
Entities,
die mit den
besonderen
Entity-Relationen
korrespondieren, gelöscht.
Beispiel:
Für alle drei Fälle werden nun Beispiele aufgeführt. Gegeben seien zum Beispiel die
beiden besonderen Entity-Relationen „Student“ und „Wohnung“. Der Primärschlüssel
„Matrikelnr“ beider Tabellen wird gleichzeitig auch als Fremdschlüssel klassifiziert. Weil
die
beiden
Inklusionen
Student.Matrikelnr→Wohnung.Matrikelnr
und
Wohnung.Matrikelnr→Student.Matrikelnr ermittelt werden, wird eine binäre
Beziehung „GLEICH“ zwischen den beiden Entities „Student“ und „Wohnung“
erstellt. Die Kardinalitäten an beiden Seiten der Beziehung betragen (1,1).
Student
(Matrikelnr→Wohnung, Name)
Wohnung
(Matrikelnr→Student, Straße, Ort)
Student
(1,1)
GLEICH
Matrikelnr, Name
(1,1)
Wohnung
Matrikelnr, Straße, Ort
Eine Spezialisierung entsteht bei den beiden Tabellen „Mitarbeiter“ und „Manager“.
„Mitarbeiter“ ist eine starke Entity-Relation, während „Manager“ als eine besondere
Entity-Relation klassifiziert wird, weil sein Primärschlüssel „Personalnr“ gleichzeitig
Fremdschlüssel ist und auf den Primärschlüssel von „Mitarbeiter“ verweist und die
Abhängigkeit Manager.Personalnr→Mitarbeiter.Personalnr Element der Menge I
ist. Eine weitere Abhängigkeit, die auf Mitarbeiter.Personalnr zeigt, wird nicht
gefunden. Deshalb ist die Menge W leer und zwischen „Manager“ und „Mitarbeiter“
wird eine Spezialisierung erzeugt. Der Primärschlüssel von „Manager“ kann dann aus
dem EER-Schema entfernt werden.
Mitarbeiter
(Personalnr, Name, Gehalt)
Manager
(Personalnr→Mitarbeiter, Abteilung)
Personalnr, Name, Gehalt
Mitarbeiter
Manager
Abteilung
- 61 -
Im Gegensatz dazu bleibt die Menge W bei den folgenden gegebenen Tabellen nicht leer:
Person
(Name, Alter)
Mann
(Name→Person)
Frau
(Name→Person, Geburtsname)
Zunächst wird die besondere Entity-Relation „Mann“ gefunden. Ihr Primärschlüssel
„Name“ verweist auf den Primärschlüssel der starken Entity-Relation „Person“, denn
die Inklusion Mann.Name→Person.Name ist Element der Menge der Abhängigkeiten
I. Bei der Suche nach weiteren Abhängigkeiten, die auf Person.Name zeigen, wird
Frau.Name→Person.Name gefunden. „Frau“ ist ebenfalls als besondere EntityRelation klassifiziert worden und wird deswegen in die Menge W aufgenommen. Da
keine weiteren Abhängigkeiten in I gefunden werden, die zu dieser GeneralisierungsHierarchie gehören, wird nun die Art der Generalisierung durch oben genannte Anfragen
ermittelt. Dabei kommt heraus, daß Z⊂(R1∪R2) ist und R1∩R2=∅ ist. Es liegt also eine
totale exklusive Generalisierung vor.
Person
Mann
Name, Alter
Frau
Geburtsname
3.3.10 Kardinalitäten
Bei der Behandlung der besonderen Entity-Relationen wurden erstmals in diesem
Verfahren für eine Beziehung Kardinalitäten angegeben. In besagtem Fall ist die Angabe
der Kardinalitäten sehr einfach und leicht einzusehen. Schwieriger wird die Angabe auch
für andere Beziehungen. Hier müssen vor allem Indexe bzw. Anfragen und die im
Relationenschema in der Regel aufgeführten „null“- bzw. „not null“-Eigenschaften der
Attribute helfen, die ungefähren Kardinalitäten zu ermitteln. Letztgenannte Eigenschaften
geben Aufschluß über die Minimum-Angaben bei den Kardinalitäten (0 oder 1), Indexe
und Anfragen helfen, die Maximum-Angaben zu finden. Dabei ist jedoch nur die
Unterscheidung zwischen 1 und N möglich, denn bestimmte Werte größer als 1 sind aus
- 62 -
einem Relationenschema nicht mehr ableitbar. Lediglich durch die Auswertung von
Triggern ist eine genauere Bestimmung von Kardinalitäten möglich.
Zwei Arten von Beziehungen sollen getrennt untersucht werden: Auf der einen Seite
sind die Beziehungen zu betrachten, die aufgrund von Beziehungs-Relationen entstanden
sind, auf der anderen Seite werden die (funktionalen) Beziehungen behandelt, die durch
Fremdschlüssel und Inklusionen erzeugt wurden.
3.3.10.1 Kardinalitäten bei Beziehungsrelationen
Wenn eine Beziehung erstellt wurde, weil eine Tabelle in die Klasse der BeziehungsRelationen (reguläre oder spezielle) eingeordnet war, so gehört zu jedem Entity, das an
dieser Beziehung teilnimmt, in der Regel eine Kardinalität (0,N). Andere Kardinalitäten
sind nur über Anfragen zu ermitteln: Wenn ein Fremdschlüssel, der Teil des
Primärschlüssels der Tabelle ist, die mit der Beziehung korrespondiert, nur eindeutige,
also „unique“ Werte enthält, so ist als Maximum-Angabe in der Kardinalität, die zu dem
Entity gehört, auf dessen Primärschlüssel der betrachtete Fremdschlüssel verweist, eine 1
zu vermuten. Die Eigenschaft „unique“ kann entweder aus einem definierten Index oder
aus Anfragen der Art, wie bereits in 3.1.1 besprochen wurden, gefolgert werden.
Andererseits ist die Minimum-Angabe auf 1 zu korrigieren, wenn durch Anfragen
festgestellt wird, daß jeder Wert des Primärschlüssels der Entity-Relation im zugehörigen
Fremdschlüssel der Beziehungs-Relation erscheint.
Alg9)
Sei A∈BR mit Primärschlüssel P. F1,...,Fn⊂P seien die Fremdschlüssel,
die zur Beziehungs-Relation A gehören. Dann untersuche zunächst für alle
F=F1,...,Fn, ob auf die Werte in F die „unique“-Eigenschaft zutrifft. Wenn auf F kein
„unique“-Index definiert ist, so starte die Anfrage
SELECT COUNT(*) INTO z FROM A GROUP BY F
HAVING COUNT(*)>1
Wenn z<2 gilt oder ein „unique“-Index definiert ist, so lege in der Kardinalität zwischen
der Beziehung A und dem Entity, auf das Fremdschlüssel F verweist, die MaximumAngabe auf 1 fest. Sonst beträgt sie N.
Sei weiterhin die Abhängigkeit A.F→X.Q Element der Menge I, also Q der
Primärschlüssel der Entity-Relation X, auf den der Fremdschlüssel F verweist. Das
Minimum der zu bestimmenden Kardinalität wird zunächst auf 0 gesetzt. Es muß auf 1
korrigiert werden, wenn die folgende Anfrage z=0 liefert:
- 63 -
SELECT COUNT(*) INTO z FROM X WHERE NOT EXISTS
(SELECT F FROM A WHERE A.F=X.Q)
Wenn nämlich die Anfrage das Ergebnis z=0 liefert, so gibt es keine Werte in X.Q, die
nicht auch in A.F auftauchen.
Eine Besonderheit tritt auf, wenn eine spezielle Beziehungs-Relation vorliegt:
Wenn A∈SBR, so wurde bei der Umsetzung ein Entity erzeugt, dessen Primärschlüssel
aus den allgemeinen Schlüsselattributen von A zusammengesetzt ist. Die Untergrenze der
Kardinalität zwischen diesem Entity und der Beziehung, die mit A korrespondiert, kann
in jedem Fall auf 1 gesetzt werden, da aufgrund der Art der Speicherung keine Werte im
Entity existieren können, die nicht auch an der Beziehung teilnehmen. Die Obergrenze ist
genauso festzustellen wie oben: Liefert die Anfrage
SELECT COUNT(*) INTO z FROM A GROUP BY M
HAVING COUNT(*)>1
(M ist die Menge der allgemeinen Schlüsselattribute von A) das Ergebnis z<2 oder ist
sogar ein „unique“-Index auf M definiert, so beträgt die Kardinalität (1,1), sonst (1,N).
3.3.10.2 Kardinalitäten bei funktionalen Beziehungen
Das Feststellen der Kardinalitäten bei binären Beziehungen, die aufgrund von
Fremdschlüssel-Klassifikationen erstellt wurden, verläuft ähnlich:
Alg10)
Sei A die betrachtete Relation, die den Fremdschlüssel F enthält.
Wenn A keine schwache Entity-Relation ist, so darf F nicht gleichzeitig Teil des
Primärschlüssels von A sein. Ist hingegen A eine schwache Entity-Relation, so verweist F
auf einen Eigentümer von A und die daraus entstandene Beziehung wird ebenfalls hier
behandelt.
In der Menge der Inklusionen I kann dann eine Abhängigkeit A.F→X.Q gefunden
werden, wobei X∈ER gilt. Die betrachtete Beziehung besteht dann zwischen dem
Objekt, das mit A korrespondiert, und dem Entity, das aus Tabelle X erzeugt wurde.
Beide Objekte sollen hier ebenfalls mit A bzw. X bezeichnet werden.
Die Kardinalität auf der Seite von A kann entweder (0,1) oder (1,1) sein
(funktionale Beziehung). Unterscheiden kann man dies, indem man die „null“- bzw. „not
null“-Eigenschaft von F auswertet:
- 64 -
Wenn mindestens ein Attribut von F keine leeren Werte zuläßt („not null“), so muß
Kardinalität (1,1) gewählt werden. Sonst wird (0,1) bevorzugt.
Schwieriger ist die Festlegung der Kardinalität auf der anderen Seite: Auch diese ist
nur durch Anfragen bzw. die Auswertung von Indexen zu ermitteln:
Sind die Werte von F in A „unique“, d.h. ist ein „unique“-Index auf F definiert oder
liefert die Anfrage
SELECT COUNT(*) INTO z FROM A GROUP BY F
HAVING COUNT(*)>1
als Ergebnis z<2, so ist die Obergrenze der Kardinalität auf der Seite von X auf 1
festzulegen. Sonst beträgt sie N.
Die Untergrenze dieser Kardinalität ist in der Regel 0. Sie muß aber auf 1
korrigiert werden, wenn in Q kein einziger Wert auftritt, der nicht auch in F gespeichert
ist, wenn also die folgende Anfrage das Ergebnis z=0 liefert:
SELECT COUNT(*) INTO z FROM X WHERE NOT EXISTS
(SELECT F FROM A WHERE A.F=X.Q)
An dieser Stelle ist zum wiederholten Mal zu beachten, daß die Ergebnisse von Anfragen
vom jeweiligen Datenbank-Zustand abhängig sind. Die Kardinalitäten, die aufgrund von
Anfrage-Ergebnissen gebildet wurden, bedürfen deshalb einer genauen Überprüfung.
Beispiel:
Als Beispiel soll folgendes Relationenschema betrachtet werden, das nahezu mit einem
Schema übereinstimmt, welches in einem vorhergehenden Kapitel umgesetzt worden ist.
Attribute, die „null“-Werte erlauben, weisen diese Eigenschaft explizit aus, indem bei
ihnen als „Exponent“ eine 0 notiert wird:
Abteilung
(Abteilnr)
Standort
(Standort, Plz→Ort, Mitarbeiterzahl)
Ort
(Plz, Name)
Projekt
(Abteilnr→Abteilung, Standort→Ort, Projektnr, Projname)
Firma
(Name, Straße0, Postfach0,
Plz→Ort, Aktiennr0→Aktien)
Aktien
(Aktiennr, Wert, Anzahl)
Sponsor
(Name→Firma, Projektnr→Projekt)
- 65 -
Im Gegensatz zu oben sind die starken Entities „Ort“ und „Aktien“ hinzugekommen, auf
die die Fremdschlüssel „Plz“ in „Standort“ bzw. „Firma“ und „Aktiennr“ in „Firma“
verweisen. Die Umsetzung in ein EER-Schema ist leicht zu vollziehen.
Um die Kardinalitäten festzulegen, wird als erstes die spezielle Beziehungs-Relation
„Projekt“ betrachtet. Das Attribut „Abteilnr“ enthält weder eindeutige Werte, noch sind
alle Werte von „Abteilnr“ in Tabelle „Abteilung“ auch in Tabelle „Projekt“ gespeichert.
Als Kardinalität auf der Seite von „Abteilung“ folgt deshalb (0,N). Bei „Standort“
hingegen folgt (1,N), denn die Anfrage
SELECT COUNT(*) INTO z FROM Standort
WHERE NOT EXISTS (SELECT Standort FROM Projekt
WHERE Projekt.Standort=Standort.Standort)
liefert als Ergebnis z=0. Auf der Seite vom Entity „SPEZIELL“ steht Kardinalität (1,1),
weil die Anfrage
SELECT COUNT(*) INTO z FROM Projekt GROUP BY Projektnr
HAVING COUNT(*)>1
z<2 zurückliefert und somit das Attribut „Projektnr“ nur eindeutige („unique“) Werte
enthält.
„Sponsor“ ist eine reguläre Beziehungs-Relation. Aus ihr wird eine Beziehung
zwischen den Entities „SPEZIELL“ und „Firma“ erzeugt. Die Anfragen, die zur
Ermittlung der Kardinalitäten gestellt werden, liefern alle Werte z>0. Deshalb folgt hier
auf beiden Seiten der Beziehung Kardinalität (0,N).
In den Tabellen „Standort“ und „Firma“ tritt der Fremdschlüssel „Plz“ auf, der auf
Tabelle „Ort“ verweist. Bei beiden Relationen erlaubt „Plz“ keine „null“-Werte, so daß
auf ihrer Seite Kardinalität (1,1) steht. Auf der anderen Seite folgt jeweils (0,N), denn in
Tabelle „Ort“ werden auch Orte gespeichert, die weder in „Standort“ noch „Firma“
auftauchen. Außerdem könnten mehrere Firmen oder Standorte unter der gleichen
Postleitzahl erreichbar sein.
- 66 -
Anders sieht es für die binäre „HAT“-Beziehung zwischen „Firma“ und „Aktien“
aus. Der Fremdschlüssel „Aktiennr“ in Relation „Firma“ erlaubt auch „null“-Werte, so
daß auf Seite des Entities „Firma“ die Kardinalität (0,1) stehen muß. Auf der anderen
Seite steht (1,1), weil beide erstellten Anfragen als Ergebnis z=0 liefern, also das Attribut
„Aktiennr“ in „Firma“ nur eindeutige Werte enthält und jede „Aktiennr“ aus „Aktien“
auch in „Firma“ gespeichert ist.
Abteilnr
Abteilung
(0,N)
(1,1)
Projekt
SPEZIELL
(1,N)
Standort
Mitarbeiterzahl
Sponsor
(1,1)
(0,N)
(1,1)
Plz
Name
Ort
Firma
HAT
(0,N)
Projname
(0,N)
Standort
HAT
Projektnr
(0,1)
(0,N)
Name
Straße
Postfach
HAT
(1,1)
Aktien
Aktiennr
Wert
Anzahl
3.4 Bewertung des eigenen Verfahrens
Bei der Bewertung eines Algorithmus ist es von entscheidender Bedeutung, ob das
Verfahren korrekt ist bzw. ob die Algorithmus-Schritte äquivalenzerhaltend sind. Dabei
wird zwischen semantischer und syntaktischer Korrektheit unterschieden, wobei letzter
Punkt die reine Modellierung betrifft und somit durch das Verfahren aus Kapitel 3.3
gesichert wird, weil das Zielschema dem EER-Modell entspricht.
Schwieriger ist die Bewertung der semantischen Korrektheit: Hier muß jeder Schritt
des Umsetzungs-Prozesses (aus Kapitel 3.3) daraufhin untersucht werden, ob
Informationen verloren gehen oder durch Vermutungen hinzugefügt werden. Bei dieser
Analyse wird auf den Algorithmus in 3.3 verwiesen. Vorausgesetzt wird an dieser Stelle,
daß die zur Umsetzung nötigen Informationen durch den Anwender ergänzt und
vervollständigt bzw. korrigiert werden - die Auswertung des Relationenschemas allein
- 67 -
reicht nicht aus, da beispielsweise einige referentielle Abhängigkeiten nicht aus dem
relationalen Schema abgelesen werden können. Auch die Klassifikation zwischen
schwacher Entity-Relation und spezieller Beziehungs-Relation muß durch den Anwender
entschieden werden (s.o.).
Es kann hier nur untersucht werden, ob das Ergebnis-Schema äquivalent zum
Quellschema (inklusive aller Zusatzangaben) ist. Ein anderes Problem ist die
Unvollständigkeit der Modellierung: Solange das Quellschema nicht vollständig ist, kann
das Verfahren kein vollständiges Zielschema erzeugen.
In Schritt „Alg1“ werden starke und besondere Entity-Relationen in Entities
umgewandelt und diesen Entities alle Nichtschlüsselattribute und der Primärschlüssel der
zugehörigen ursprünglichen Tabellen zugeordnet. Hier gehen also alle Attribute verloren,
die als Fremdschlüsselattribute und nicht gleichzeitig als Primärschlüsselattribute
klassifiziert wurden. Diese Fremdschlüssel werden zu einem späteren Zeitpunkt („Alg6“)
ausgewertet. Bei besonderen Entity-Relationen wird zunächst vernachlässigt, daß ihr
Primärschlüssel aus exakt einem Fremdschlüssel besteht.
Schwache Entity-Relationen werden in ein Entity und eine Beziehung umgesetzt
(„Alg2“). Ebenso wie in „Alg1“ werden hier vorläufig Fremdschlüsselattribute, die nicht
zum Primärschlüssel gehören, außer acht gelassen. Alle anderen Attribute werden dem
neuen schwachen Entity zugeordnet, aus den hängenden Schlüsselattributen und den
zugehörigen referentiellen Abhängigkeiten werden Beziehungen zwischen schwachem
Entity und seinen Eigentümern erstellt. Zu beachten ist hier, daß in der Regel zu einer
schwachen Entity-Relation nur eine Eigentümer-Beziehung gehört, denn Tabellen mit
mehreren Fremdschlüsseln im Primärschlüssel werden als spezielle Beziehungs-Relation
klassifiziert, sofern der Anwender an dieser Stelle nicht eingreift.
Diese ersten Schritte sind also, abgesehen von den Fremdschlüsseln, semantisch
korrekt. Die Semantik des Schemas vor diesen Verfahrens-Schritten ist äquivalent zur
Semantik des Schemas danach. Informationen gehen weder verloren, noch werden
welche hinzugefügt.
In den Algorithmus-Schritten „Alg3“ bis „Alg5“ werden Beziehungs-Relationen
ausgewertet. Dabei werden zunächst die Entities zu speziellen Beziehungs-Relationen
erzeugt, bevor dann die Beziehungen erstellt werden. Auch hier gehen - abgesehen von
den Fremdschlüsseln, die nicht zu einem Primärschlüssel gehören - keine Informationen
- 68 -
verloren. Allerdings ist, wie schon bei Behandlung der schwachen Entity-Relationen, die
Benennung der EER-Objekte bei dieser Betrachtung auszuklammern, da eine semantisch
korrekte Namensgebung aus dem Relationenschema nicht abgeleitet werden kann. Der
Anwender hat hier durch Umbenennung dafür zu sorgen, daß sprechendere Namen als
„ABHAENGIG“
bzw.
„SPEZIELL“
vergeben
werden.
Um
den
Grad
der
Automatisierung des Verfahrens nicht zu verringern, werden derartige NutzerÄnderungen erst nach Ablauf des Umsetzungs-Prozesses vorgesehen.
Die Fremdschlüssel-Beziehungen werden in „Alg6“ und „Alg7“ behandelt.
Semantisch korrekt ist dabei mit Sicherheit „Alg6“: In diesem Teil des Verfahrens
werden die in „Alg1“ und „Alg2“ ausgeklammerten Fremdschlüssel von EntityRelationen ausgewertet und daraus binäre Beziehungen erzeugt. Problematisch hingegen
ist die Erstellung von Aggregationen im siebten Schritt: Nicht immer ist es korrekt, daß
aus Fremdschlüsseln in Beziehungs-Relationen Aggregationen auf diese Art wie in
„Alg7“ erzeugt werden. Es ist ebenso möglich, daß mehr EER-Objekte in einer
Aggregation zusammengefaßt werden, als das Verfahren dies im Zielschema angibt. Der
Anwender muß dafür sorgen, daß die Semantik erhalten bleibt, indem er die
Aggregationen entsprechend ändert.
Beispiel:
In folgendem Schema wird dieses Problem deutlich:
Student
(Matrikelnr, Name, Wohnort→Ort)
Ort
(Name)
Professor
(Name)
Assistent
(Name, Prof→Professor)
Betreuung
(Matrikelnr→Student, Name→Professor, FB→Fachbereich)
Fachbereich (FB)
- 69 -
Name
wohnt in
Student
Matrikelnr
Betreuung
Name
Professor
bei
Betreuung
Ort
Name
HAT
Fachbereich
Assistent
FB
Name
Wie in 3.3.8 erläutert, wird hier wegen des Fremdschlüssels „FB“ in „Betreuung“ eine
Aggregation gebildet, die neben der Beziehung „Betreuung“ alle beteiligten Entities,
also „Student“ und „Professor“, umfaßt. Obwohl es einem Anwender schon wegen der
Objektnamen einleuchtet, daß auch „Assistent“ zur Aggregation gehört, erkennt das
Verfahren dies nicht. Es ist dann Aufgabe des Nutzers, Aggregation „Betreuung“ zu
erweitern. Das Entity „Ort“ hingegen sollte nicht in die Aggregation eingebunden
werden.
Auch der nächste Schritt im Verfahren weist einige Probleme auf: Es ist semantisch
korrekt, eine „GLEICH“-Beziehung zu erzeugen, wenn die Primärschlüssel zweier
besonderer Entity-Relationen auf sich gegenseitig verweisen. Auch die Zuordnung der
gemeinsamen Primärschlüssel zur neu erzeugten Beziehung verletzt die Äquivalenz der
Schemata vor bzw. nach diesem Schritt noch nicht. In der Datenbank kann kein Zustand
erzeugt werden, zu dem das Zielschema nicht mehr äquivalent zum Quellschema ist.
Jedoch ist die Differenzierung zwischen den verschiedenen Generalisierungs-Typen vom
jeweiligen Datenbank-Zustand abhängig, da hier Anfragen zur Unterscheidung dienen.
Hält das Zielmodell die verschiedenen Generalisierungs-Typen auseinander, so kann
durch Einfügen weiterer Instanzen in die Datenbank ein Zustand erzeugt werden, zu dem
das Zielschema nicht mehr äquivalent zum Quellschema ist. Nur durch Nachbearbeitung
des Anwenders ist hier die semantische Korrektheit zu gewährleisten und zu verhindern,
daß in der Datenbank Zustände entstehen können, die im Zielschema nicht möglich sind.
- 70 -
Beispiel:
Es seien folgende Relationen und Tupel gegeben:
Person
Name
Rollert
Wehrhahn
Kunde
Name→Person
Wehrhahn
Rollert
Warenwert
3498,-540,--
Mitarbeiter Name→Person
Rollert
Gehalt
6000,--
(*)
Analog zum Beispiel in Kapitel 3.3.9 werden die Tabellen „Kunde“ und „Mitarbeiter“
als besondere Entity-Relationen klassifiziert. Der Algorithmus erzeugt daraus eine
Generalisierung:
Person
Gehalt
Mitarbeiter
Name
Kunde
Warenwert
Bei der Ermittlung des Generalisierungs-Typen soll zunächst davon ausgegangen
werden, daß das Tupel „(*)“ in Relation „Kunde“ nicht gespeichert ist. Die Anfragen
R1:={SELECT DISTINCT Name FROM Kunde}
R2:={SELECT DISTINCT Name FROM Mitarbeiter}
Z:={SELECT DISTINCT Name FROM Person}
liefern dann die Eigenschaften R1∩R2=∅ und Z=R1∪R2. Damit wird eine totale
exklusive Generalisierung erkannt und im Zielschema vermerkt. Wird jetzt aber das
(zulässige) Tupel „(*)“ in „Kunde“ eingefügt, so entsteht im Quellschema ein Zustand,
der im Zielschema nicht abgebildet werden kann. Der Anwender muß also den
Generalisierungs-Typ in „total und überlappend“ ändern. Um den Automatisierungsgrad
des Verfahrens nicht herabzusetzen, ist diese Änderung erst nach Umsetzung des
Schemas vorgesehen.
- 71 -
Ebenso müssen die Kardinalitäten, die in den Schritten „Alg9“ bzw. „Alg10“
ermittelt werden, durch den Anwender im Zielschema überprüft und gegebenenfalls
korrigiert werden. Denn auch hier werden Anfragen ausgeführt, um Informationen aus
der relationalen Datenbank zu gewinnen, die hinterher im EER-Schema zur Festlegung
von Kardinalitäten ausgewertet werden. Diese Anfragen liefern jedoch nur Vermutungen,
denn ihre Ergebnisse sind von den gespeicherten Instanzen, also dem DatenbankZustand, abhängig. Es handelt sich hier nicht um gesicherte Informationen, weshalb
dieser Teil des Verfahrens die semantische Korrektheit nicht gewährleistet. Die Menge
der möglichen Zustände in Quell- und Zielschema können differieren.
Beispiel:
Als Beispiel sollen folgende Relationen und Tupel betrachtet werden:
Kunde
(*)
Name
Wehrhahn
Rollert
Giesemann
Warenwert
1298,-762,-1155,--
Mitarbeiter Name
Gertz
Gehalt
7800,--
betreut
MName→Mitarbeiter
Gertz
Gertz
(*)
KName→Kunde
Rollert
Wehrhahn
„betreut“ ist eine reguläre Beziehungs-Relation. Aus ihr wird eine Beziehung zwischen
den Entities „Kunde“ und „Mitarbeiter“ erzeugt. Zur Ermittlung der Kardinalitäten an
dieser Beziehung werden folgende Anfragen ausgeführt:
Anf1)
SELECT COUNT(*) INTO z1 FROM Kunde
WHERE NOT EXISTS (SELECT KName FROM betreut
WHERE betreut.KName=Kunde.Name)
Anf2)
SELECT COUNT(*) INTO z2 FROM betreut GROUP BY KName
HAVING COUNT(*)>1
Anf3)
SELECT COUNT(*) INTO z3 FROM Mitarbeiter
WHERE NOT EXISTS (SELECT MName FROM betreut
WHERE betreut.MName=Mitarbeiter.Name)
- 72 -
Anf4)
SELECT COUNT(*) INTO z4 FROM betreut GROUP BY MName
HAVING COUNT(*)>1
Die ersten beiden Anfragen „Anf1“ und „Anf2“ dienen dabei der Festlegung der
Kardinalitäten auf der Seite von Entity „Kunde“, die anderen beiden helfen, die
Kardinalitäten auf der Seite von Entity „Mitarbeiter“ zu definieren. Wieder soll zunächst
ein Datenbank-Zustand zugrunde liegen, bei dem die Tupel „(*)“ in den Tabellen
„Kunde“ bzw. „betreut“ nicht gespeichert sind. Anfrage „Anf4“ liefert in diesem Fall als
Obergrenze für die Kardinalität zwischen „Mitarbeiter“ und „betreut“ das Ergebnis 1,
denn Feld „MName“ enthält dann nur eindeutige Werte. Untergrenze ist ebenfalls 1,
weil alle Einträge aus „Mitarbeiter.Name“ auch in „betreut.MName“ gespeichert sind.
Wird aber Tupel „(*)“ in „betreut“ eingefügt, so sind Quellschema und Zielschema
nicht mehr äquivalent zueinander, weil das Zielschema das Einfügen von Tupel „(*)“
nicht zuläßt. Deshalb muß die Obergrenze der Kardinalität bei „Mitarbeiter“ auf N
gesetzt werden. „Anf4“ liefert jetzt z4>1.
Auf der anderen Seite wird als Kardinalität (1,1) festgelegt, denn die
Anfrageergebnisse von „Anf1“ bzw. „Anf2“ sind z1=0 und z2<2. Wird auch in Relation
„Kunde“ das Tupel „(*)“ eingefügt, so liefert „Anf1“ z1>0 und das Verfahren ermittelt
Kardinalität (0,1).
Name
Mitarbeiter
Gehalt
(1,N)
betreut
(0,1)
Name
Kunde
Warenwert
Als Ergebnis erhält man aus dieser Betrachtung, daß Quellschema und Zielschema
nur unter bestimmten Bedingungen äquivalent zueinander sind. Die Entscheidungen, die
durch Anfragen im Verfahren gefällt werden, müssen durch den Anwender überprüft und
gegebenenfalls geändert werden, um die Semantik des Quellschemas zu erhalten. Erst
nach diesen (korrekten) Änderungen sind das ursprüngliche Relationenschema (mit
Ergänzungen des Nutzers) und das erzeugte EER-Schema äquivalent. Das Zielschema ist
dann bis auf die Benennung der Objekte korrekt - sowohl semantisch als auch
syntaktisch.
- 73 -
4 Algorithmus und Codierung
Aus dem im vorherigen Kapitel vorgestellten Algorithmus wurde im Rahmen dieser
Diplomarbeit ein Werkzeug entwickelt, das aus einem Oracle-Datenbank-Schema ein
EER-Schema erzeugt. Dieses Tool besteht aus mehreren Teil-Anwendungen, die
unterschiedliche Schemata in Form einer ASCII-Datei erzeugen. Durch die Anwendung
von Tools, die V.M. Markowitz und seine Mitarbeiter entwickelt haben, bestehen
weitere Möglichkeiten der Umsetzung. Einen Überblick über die Programme und
Schemata bietet folgendes Diagramm (neu-entwickelte Programme sind fett gedruckt):
OracleDB-Schema
ora2rel
RelationenSchema
rel2pre
PRE-Schema
rel2sdt
pre2sdt
SDT-Schema
sdt2erd
MarkowitzTools
(eergraph)
ERD-Schema
erdraw
ERDRAW
EER-Grafiktool
- 74 -
4.1 Markowitz-Tools
V.M. Markowitz hat mit einigen seiner Mitarbeiter Ende 1993 einige Tools veröffentlicht
[14,15,21], mit denen man ein Relationenschema in grafisch aufbereiteter Form darstellen
kann. Die Art der grafischen Darstellung ist der eines ER-Schemas (ohne Erweiterungen)
sehr ähnlich, jedoch werden Fremdschlüsselbeziehungen nicht über ein typisches
Beziehungs-Objekt, sondern durch eine direkte Verbindung zwischen den betreffenden
Entities dargestellt.
Das Verfahren, mit dem Markowitz ein Oracle- oder Sybase-Schema in ein ERSchema umsetzt, hat er in verschiedene Schritte unterteilt: Im ersten Schritt wird aus
dem jeweiligen Datenbank-System ein Schema ausgelesen und in eine ASCII-Datei
geschrieben. Das Programm „ora2rel“ läuft jedoch nicht einwandfrei, weil neuere OracleVersionen (ab Version 7) nicht unterstützt werden - eine Nachfrage bei V.M. Markowitz
hat ergeben, daß die Tools nicht weiter gepflegt werden. Man muß also die ASCII-Datei
mit dem Relationenschema selbst erstellen.
Der nächste Schritt wird durch das Programm „rel2sdt“ gelöst: Es bildet aus dem
Relationenschema ein sogenanntes SDT-Schema (Schema Design and Translation). In
diesem Programm steckt der eigentliche Algorithmus zum „Reverse Engineering“. Dabei
werden die Tabellen in zwei Klassen „Entity“ bzw. „Relationship“ unterteilt. Diese
Klassifizierung ist, wie bei den meisten in Kapitel 2 vorgestellten Verfahren, einzig von
dem Primärschlüssel der jeweiligen Relation abhängig: Enthält er ausschließlich
Attribute, die als Fremdschlüssel dienen, so bildet Markowitz aus der Tabelle eine
Beziehung, sonst wird ein Entity erstellt. Neben der verlangten Definition eines
Primärschlüssels
und
der
optionalen
Definition
von
Fremdschlüsseln
im
Relationenschema können auch Schlüsselkandidaten („alternate keys“) angegeben
werden. Ihre Definition hat allerdings keinerlei Auswirkungen auf das erstellte SDTSchema.
Das Programm „sdt2erd“ bereitet das so erzeugte SDT-Schema für die grafische
Darstellung mittels „erdraw“ vor.
Um
mit
Hilfe
der
Markowitz-Tools
aus
einem
Relationenschema
(abgewandeltes) ER-Schema zu erzeugen, sind also folgende Schritte notwendig:
ein
- 75 -
1. Relationenschema in bestimmter Form (siehe [15]) in eine Datei „<Dateiname>.rel“
schreiben.
2. „rel2sdt <Dateiname>.rel <Dateiname>.sdt“ aufrufen. Das entstandene SDTSchema kann gemäß Anhang A/c editiert werden.
3. „sdt2erd <Dateiname>.sdt <Dateiname>.erd“ aufrufen.
4. „erdraw“ starten und das Schema <Dateiname>.erd laden.
Ein ausführliches Beispiel ist in Kapitel 4.3 zu finden.
4.2 Programmentwicklung
Bei der eigenen Programmentwicklung ist es sinnvoll, sich an den Tools von Markowitz
zu orientieren. Aus Zeitgründen ist es nicht möglich, daß im Rahmen dieser Diplomarbeit
bereits ein Werkzeug programmiert wird, das ein EER-Schema grafisch darstellen kann.
Deshalb wird der in Kapitel 3 entwickelte Algorithmus ebenfalls in verschiedene Schritte
eingeteilt: „ora2rel“ ist ein Programm, das den Benutzer auffordert, sich bei einer OracleDatenbank anzumelden und ein Schema auszuwählen. Über Anfragen an das DataDictionary werden dann die gewählten Tabellen mit ihren Spalten und Indexen
ausgelesen. Der Benutzer hat anschließend die Möglichkeit, weitere Schlüsselkandidaten
und Fremdschlüssel einzugeben. Seine Eingaben werden von „ora2rel“ über DatenbankAnfragen überprüft und gegebenenfalls zurückgewiesen. Auch hat der Anwender die
Möglichkeit, aus der Menge der Schlüsselkandidaten selbst den Primärschlüssel
auszuwählen, der seiner Meinung nach am besten geeignet ist. Das System schlägt aber
dem Benutzer einen passenden Schlüsselkandidaten vor.
Das ermittelte Relationenschema wird abschließend in eine ASCII-Datei
geschrieben. Die Form der Speicherung ist der von Markowitz sehr ähnlich, es sind nur
die Angaben zur späteren Kardinalitäten-Ermittlung hinzugekommen. Die Backus-NaurForm des Relationenschemas ist in Anhang A/a zu finden.
Das Programm „rel2pre“ führt den eigentlichen (eigenen) „Reverse Engineering“Vorgang aus. Unter Ausnutzung der Informationen im Relationenschema wird ein
sogenanntes PRE-Schema (siehe Anhang A/b) erzeugt, das wiederum dem SDT-Schema
von Markowitz (siehe Anhang A/c) ähnlich ist. Hinter „rel2pre“ verbirgt sich der in
Kapitel 3 entwickelte Algorithmus. Jedoch werden auch von „rel2pre“ noch keine
- 76 -
Aggregationen erkannt und zwischen den verschiedenen Arten von Generalisierungen
wird noch nicht unterschieden, weil die Programmentwicklung dieser Funktionen den
zeitlichen Rahmen dieser Arbeit gesprengt hätte. Dennoch liefert das Programm
„rel2pre“ bessere Ergebnisse mit mehr Struktur-Informationen als „rel2sdt“ von
Markowitz: So werden beispielsweise bei „rel2sdt“ keine Fremdschlüssel-Beziehungen
gebildet. Stattdessen werden die in Beziehung stehenden Entities direkt durch eine Linie
miteinander verbunden. Außerdem werden keine Angaben über Kardinalitäten gemacht.
Dies wird noch in Kapitel 4.3 an einem Beispiel verdeutlicht.
Das PRE-Schema sollte zu einem späteren Zeitpunkt direkt als EER-Schema
ausgegeben werden. Wie bereits oben erwähnt, kann bis dahin „erdraw“ von Markowitz
zur grafischen Darstellung des Schemas herangezogen werden. Aus diesem Grund setzt
„pre2sdt“ das PRE-Schema in ein SDT-Schema um, das dann wie in Kapitel 4.1
weiterverarbeitet werden kann.
Bei Einsatz der neu entwickelten Programme „ora2rel“, „rel2pre“ und „pre2sdt“ ist
also folgende Vorgehensweise vorgesehen:
1. Mit „ora2rel <Dateiname>.rel“ aus einer Oracle-Datenbank ein Relationenschema
erzeugen.
2. „rel2pre <Dateiname>.rel <Dateiname>.pre“ aufrufen und so das
Relationenschema in ein EER-Schema umsetzen.
3. „pre2sdt <Dateiname>“ ausführen, um das Schema mit den Tools von Markowitz
weiterzuverarbeiten. Achtung: Informationsverlust! Kardinalitätsangaben gehen
verloren, aus Generalisierungen und schwachen Entities werden starke Entities.
4. „sdt2erd <Dateiname>.sdt <Dateiname>.erd“ aufrufen.
5. „erdraw“ starten und das Schema <Dateiname>.erd laden.
Ein ausführliches Beispiel ist in Kapitel 4.3 zu finden. Das Benutzerhandbuch steht in
Anhang B.
- 77 -
OracleDatenbank
RelationenSchema
PRESchema
SDTSchema
ERDSchema
erdraw
rel2pre
ora2rel
(Editor)
menu
eingabe
ora2eer
pre2sdt
rel2sdt
sdt2erd
MarkowitzTools
Einen Überblick über die Programme und Module bietet folgende Übersicht:
Aus dieser Abbildung ist ersichtlich, welche Programme von „ora2eer“ aufgerufen
werden und welche Schemata von welchen Programmen verarbeitet bzw. geschrieben
werden. Die beiden Module „eingabe“ (Anhang E/a, E/b) und „menu“ (Anhang E/c, E/d)
enthalten Routinen zur Ein-/Ausgabe und Menüsteuerung.
- 78 -
4.2.1 ora2rel
Das Programm „ora2rel“ beinhaltet den Teil des Verfahrens, der Anfragen an die
Datenbank und das Data-Dictionary stellt und viel Nutzerkommunikation verlangt. Der
Quellcode zu „ora2rel“ ist in Anhang E/e zu finden. Einen Überblick darüber, welche
Tabellen des Data-Dictionarys welche Struktur-Informationen liefern, verschafft das
folgende Diagramm:
ora2rel.pc:
(ORACLE-Data-Dictionary)
table_name
user_tables
num_rows
column_name
user_tab_columns
Tabelle
data_type
nullable
num_distinct
index_name
user_indexes
uniqueness
table_name
SchlüsselKandidat
constraint_type
user_constraints
constraint_name
r_constraint_name
user_ind_columns
column_name
user_cons_columns
column_name
FremdSchlüssel
- 79 -
Datenstrukturen:
rel:
ARRAY [1..MAX_REL] OF STRING;
In „rel“ werden die Relationnamen gespeichert.
(Zeile 40)
relation:
ARRAY [1..MAX_REL] OF RECORD
(Zeile 43-66)
In der Struktur „relation“ werden alle Informationen zu Tabellen gespeichert:
num_rows: INTEGER;
Anzahl der Datensätze
anz_col:
INTEGER;
Anzahl der Attribute
anz_idx:
INTEGER;
Anzahl der Indexe
anz_alt:
INTEGER;
Anzahl der Schlüsselkandidaten
anz_for:
INTEGER;
Anzahl der Fremdschlüssel
col_names: ARRAY [1..MAX_COL] OF STRING;
Namen der Attribute
col_num:
ARRAY [1..MAX_COL] OF INTEGER;
Anzahl der verschiedenen Attribut-Werte einer Spalte
col_null:
ARRAY [1..MAX_COL] OF BOOLEAN;
Erlaubt Attribut leere Einträge ?
col_type:
ARRAY [1..MAX_COL] OF STRING;
Datentypen der Attribute
idx_names: ARRAY [1..MAX_IDX] OF STRING;
Namen der Indexe
idx_unique: ARRAY [1..MAX_IDX] OF BOOLEAN;
Index vom Typ „unique“ ?
idx_typ:
ARRAY [1..MAX_IDX] OF CHAR;
Index-Typen (primary/foreign key oder zusätzlicher Index)
idx_col:
ARRAY [1..MAX_IDX] OF
ARRAY [1..MAX_IDX_COL] OF INTEGER;
Attributnummern, auf denen Index definiert ist
pri_key:
ARRAY [1.. MAX_IDX_COL] OF INTEGER;
Attributnummern der Felder, die Bestandteil des Primärschlüssels sind
alt_key:
ARRAY [1..MAX_IDX] OF
ARRAY [1..MAX_IDX_COL] OF INTEGER;
Attributnummern der Felder, die zu einem Schlüsselkandidaten gehören
- 80 -
for_key:
ARRAY [1..MAX_IDX] OF
ARRAY [1..MAX_IDX_COL] OF INTEGER;
Attributnummern der Felder, auf denen ein Fremdschlüssel definiert ist
for_ref:
ARRAY [1..MAX_IDX] OF STRING;
Namen der Tabellen, auf die die Fremdschlüssel zeigen
for_col:
ARRAY [1..MAX_IDX] OF
ARRAY [1..MAX_IDX_COL] OF STRING;
Attribute der Referenztabelle, auf die ein Fremdschlüssel verweist
for_null:
ARRAY [1..MAX_IDX] OF BOOLEAN;
Erlaubt Fremdschlüssel leere Einträge ?
for_uni:
ARRAY [1..MAX_IDX] OF BOOLEAN;
Sind die Einträge in den Fremdschlüsseln eindeutig („unique“) ?
for_alle:
ARRAY [1..MAX_IDX] OF BOOLEAN;
Sind alle Einträge in der Referenztabelle auch im Fremdschlüssel gespeichert ?
END;
Zentrale Algorithmen:
Nach dem Lesen der Indexe einer Tabelle werden diese daraufhin untersucht, ob sie
Primärschlüssel oder Schlüsselkandidaten beinhalten. Diese Aufgabe übernimmt die
Funktion „idx_exam“ (Zeile 249-274):
PROCEDURE idx_exam();
BEGIN
FOR i:=1 TO anz_idx DO
IF idx_typ[i]=‘P’ THEN
(* Primärschlüssel *)
<Kopiere Attribute aus idx_col[i] in pri_key>;
ELSE
IF idx_unique[i] THEN BEGIN
(* Schlüsselkandidat *)
anz_alt := anz_alt + 1;
<Kopiere Attribute aus idx_col[i] in alt_key[anz_alt]>;
(* Wenn alle Attr. NULL zulassen, verwerfe Kand. *)
IF col_null[<Alle Attribute aus idx_col[i]>] THEN
anz_alt := anz_alt - 1;
(* verwerfe Schl.kand. *)
END;
END;
- 81 -
Die Funktion „search_pk“ (Zeile 411-486) ermöglicht dem Anwender die Eingabe eines
Schlüsselkandidaten. Das System prüft über die in Kapitel 3.1 erläuterten Anfragen, ob
der Schlüsselkandidat die UNIQUE-Bedingung erfüllt. Wenn nicht, so wird der
Schlüsselkandidat als ungültig zurückgewiesen:
PROCEDURE search_pk();
VAR kand: <Menge von Attributen>;
BEGIN
<Eingabe Attribute des Schlüsselkandidaten (kand)>;
IF kand∈alt_key THEN BEGIN
Ausgabe(„Eingegebener Schlüsselkandidat ist bereits vorhanden.“);
RETURN;
END;
IF kand=pri_key THEN
Ausgabe(„Eingegebener Schlüsselkandidat ist Primärschlüssel.“);
RETURN;
END;
(* Prüfe auf UNIQUE, siehe Kapitel 3.1 *)
SELECT COUNT(*) INTO v_int FROM rel GROUP BY kand
HAVING COUNT(*)>1;
IF v_int>1 THEN
Ausgabe(„Schlüsselkandidat hat keine UNIQUE-Eigenschaft.“);
ELSE BEGIN
anz_alt := anz_alt + 1;
<Kopiere Attribute aus kand in alt_key[anz_alt]>;
END;
END;
Die Funktion „test_fk“ (Zeile 490-526) prüft über eine Datenbank-Anfrage, ob eine vom
Nutzer eingegebene Fremdschlüssel-Beziehung gültig ist. Dieser Funktion werden der
Fremdschlüsselkandidat, die Referenztabelle und die Namen der Attribute übergeben, auf
die der Fremdschlüssel verweist:
FUNCTION test_fk(fskand,reftab,refattr);
VAR fskand,refattr: <Menge von Attributen>;
VAR reftab: Tabelle;
BEGIN
IF Felderzahl(fskand) <> Felderzahl(refattr) THEN BEGIN
Ausgabe(„Unterschiedliche Anzahl an Feldern“);
RETURN;
END;
- 82 -
(* Prüfe auf Fremdschlüssel, siehe Kapitel 3.1 *)
SELECT COUNT(*) INTO v_int FROM rel WHERE NOT EXISTS
(SELECT refattr FROM reftab WHERE reftab.refattr=rel.fskand);
IF SQL-Fehler THEN
Ausgabe(„Ungültige Attribut-Namen eingegeben“);
ELSE IF v_int>0 THEN
(* In fskand sind Daten, die nicht in reftab.refattr vorkommen *)
Ausgabe(„Keine gültige Fremdschlüssel-Beziehung“);
ELSE
RETURN <gültiger Fremdschlüssel>;
END;
„test_fk“ wird von Funktion „search_fk“ (Zeile 529-723) aufgerufen, die den Anwender
einen Fremdschlüssel eingeben läßt und prüft, ob der neu eingegebene Fremdschlüssel
bereits vorher definiert wurde. Außerdem hat der Benutzer die Möglichkeit, das System
nach gleichnamigen Attributen suchen zu lassen:
PROCEDURE search_fk();
VAR fskand,refattr: <Menge von Attributen>;
VAR reftab: Tabelle;
VAR merktabs: <Menge von Tabellen>;
BEGIN
<Eingabe Attribute des Fremdschlüsselkandidaten (fskand)>;
IF fskand∈for_key THEN
Ausgabe(„Warnung: Feldkombination ist bereits Fremdschlüssel.“);
reftab := <Menü-Auswahl der Referenztabelle>;
IF reftab∉rel THEN BEGIN
(* Automatische Suche nach gleichnamigen Attributen *)
refattr := fskand;
<Schreibe fskand in temporäre Tabelle>;
SELECT table_name INTO merktabs FROM user_tables
WHERE NOT EXISTS (
(SELECT fskand FROM temporäre_Tabelle)
MINUS
(SELECT column_name FROM user_tab_columns
WHERE table_name=user_tables.table_name)
)
<Lösche temporäre Tabelle>;
FOR <jede Tabelle tab∈merktabs> DO
IF (test_fk(fskand,tab,fskand)) <> <gültiger Fremdschlüssel>
THEN <lösche tab aus merktabs>;
- 83 -
IF merktabs=0 THEN BEGIN
Ausgabe(„Keine Relation gefunden.“);
RETURN;
END ELSE IF merktabs=1 THEN
reftab := merktabs[1];
ELSE
reftab := <Menü-Auswahl der Referenztabelle aus merktabs>;
END ELSE BEGIN
(* Eingabe der Referenzattribute *)
<Eingabe Attribute der Referenztabelle (refattr)>;
IF (test_fk(fskand,reftab,refattr)) <> <gültiger Fremdschlüssel>
THEN BEGIN
Ausgabe(„DB-Zustand widerspricht FS-Vermutung.“);
RETURN;
END;
END;
IF (<Fremdschlüssel schon vorhanden>) THEN
Ausgabe(„Fremdschlüssel ist bereits vorhanden.“);
ELSE BEGIN
anz_for := anz_for + 1;
for_ref[anz_for] := reftab;
<Kopiere Attribute aus fskand in for_key[anz_for]>;
IF col_null[<Alle Attribute aus for_key[anz_for]>] THEN
for_null[anz_for] := TRUE;
ELSE
for_null[anz_for] := FALSE;
<Kopiere Attribute aus refattr in for_col[anz_for]>;
END;
END;
Die Funktion „pk_choose“ (Zeile 727-808) wird an zwei verschiedenen Stellen des
Programmes „ora2rel“ aufgerufen: Beim ersten Aufruf legt das System eigenständig
einen Primärschlüssel fest, bei weiteren Aufrufen kann der Anwender aus der Menge der
Schlüsselkandidaten den Primärschlüssel selbst bestimmen. Um diese unterschiedlichen
Modi zu gewährleisten, wird „pk_choose“ der gewünschte Modus übergeben:
PROCEDURE pk_choose(mode);
VAR merk: Schlüsselkandidat;
BEGIN
IF <Primärschlüssel definiert> THEN BEGIN
(* Primärschlüssel als Schlüsselkand. merken *)
anz_alt := anz_alt + 1;
- 84 -
<Kopiere Attribute aus pri_key in alt_key[anz_alt]>;
END;
IF anz_alt<1 THEN BEGIN
Ausgabe(„Kein Schl.kand. vorhanden. Verwende ganze Tab. als PS!“);
pri_key := <Alle Tabellenfelder>;
END ELSE BEGIN
(* Suche des besten Schlüsselkandidaten (Kriterien siehe 3.1) *)
merk := alt_key[1];
FOR <jeden Schlüsselkandidaten kand∈alt_key> DO BEGIN
IF (<kand hat weniger Nicht-Fremdschlüsselattr. als merk>)
OR ((<kand, merk haben gleichviele Nicht-Fremdschl.attr.>)
AND (<kand hat insgesamt weniger Attr. als merk>))
THEN merk := kand;
END;
(* Auswahl eines Schlüsselkandidaten *)
IF (anz_alt>1) AND (mode<>automatisch) THEN BEGIN
Ausgabe(„Empfehle die Wahl des Schl.kand. “, merk);
merk := <Menü-Auswahl des Primärschlüssels>;
END;
(* Verschiebe Schl.kand. merk in Primärschlüssel *)
<Kopiere Attribute aus merk in pri_key>;
<Lösche merk aus alt_key>;
anz_alt := anz_alt - 1;
END;
END;
Funktion „test_all“ (Zeile 812-821) ermittelt mit Hilfe einer Anfrage, ob die AttributWerte in einer Referenztabelle alle als Attribut-Werte in einem Fremdschlüssel auftreten.
Dies ermöglicht später die Festlegung von Kardinalitäten. „test_all“ werden dazu der
Name der Tabelle mit dem Fremdschlüssel, die Fremdschlüsselattribute, der Name der
Referenztabelle sowie die Referenzattribute übergeben:
FUNCTION test_all(orgtab,orgcol,reftab,refcol);
VAR orgtab,reftab: Tabelle;
VAR orgcol,refcol: <Menge von Attributen>;
BEGIN
SELECT COUNT(*) INTO v_int FROM reftab WHERE NOT EXISTS
(SELECT orgcol FROM orgtab WHERE orgtab.orgcol=reftab.refcol);
IF v_int=0 THEN
RETURN <Alle Werte aus reftab in orgtab>;
END;
- 85 -
„test_all“ wird innerhalb der Funktion „analyze“ (Zeile 825-876) aufgerufen. Mit dieser
Funktion werden alle Informationen gesammelt, die später der Festlegung der
Kardinalitäten dienen:
PROCEDURE analyze();
BEGIN
FOR i:=1 TO anz_for DO BEGIN
(* UNIQUE-Eigenschaft der FS über Vergleich mit Schl.kand. *)
IF (for_key[i]=pri_key) OR (for_key[i]∈alt_key) THEN
for_uni[i] := TRUE;
ELSE
for_uni[i] := FALSE;
(* Aufruf der Funktion test_all *)
IF test_all(rel,for_key[i],for_ref[i],for_col[i])=
<Alle Werte von reftab in orgtab> THEN
for_alle[i] := TRUE;
ELSE
for_alle[i] := FALSE;
END;
END;
Eine Übersicht über den Ablauf des Programmes „ora2rel“ liefern die folgenden
Abbildungen:
- 86 -
conn
ora2rel.pc:
(Anmeldung bei Oracle,
Eingabe des
auszuwertenden Schemas)
eingabe
tab_read
(Tabellennamen aus dem
angegebenen Schema
auslesen)
Oracle-Analyse
durchführen ?
ora2eer_schema
user_tables
tab_analyze
Ja
(Tabellen mit dem OracleKommando "analyze"
analysieren)
user_tables
Nein
Für jede Tabelle des
Schemas tue
user_tab_columns
tab_exam
(Tabellen-Eigenschaften
bestimmen, Spalten und
Indexe lesen)
user_indexes
user_constraints
idx_exam
(Indexe analysieren)
user_ind_columns
fk_read
(Fremdschlüssel lesen:
Referenztabelle und
-spalten ermitteln)
Primärschlüssel
vorhanden ?
user_cons_columns
pk_choose
Nein
(System legt aus Menge
von Schl.kand. den
Primärschlüssel fest)
Ja
analyze
(Anfragen für spätere
KardinalitätenBestimmung ausführen)
Datenbank
(Schleifenende)
new_exam
eingabe
(Benutzer wählt
Tabelle aus, für die er
weitere Schlüssel
eingeben möchte)
schema_write
(Relationen-Schema in
Datei schreiben)
menu
Aus Datenbank
abmelden
- 87 -
ora2rel.pc:
(Unterprogramm new_exam)
Beginn new_exam
Wähle Tabelle aus
Programmende
gewählt ?
Nein
search_pk
(Benutzer gibt mögliche
Schl.kand. ein, Programm
prüft Vermutung)
menu
search_fk
Ja
(Benutzer gibt mögliche
Fremdschl. ein, Programm
prüft Vermutung)
eingabe
pk_choose
(Benutzer wählt aus
Menge von Schl.kand. den
Primärschlüssel aus)
analyze
(Anfragen für spätere
KardinalitätenBestimmung ausführen)
(Schleifenende)
Ende new_exam
Datenbank
- 88 -
4.2.2 rel2pre
Das Programm „rel2pre“ setzt ein aus „ora2rel“ gewonnenes Relationenschema in ein
EER-Schema (PRE-Schema) um. Der Quellcode ist in Anhang E/f nachzuschlagen. Die
Algorithmus-Schritte aus Kapitel 3.3 sind hier wiederzufinden.
Datenstrukturen:
TYPE RELKL = (ser,wer,ber,rbr,sbr);
(Zeile 30)
Relationenklassen bei der Klassifizierung: Starke Entity-Relation, schwache (Weak) EntityRelation, Besondere Entity-Relation, Reguläre Beziehungs-Relation, Spezielle BeziehungsRelation.
TYPE COLKL = (psa,fsa,pfsa,nsa);
(Zeile 33)
Attributklassen bei der Klassifizierung: PrimärSchlüsselAttribut, FremdSchlüsselAttribut,
Primär- und FremdSchlüsselAttribut, NichtSchlüsselAttribut.
TYPE OBJKL = (ent,went,bez,wbez,gen,gbez,fsbez);
(Zeile 36)
Objektklassen eines EER-Schemas: ENTity, Weak ENTity, BEZiehung, Weak BEZiehung
(Beziehung zwischen Weak Entity und Eigentümer), GENeralisierung, GeneralisierungsBEZiehung (1:1-Bez. zwischen Ent., die aus BERs entstanden sind), FremdSchlüsselBEZiehung.
TYPE FKY = RECORD
(Zeile 39-46)
Struktur zur Speicherung von referentiellen Abhängigkeiten / Fremdschlüsseln
anz_col:
INTEGER;
Anzahl der Fremdschlüsselfelder
orgcolnr:
ARRAY [1..MAX_FKY_COL] OF INTEGER;
Attributnummern der Fremdschlüsselfelder
orguni:
BOOLEAN;
Einträge im Fremdschlüssel eindeutig (UNIQUE) ?
refrelnr:
INTEGER;
Nummer der Referenzrelation
refcolnr:
ARRAY [1..MAX_FKY_COL] OF INTEGER;
Attributnummern der Referenzfelder in der Referenztabelle
refuni:
BOOLEAN;
Alle Attribut-Werte der Referenzfelder auch in den Fremdschlüsselattributen ?
END;
- 89 -
TYPE COL = RECORD
Struktur zur Speicherung von Tabellen-Spalten
(Zeile 49-55)
name:
STRING;
Attributname
type:
STRING;
Datentyp der Spalte
null:
BOOLEAN;
Sind leere Einträge erlaubt ?
schl:
INTEGER;
Schlüsselinformation über das Feld: Ungerader Wert => Primärschlüsselattribut,
Wenn Spalte zum Schl.kand. Nr. i gehört, so gilt: schl:=schl+2i
klasse:
COLKL;
Attributklasse, der das Feld bei der Klassifizierung zugeordnet wird
END;
TYPE REL = RECORD
Struktur zur Speicherung von Relationen
(Zeile 58-66)
name:
STRING;
Name der Tabelle
anz_col:
INTEGER;
Anzahl der Tabellen-Spalten
spalte:
ARRAY [1..MAX_COL] OF COL;
Informationen über die Attribute
anz_ref:
INTEGER;
Anzahl der Fremdschlüssel
fs:
ARRAY [1..MAX_FKY] OF FKY;
Informationen über die Fremdschlüssel
klasse:
RELKL;
Relationenklasse, der die Tabelle bei der Klassifizierung zugeordnet wird
objnr:
INTEGER;
Nummer des zugehörigen EER-Objektes
END;
- 90 -
TYPE OBJ = RECORD
(Zeile 69-77)
Struktur zur Speicherung der EER-Objekte, die aus den Relationen erzeugt werden
name:
STRING;
Name des Objektes
klasse:
OBJKL;
EER-Klasse des Objektes
relnr:
INTEGER;
Nummer der Relation, aus der Objekt entstanden ist
anz_ref:
INTEGER;
Anzahl der Verbindungen / Abhängigkeiten zu anderen Objekten
refobjnr:
ARRAY [1..MAX_OBJ] OF INTEGER;
Nummern derjenigen Objekte, mit denen Objekt verbunden ist
kard:
ARRAY [1..MAX_OBJ] OF INTEGER;
Kardinalitäten an den Verbindungen von Beziehungen bzw. Generalisierungen:
1=(0,1);2=(0,n);11=(1,1);12=(1,n);99=Gen
komm:
STRING;
Kommentarzeile
END;
rel_anz:
INTEGER;
Anzahl der gespeicherten Relationen
(Zeile 80)
rel:
ARRAY [1..MAX_REL] OF REL;
Gespeicherte Relationen
(Zeile 81)
obj_anz: INTEGER;
Anzahl der erzeugten EER-Objekte
(Zeile 84)
obj:
ARRAY [1..MAX_OBJ] OF OBJ;
Erzeugte EER-Objekte
(Zeile 85)
Zentrale Algorithmen:
Mit Hilfe der Funktion „schema_lesen“ (Zeile 113-353) wird aus einer Datei ein
Relationenschema eingelesen. Während des Einlesens werden alle Attribute einer Tabelle
implizit klassifiziert. Hier soll nur das Vorgehen bei dieser Klassifizierung angegeben
werden:
PROCEDURE schema_lesen();
BEGIN
<Lies Zeile aus Datei>;
IF <Zeile enthält Attributdefinition> THEN BEGIN
rel[rel_anz].anz_col := rel[rel_anz].anz_col + 1;
- 91 -
rel[rel_anz].spalte[anz_col] := <Informationen aus Zeile>;
END;
IF <Zeile enthält Primärschlüsseldefinition> THEN
FOR feld∈PRIMARY_KEY DO
rel[rel_anz].spalte[feld].klasse := psa;
IF <Zeile enthält Schlüsselkandidatendefinition> THEN
FOR feld∈ALTERNATE_KEY DO
<Merke Schl.kand.nr. in rel[rel_anz].spalte[feld].schl>;
IF <Zeile enthält Fremdschlüsseldefinition> THEN BEGIN
FOR feld∈FOREIGN_KEY DO
<Merke „Fremdschl.attr.“ in rel[rel_anz].spalte[feld].klasse>;
rel[rel_anz].anz_ref := rel[rel_anz].anz_ref + 1;
<Kopiere Fremdschl.-Informationen in rel[rel_anz].fs[anz_ref]>
END;
END;
Nach dem Einlesen des Schemas werden die Relationen mit der Funktion „schema_klass“
(Zeile 356-401) klassifiziert:
PROCEDURE schema_klass();
BEGIN
FOR i:=1 TO rel_anz DO BEGIN
CASE
<PS von rel[i] enthält keinen FS>:
rel[i].klasse := ser;
<PS von rel[i] besteht aus genau einem FS>:
rel[i].klasse := ber;
<PS von rel[i] besteht ausschließlich aus (mehreren) FS>:
rel[i].klasse := rbr;
<PS von rel[i] enthält nur einen FS (und weitere Attr.)>:
rel[i].klasse := wer;
<PS von rel[i] enthält mehrere FS (und weitere Attr.)>:
rel[i].klasse := sbr;
END;
END;
END;
- 92 -
Die Funktion „fs_erz“ (Zeile 424-456) erzeugt eine Fremdschlüsselbeziehung zwischen
zwei Entities. Dazu werden zwei Parameter übergeben, in denen die Nummern der
Relationen stehen, aus denen diese beiden Entities entstanden sind. Außerdem dient die
Nummer des behandelten Fremdschlüssels der Ursprungstabelle als dritter Parameter:
PROCEDURE fs_erz(urtab,reftab,fsnr);
VAR urtab,reftab: Tabellennr;
VAR fsnr: <Fremdschlüsselnr aus urtab>;
BEGIN
IF rel[urtab].fs[fsnr]∈<PS von rel[urtab]> THEN
RETURN;
(* FS ist Teil des PS *)
ELSE BEGIN
(* Erzeuge neues Objekt *)
obj_anz := obj_anz + 1;
obj[obj_anz].name := „HAT“;
obj[obj_anz].klasse := fsbez;
(* Festlegen der Verbindungen *)
obj[obj_anz].anz_ref := 2;
obj[obj_anz].refobjnr[1] := rel[urtab].objnr; (* Objekt aus urtab *)
obj[obj_anz].refobjnr[2] := rel[reftab].objnr; (* Objekt aus reftab *)
(* Festlegen der Kardinalitäten *)
IF <rel[urtab].fs[fsnr] erlaubt leere Einträge> THEN
obj[obj_anz].kard[1] := <(0,1)>;
ELSE
obj[obj_anz].kard[1] := <(1,1)>;
CASE
rel[urtab].fs[fsnr].orguni AND rel[urtab].fs[fsnr].refuni:
obj[obj_anz].kard[2] := <(1,1)>;
NOT (rel[urtab].fs[fsnr].orguni OR rel[urtab].fs[fsnr].refuni):
obj[obj_anz].kard[2] := <(0,n)>;
NOT (rel[urtab].fs[fsnr].orguni) AND rel[urtab].fs[fsnr].refuni:
obj[obj_anz].kard[2] := <(1,n)>;
rel[urtab].fs[fsnr].orguni AND NOT (rel[urtab].fs[fsnr].refuni):
obj[obj_anz].kard[2] := <(0,1)>;
END;
END;
END;
- 93 -
Die Umsetzung des Relationenschemas in ein EER-Schema geschieht in der Funktion
„schema_umsetz“ (Zeile 459-599):
PROCEDURE schema_umsetz();
VAR m,n: INTEGER; (* Relationennummer *)
BEGIN
(* ### 1. PASS: Erstellen der EER-Objekte *)
FOR i:=1 TO rel_anz DO BEGIN
obj_anz := obj_anz + 1;
(* Relation wird zugehöriges Objekt zugeordnet *)
IF rel[i].klasse=sbr THEN
rel[i].objnr := obj_anz + 1;
ELSE
rel[i].objnr := obj_anz;
(* Objekt bekommt gleichen Namen wie Relation *)
obj[obj_anz].name := rel[i].name;
obj[obj_anz].relnr := i;
obj[obj_anz].anz_ref := 0;
IF (rel[i].klasse=ser) OR (rel[i].klasse=ber) THEN
obj[obj_anz].klasse := ent;
ELSE IF (rel[i].klasse=wer) THEN
obj[obj_anz].klasse := went;
ELSE
obj[obj_anz].klasse := bez;
IF rel[i].klasse=wer THEN BEGIN
(* Eigentümer-Beziehung erzeugen *)
obj_anz := obj_anz + 1;
obj[obj_anz].name := „ABHAENGIG“;
obj[obj_anz].relnr := i;
obj[obj_anz].klasse := wbez;
obj[obj_anz].anz_ref := 1;
obj[obj_anz].refobjnr[1] := obj_anz - 1;
(* Objektnr. des weak Entities *)
obj[obj_anz].kard[1] := <(1,1)>;
END;
IF rel[i].klasse=sbr THEN BEGIN
obj[obj_anz].klasse := bez;
obj[obj_anz].anz_ref := 1;
obj[obj_anz].refobjnr[1] := obj_anz + 1;
(* Objektnr. des neuen Entities *)
obj[obj_anz].kard[1] := <1,n>;
(* spezielles Entity erzeugen *)
obj_anz := obj_anz + 1;
obj[obj_anz].name := „SPEZIELL“;
- 94 -
obj[obj_anz].relnr := i;
obj[obj_anz].klasse := ent;
obj[obj_anz].anz_ref := 0;
END;
END;
(* ### 2. PASS: Erstellen der Verknüpfungen *)
FOR i:=1 TO obj_anz DO BEGIN
m := obj[i].relnr;
FOR j:=1 TO rel[m].anz_ref DO BEGIN
n := rel[m].fs[j].refrelnr;
CASE
(* SER können nur über FS Verknüpfungen haben *)
rel[m].klasse=ser:
fs_erz(m,n,j);
(* WER haben zusätzlich im PS Verweis auf Eigentümer *)
rel[m].klasse=wer:
IF (obj[i].klasse=wbez) AND (<FS Nr. j∈PS>) THEN
BEGIN
obj[i].anz_ref := obj[i].anz_ref + 1;
obj[i].refobjnr[obj[i].anz_ref] := rel[n].objnr;
obj[i].kard[obj[i].anz_ref] := <(0,1)>;
END ELSE
IF obj[i].klasse=wbez THEN
(* wbez enthält keine Attribute *)
;
ELSE (* FS für weak Entity *)
fs_erz(m,n,j);
(* Beziehungen bilden *)
(rel[m].klasse=rbr) OR (rel[m].klasse=sbr):
IF (obj[i].klasse=bez) AND (<FS Nr. j∈PS>) THEN
BEGIN
obj[i].anz_ref := obj[i].anz_ref + 1;
obj[i].refobjnr[obj[i].anz_ref] := rel[n].objnr;
(* Kardinalität ermitteln *)
CASE
rel[m].fs[j].orguni AND rel[m].fs[j].refuni:
obj[i].kard[obj[i].anz_ref] := <(1,1)>;
NOT (rel[m].fs[j].orguni OR rel[m].fs[j].refuni):
obj[i].kard[obj[i].anz_ref] := <(0,n)>;
NOT (rel[m].fs[j].orguni) AND rel[m].fs[j].refuni:
obj[i].kard[obj[i].anz_ref] := <(1,n)>;
rel[m].fs[j].orguni AND NOT (rel[m].fs[j].refuni):
obj[i].kard[obj[i].anz_ref] := <(0,1)>;
END;
- 95 -
END ELSE
IF (obj[i].klasse=bez) AND (rel[m].klasse=sbr) THEN
(* Die aus sbr erzeugte Bez. enthält keine Attribute *)
;
ELSE
fs_erz(m,n,j);
(* Generalisierungen ? *)
rel[m].klasse=ber:
IF (<FS Nr. j∈PS>) THEN BEGIN
(* Ist referenzierte Tabelle auch ber ? *)
IF (rel[n].klasse=ber) AND
(<PS von rel[n] verweist auf rel[m]>) THEN
(* 1:1-Beziehung schon erstellt ? *)
IF m<n THEN BEGIN
(* Erstelle Beziehung mit Kard. (1,1) *)
obj_anz := obj_anz + 1;
obj[obj_anz].name := „GLEICH“;
obj[obj_anz].klasse := gbez;
obj[obj_anz].relnr := n;
obj[obj_anz].anz_ref := 2;
obj[obj_anz].refobjnr[1] := i;
obj[obj_anz].refobjnr[2] := rel[n].objnr;
obj[obj_anz].kard[1] := <(1,1)>;
obj[obj_anz].kard[2] := <(1,1)>;
END ELSE ;
ELSE
(* Klasse der Reftab. ungleich ber *)
IF rel[n].klasse<>rbr THEN BEGIN
(* Generalisierung *)
obj[i].klasse := gen;
obj[i].anz_ref := obj[i].anz_ref + 1;
obj[i].refobjnr[obj[i].anz_ref] := rel[n].objnr;
obj[i].kard[obj[i].anz_ref] := <General.>;
END ELSE ;
END ELSE
(* FS Nr. j∉PS *)
fs_erz(m,n,j);
END; (* CASE *)
END;
END;
END;
- 96 -
Beim Schreiben des so erzeugten PRE-Schemas in eine Datei mit Hilfe der Funktion
„schema_schreiben“ (Zeile 602-697) muß jetzt nur noch beachtet werden, daß die
Attribute der Relationen den richtigen Objekten zugeordnet werden:
PROCEDURE schema_schreiben();
BEGIN
FOR i:=1 TO obj_anz DO BEGIN
<Schreibe Datei(obj[i].name)>;
CASE obj[i].klasse OF
ent:
<Schreibe Datei(„Typ Entity“)>;
bez: <Schreibe Datei(„Typ Beziehung“)>;
went: <Schreibe Datei(„Typ schwaches Entity“)>;
wbez: <Schreibe Datei(„Typ schwache Beziehung“)>;
gen: <Schreibe Datei(„Typ Generalisierung“)>;
gbez: <Schreibe Datei(„Typ Beziehung“)>;
fsbez: <Schreibe Datei(„Typ Beziehung“)>;
END;
(* Bestimmte Beziehungstypen dürfen keine Attribute enthalten *)
(* (Sonderfall: Eine aus rbr erzeugte Bez. kann Attr. enthalten) *)
IF (obj[i].klasse<>wbez) AND (obj[i].klasse<>fsbez) AND
((obj[i].klasse<>bez) OR (rel[obj[i].relnr].klasse<>sbr)) THEN
BEGIN
FOR j:=1 TO rel[obj[i].relnr].anz_col DO
(* Beachte Sonderfall, daß eine „GLEICH“-Bez. erstellt *)
(* wurde: Gemeinsame Attr. werden Bez. zugeordnet! *)
(* Sonst können alle (p)fsa vergessen werden *)
IF ((obj[i].klasse<>gbez) AND
((rel[obj[i].relnr].spalte[j].klasse=psa) OR
(rel[obj[i].relnr].spalte[j].klasse=nsa))) OR
((obj[i].klasse=gbez) AND
(rel[obj[i].relnr].spalte[j].klasse=pfsa)) THEN
<Schreibe Datei(rel[obj[i].relnr].spalte[j])>;
END;
<Schreibe alle obj[i].anz_ref Verknüpfungen von obj[i] in Datei>;
END;
END;
- 97 -
Die folgende Darstellung faßt den Funktionsablauf in „rel2pre“ zusammen:
rel2pre.c:
schema_lesen
(Relationen-Schema mit
Spalten und Schlüsseln
aus Datei lesen, Attribute
klassifizieren)
Relationen-Schema
schema_klass
(Relationen in
Abhängigkeit ihres
Primärschl. klassifizieren)
schema_umsetz
fs_erz
(Relationen in EERObjekte umsetzen,
Verknüpfungen und
Kardinalitäten bilden)
(FremdschlüsselBeziehungen erzeugen)
schema_schreiben
(EER-Objekte als PRESchema in Datei ablegen)
Dateien schließen
4.2.3 Übrige Programme
„pre2sdt“ setzt ein erzeugtes PRE-Schema in ein SDT-Schema um. Für diese Aufgabe
wurde ein SED-Script erstellt, dessen Quelle in Anhang E/h zu finden ist.
„ora2eer“ (Anhang E/g) stellt dem Anwender ein Hauptmenü zur Verfügung, aus
dem heraus er alle anderen Programm-Teile aufrufen kann.
Das
SQL-Script
„crschema.sql“
(Anhang
E/i)
erzeugt
eine
Tabelle
„ora2eer_schema“, in der ein Anwender das zu bearbeitende Schema eintragen kann.
Dazu muß jeweils in das Feld „Schema“ ein vom Anwender zu bestimmender SchemaName und in „Tabelle“ ein zugehöriger Tabellennamen eingetragen werden.
Die übrigen erwähnten Programme von Markowitz sind in [14,15,21] dokumentiert.
- 98 -
4.3 Fallstudie: Umsetzung einer Studenten-Datenbank
In diesem Kapitel wird ein Ausschnitt aus der relationalen Studenten-Datenbank der HIS
GmbH in ein EER-Schema umgesetzt. Wir betrachten dabei dieselben Relationen, die
schon in Kapitel 2 als Beispiel dienten:
• SOS
(MtkNr, Semester, Status, Name, Strasse, Ort, Staat,
HmKfzKz, HmKfz, ImmDat, RueDat, ExmDat, ExmGrund)
• STG
(MtkNr, Semester, StgNr, Status, Stg, Abschl, BeuGrund,
EndeGrd)
• K_STG
(Stg, Ktxt, Dtxt, AStat)
• K_ABINT
(Abschl, Ktxt, Dtxt, AStat)
• K_ABSTG
(Stg, Abschl)
• K_AKFZ
(AKfz, Ktxt, Dtxt, AStat, EGMitgl)
• K_IKFZ
(IKfz, Ktxt, Dtxt, AStat)
• K_GDEX
(GdEx, Ktxt, Dtxt, AStat)
• K_GDBU
(GdBu, Ktxt, Dtxt, AStat)
4.3.1 Vorbereitung
Mit dem folgenden SQL-Script werden die genannten Tabellen und die entsprechenden
Indexe in der Datenbank angelegt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE
abschl
ktxt
dtxt
astat
);
CREATE TABLE
stg
abschl
);
CREATE TABLE
akfz
ktxt
dtxt
astat
egmitgl
);
k_abint(
VARCHAR2(2) not null,
VARCHAR2(10),
VARCHAR2(25),
VARCHAR2(2) not null
k_abstg(
VARCHAR2(3) not null,
VARCHAR2(2) not null
k_akfz(
VARCHAR2(3) not null,
VARCHAR2(10),
VARCHAR2(25),
VARCHAR2(3),
VARCHAR2(1)
- 99 -
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
CREATE TABLE k_gdbu(
gdbu
VARCHAR2(1) not null,
ktxt
VARCHAR2(10),
dtxt
VARCHAR2(25),
astat
VARCHAR2(1)
);
CREATE TABLE k_gdex(
gdex
VARCHAR2(2) not null,
ktxt
VARCHAR2(10),
dtxt
VARCHAR2(25),
astat
VARCHAR2(1)
);
CREATE TABLE k_ikfz(
ikfz
VARCHAR2(4) not null,
ktxt
VARCHAR2(10),
dtxt
VARCHAR2(25),
astat
VARCHAR2(5)
);
CREATE TABLE k_stg(
stg
VARCHAR2(3) not null,
ktxt
VARCHAR2(10),
dtxt
VARCHAR2(25),
astat
VARCHAR2(4)
);
CREATE TABLE sos(
MtkNr
INTEGER not null,
Semester
SMALLINT,
Status
VARCHAR2(01),
Name
VARCHAR2(35),
Strasse
VARCHAR2(30),
Ort
VARCHAR2(25),
Staat
VARCHAR2(03),
HmKfzKz
VARCHAR2(01),
HmKfz
VARCHAR2(04),
ImmDat
VARCHAR2(10),
RueBeuDat VARCHAR2(10),
ExmDat
VARCHAR2(10),
ExmGrund
VARCHAR2(02)
);
CREATE TABLE stg(
MtkNr
INTEGER not null,
Semester
SMALLINT not null,
StGNr
VARCHAR2(02) not null,
Status
VARCHAR2(01),
StG
VARCHAR2(03) not null,
Abschl
VARCHAR2(02),
BeuGrund
VARCHAR2(01),
EndeGrd
VARCHAR2(02)
);
CREATE UNIQUE INDEX i_k_abint ON k_abint
CREATE UNIQUE INDEX i_k_abstg ON k_abstg
CREATE UNIQUE INDEX i_k_akfz ON k_akfz
CREATE UNIQUE INDEX i_k_gdbu ON k_gdbu
CREATE UNIQUE INDEX i_k_gdex ON k_gdex
CREATE UNIQUE INDEX i_k_ikfz ON k_ikfz
CREATE UNIQUE INDEX i_k_stg
ON k_stg
CREATE UNIQUE INDEX i_sos
ON sos
CREATE UNIQUE INDEX i_ustg
ON stg
(abschl);
(abschl,stg);
(akfz);
(gdbu);
(gdex);
(ikfz);
(stg);
(MtkNr) ;
(MtkNr,Semester,StGNr);
- 100 -
Anschließend werden einige Datensätze in die Tabellen geladen. Die Daten stammen
dabei aus einer Test-Datenbank der HIS. Einige Instanzen wichtiger Attribute sind in
Anhang D aufgeführt.
4.3.2 Programmstart
Zur Umsetzung der auf diese Weise erzeugten Relationen wird nun das Programm
„ora2eer“ gestartet, das folgendes Hauptmenü auf dem Bildschirm anzeigt:
Hier wird zuerst Menüpunkt „1“ („Dateiname ändern“) gewählt, um den Namen der
Ausgabedatei zu ändern.
Durch Wahl von Punkt „2“ („Oracle-Schema in Relationenschema umsetzen (ora2rel)“)
gelangt man in das Programm „ora2rel“.
- 101 -
4.3.3 Relationenschema erstellen
Nach der Anmeldung an das Oracle-System und der Eingabe des auszuwertenden
Schemas wird hier die Frage, ob Oracle auf jeder Tabelle das „analyze“-Kommando
ausführen soll, mit „j“ bestätigt.
„ora2rel“ liest nun aus dem Data-Dictionary die oben genannten Relationen mit ihren
Attributen und Indexen ein. Weil keine Primärschlüssel definiert wurden, diese aber im
Relationenschema verlangt werden, verwendet das System bei jeder Tabelle ihren Index
als Primärschlüssel. Wäre auf einer Relation kein Index definiert, so würde „ora2rel“ die
Gesamtheit aller Attribute der Tabelle als Primärschlüssel nehmen.
Beispiel:
In Tabelle K_ABINT existiert ein UNIQUE INDEX i_K_ABINT auf dem Feld Abschl.
Aus diesem Grund wird Abschl als Primärschlüssel der Relation verwendet:
PRIMARY KEY (ABSCHL)
- 102 -
Wäre i_K_ABINT nicht definiert, so würden alle Attribute der Relation als
Primärschlüssel verwendet werden:
PRIMARY KEY (ABSCHL,KTXT,DTXT,ASTAT)
Nach Auswertung des Data-Dictionarys kann der Anwender Relationen auswählen, für
die er weitere Schlüsselkandidaten bzw. Fremdschlüssel definieren will.
Da bei Erzeugung obiger Tabellen keine einzige Fremdschlüssel-Bedingung angegeben
wurde und (wie schon in Kapitel 2 gezeigt) für die Relation „STG“ ein zweiter
Schlüsselkandidat festgelegt werden kann, werden hier nacheinander die Relationen
„STG“, „K_ABSTG“ und „SOS“ ausgewählt.
- 103 -
Zunächst wird durch Eingabe von „9“ Tabelle „STG“ betrachtet: Das Zeichen „!“
liefert alle Schlüsselkandidaten und den derzeit gewählten Primärschlüssel der Relation
„STG“ und gibt diese Daten auf dem Bildschirm aus. Wie in Kapitel 2 angegeben, bilden
die drei Attribute „MtkNr“, „Stg“ und „Semester“ einen weiteren Schlüsselkandidaten.
Nach Eingabe dieser drei Attributnamen startet das System eine Anfrage an die
Datenbank, mit der ermittelt werden kann, ob die Kombination dieser Attribute
tatsächlich einen Schlüsselkandidaten erzeugt (siehe Kapitel 3.1):
SELECT COUNT(*) FROM stg GROUP BY mtknr,stg,semester
HAVING COUNT(*)>1
Hier liefert diese Anfrage zunächst, daß die Attribute nicht die für Schlüsselkandidaten
zwingend notwendige Eindeutigkeit ihrer Daten aufweisen, denn als Anfrage-Ergebnis
wird ein Wert größer 1 geliefert.
- 104 -
Eine Überprüfung der Einträge in der Tabelle „STG“ in einem separaten Oracle-Fenster
ergibt, daß hier noch einige inkonsistente Daten vorliegen, die aus der Relation entfernt
werden. In den in Anhang D angegebenen Instanzen muß z.B. die mit „(*)“ markierte
Zeile aus „STG“ gelöscht werden, da diese Zeile doppelt gespeichert wurde. Nach
erneuter Eingabe der drei Attributnamen werden sie als Schlüsselkandidat akzeptiert - die
Kombination der genannten drei Attribute erfüllt nun die UNIQUE-Bedingung.
Nach Eingabe von „0“ gelangt man auf die nächste Bildschirm-Maske, bei der
Fremdschlüssel definiert werden können. Analog zu oben müssen auch hier zunächst die
Attribute der Tabelle „STG“ ausgewählt werden, die einen Fremdschlüssel formen.
Zunächst wird dabei das Feld „Abschl“ eingegeben. Nun wird eine Liste mit allen zum
Schema gehörenden neun Relationen angezeigt, aus der die Tabelle ausgewählt werden
soll, auf die das Feld zeigt. Mit „1“ wird „K_ABINT“ als Referenztabelle festgelegt.
Dann muß das Attribut in der Referenztabelle bestimmt werden, auf die „Abschl“
verweist. Die Eingabe eines falschen Feldnamens führt zur Ausgabe einer Fehlermeldung.
Erst, wenn das Feld „Abschl“ aus „K_ABINT“ richtig eingegeben wird, legt das System
die richtige Fremdschlüssel-Beziehung fest. Die oben angegebenen Instanzen erfüllen die
Bedingung, die mit Hilfe einer Anfrage (siehe 3.1) überprüft wird: Alle Attribut-Werte
von „Abschl“ in „STG“ sind auch in „Abschl“ von „K_ABINT“ gespeichert, weshalb
die Anfrage
SELECT COUNT(*) FROM stg WHERE NOT EXISTS (
SELECT abschl FROM k_abint WHERE k_abint.abschl=stg.abschl)
als Ergebnis 0 liefert.
- 105 -
Auf die gleiche Weise werden auch die weiteren Fremdschlüssel „Beugrund“ und
„Endegrd“ (verweisen auf „K_GDBU.Gdbu“ bzw. „K_GDEX.Gdex“) festgelegt.
Für
die
Felder
„MtkNr“
und
„Stg“
ist
nicht
bekannt,
ob
sie
als
Fremdschlüsselattribute fungieren. Hier hat man aber die Möglichkeit, „ora2rel“
automatisch nach Fremdschlüssel-Beziehungen suchen zu lassen. Dazu wählt man z.B.
das Feld „Stg“ aus Relation „STG“ aus und gibt dann „10“ („Suche Tabellen mit
gleichnamigen Attributen“) ein. Durch Anfragen an das Data-Dictionary werden nun
Tabellen gesucht, die ebenfalls ein Attribut „Stg“ enthalten. Das System liefert dabei die
Tabellen „K_ABSTG“ und „K_STG“ zurück. Über weitere Anfragen an die Datenbank
wird dann ermittelt, welche Relation als Referenztabelle in Frage kommt (siehe oben).
- 106 -
Hier ergibt sich, daß ausschließlich „K_STG“ mögliche Referenztabelle ist, weil in
„STG.Stg“ Werte gespeichert sind, die „K_ABSTG.Stg“ nicht enthält (in den BeispielDaten ist es der Studiengang „SPT“). Die Anfrage
SELECT COUNT(*) FROM stg WHERE NOT EXISTS (
SELECT stg FROM k_abstg WHERE k_abstg.stg=stg.stg)
liefert als Ergebnis einen Wert größer 0. Deshalb wird die Abhängigkeit zwischen „STG“
und „K_STG“ automatisch festgelegt. Sonst muß der Anwender die Referenztabelle aus
allen ermittelten Möglichkeiten auswählen.
Für Attribut „MtkNr“ liefert die automatische Suche Relation „SOS“ als
Referenztabelle. Durch „!“ kann man sich die Fremdschlüssel am Bildschirm anzeigen
lassen, mit „0“ beendet man die Definition weiterer Fremdschlüssel.
- 107 -
Weil nun für Tabelle „STG“ mehrere Schlüsselkandidaten definiert sind, kann der
Anwender aus diesen einen Primärschlüssel auswählen. Nach den in 3.1 angegebenen
Kriterien gibt das Programm aber an, welcher Schlüsselkandidat der am besten passende
Primärschlüssel ist. Hier wird der Schlüsselkandidat „MtkNr, Stg, Semester“
vorgeschlagen, weil er mehr Fremdschlüssel enthält als der andere Kandidat „MtkNr,
StgNr, Semester“.
Die Auswahl eines Primärschlüssels für Tabelle „STG“ hat erheblichen Einfluß auf
die spätere
Umsetzung
des
Relationenschemas
in
ein
EER-Schema:
Wenn
Schlüsselkandidat „2“ gewählt wird, so setzt „rel2pre“ die Tabelle „STG“ in ein
schwaches Entity um, weil dann nur ein Feld des Primärschlüssels gleichzeitig
Fremdschlüssel ist („MtkNr“). Befolgt der Anwender hingegen den Vorschlag des
Systems und wählt „1“ (, was an dieser Stelle auch geschehen soll), so ist zusätzlich auch
das Attribut „Stg“ ein Fremdschlüssel und „STG“ wird in „rel2pre“ als spezielle
Beziehungsrelation klassifiziert.
- 108 -
Für jeden Fremdschlüssel der Tabelle „STG“ wird dann durch Anfragen ermittelt, ob alle
Daten der jeweiligen Referenztabelle auch in „STG“ auftreten und ob die Fremdschlüssel
nur eindeutige Einträge aufweisen. Wie in 3.1 erläutert liefern diese Anfragen Hinweise
auf die Kardinalitäten, die zu den Fremdschlüssel-Beziehungen gehören.
Beispiel:
In der Abhängigkeit „STG.MtkNr→SOS.MtkNr“ erfüllt der Fremdschlüssel „MtkNr“
aus „STG“ nicht die UNIQUE-Eigenschaft, weil jeder Student mehrere Semester bzw.
mehrere Studiengänge studieren kann. Die Anfrage
SELECT COUNT(*) FROM stg GROUP BY mtknr
HAVING COUNT(*)>1
liefert hier ein Ergebnis größer 1. Hingegen hat jeder Student mindestens ein Semester
ein Fach studiert, so daß alle Matrikelnummern aus „SOS“ auch in „STG“ gespeichert
sind:
SELECT COUNT(*) FROM sos WHERE NOT EXISTS
(SELECT mtknr FROM stg WHERE stg.mtknr=sos.mtknr)
ergibt hier den Wert 0. Andererseits wird nicht unbedingt jeder Studiengang von einem
Studenten studiert, so daß bei der Abhängigkeit „STG.Stg→K_STG.Stg“ ermittelt
wird, daß nicht alle Einträge aus „K_STG.Stg“ in „STG.Stg“ auftreten:
SELECT COUNT(*) FROM k_stg WHERE NOT EXISTS
(SELECT stg FROM stg WHERE stg.stg=k_stg.stg)
liefert einen Wert größer 0. (Vergleiche dazu im Anhang D angegebene Beispiel-Daten.)
Durch das gleiche Vorgehen werden nun auch die Fremdschlüssel-Beziehungen
„K_ABSTG.Stg→K_STG.Stg“,
„K_ABSTG.Abschl→K_ABINT.Abschl“
„SOS.Exmgrund→K_GDEX.Gdex“
festgelegt,
wobei
die
ersten
und
beiden
Abhängigkeiten auch durch die automatische Suche gefunden werden können. Bei der
dritten Beziehung scheitert die automatische Suche an den unterschiedlichen
Attributnamen.
- 109 -
Wie in Kapitel 2 erwähnt, dient auch das Feld „HmKfz“ in Tabelle „SOS“ als
Fremdschlüssel. Jedoch bestimmt der Inhalt des Attributes „HmKfzKz“, welche Relation
als
Referenztabelle
fungiert
(„K_AKFZ“
oder
„K_IKFZ“).
Dadurch
enthält
„SOS.HmKfz“ sowohl Daten, die nicht in „K_AKFZ.AKfz“ auftreten, wie auch Daten,
die nicht in „K_IKFZ.IKfz“ zu finden sind (vergleiche Instanzen aus Anhang D). Aus
diesem Grund werden Versuche, die eine oder die andere Abhängigkeit zu definieren,
vom System zurückgewiesen, weil die Anfrage-Ergebnisse (nach Kapitel 3.1 und oben)
den eingegebenen Vermutungen widersprechen. Die Bedingung zur referentiellen
Integrität ist bei diesem Feld nicht erfüllt - „HmKfz“ genügt einer „aufgespaltenen
referentiellen Integritätsbedingung“.
Nach Beendigung des Programmes „ora2rel“ wird das folgende Relationenschema in
der Datei „testdb.rel“ abgelegt (Format siehe Anhang A/a):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
9
RELATION K_ABINT (
ABSCHL VARCHAR2 NO NULLS
ASTAT VARCHAR2 NO NULLS
DTXT VARCHAR2 NULLS ALLOWED
KTXT VARCHAR2 NULLS ALLOWED
PRIMARY KEY (ABSCHL)
)
RELATION K_ABSTG (
ABSCHL VARCHAR2 NO NULLS
STG VARCHAR2 NO NULLS
PRIMARY KEY (ABSCHL,STG)
FOREIGN KEY (ABSCHL) (n)
REFERENCES K_ABINT(ABSCHL) (n)
INSERT RESTRICTED
DELETE RESTRICTED
FOREIGN KEY (STG) (n)
REFERENCES K_STG(STG) (n)
INSERT RESTRICTED
DELETE RESTRICTED
)
RELATION K_AKFZ (
AKFZ VARCHAR2 NO NULLS
ASTAT VARCHAR2 NULLS ALLOWED
DTXT VARCHAR2 NULLS ALLOWED
EGMITGL VARCHAR2 NULLS ALLOWED
KTXT VARCHAR2 NULLS ALLOWED
PRIMARY KEY (AKFZ)
)
RELATION K_GDBU (
ASTAT VARCHAR2 NULLS ALLOWED
DTXT VARCHAR2 NULLS ALLOWED
GDBU VARCHAR2 NO NULLS
KTXT VARCHAR2 NULLS ALLOWED
PRIMARY KEY (GDBU)
)
- 110 -
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
RELATION K_GDEX (
ASTAT VARCHAR2 NULLS ALLOWED
DTXT VARCHAR2 NULLS ALLOWED
GDEX VARCHAR2 NO NULLS
KTXT VARCHAR2 NULLS ALLOWED
PRIMARY KEY (GDEX)
)
RELATION K_IKFZ (
ASTAT VARCHAR2 NULLS ALLOWED
DTXT VARCHAR2 NULLS ALLOWED
IKFZ VARCHAR2 NO NULLS
KTXT VARCHAR2 NULLS ALLOWED
PRIMARY KEY (IKFZ)
)
RELATION K_STG (
ASTAT VARCHAR2 NULLS ALLOWED
DTXT VARCHAR2 NULLS ALLOWED
KTXT VARCHAR2 NULLS ALLOWED
STG VARCHAR2 NO NULLS
PRIMARY KEY (STG)
)
RELATION SOS (
EXMDAT VARCHAR2 NULLS ALLOWED
EXMGRUND VARCHAR2 NULLS ALLOWED
HMKFZ VARCHAR2 NULLS ALLOWED
HMKFZKZ VARCHAR2 NULLS ALLOWED
IMMDAT VARCHAR2 NULLS ALLOWED
MTKNR NUMBER NO NULLS
NAME VARCHAR2 NULLS ALLOWED
ORT VARCHAR2 NULLS ALLOWED
RUEBEUDAT VARCHAR2 NULLS ALLOWED
SEMESTER NUMBER NULLS ALLOWED
STAAT VARCHAR2 NULLS ALLOWED
STATUS VARCHAR2 NULLS ALLOWED
STRASSE VARCHAR2 NULLS ALLOWED
PRIMARY KEY (MTKNR)
FOREIGN KEY (EXMGRUND) (n)
REFERENCES K_GDEX(GDEX) (n)
INSERT RESTRICTED
DELETE RESTRICTED
)
RELATION STG (
ABSCHL VARCHAR2 NULLS ALLOWED
BEUGRUND VARCHAR2 NULLS ALLOWED
ENDEGRD VARCHAR2 NULLS ALLOWED
MTKNR NUMBER NO NULLS
SEMESTER NUMBER NO NULLS
STATUS VARCHAR2 NULLS ALLOWED
STG VARCHAR2 NO NULLS
STGNR VARCHAR2 NO NULLS
PRIMARY KEY (MTKNR,SEMESTER,STG)
ALTERNATE KEY (MTKNR,SEMESTER,STGNR)
FOREIGN KEY (MTKNR) (n)
REFERENCES SOS(MTKNR) (A)
INSERT RESTRICTED
DELETE RESTRICTED
FOREIGN KEY (STG) (n)
REFERENCES K_STG(STG) (n)
INSERT RESTRICTED
DELETE RESTRICTED
- 111 -
97
FOREIGN KEY (BEUGRUND) (n)
98
REFERENCES K_GDBU(GDBU) (n)
99
INSERT RESTRICTED
100
DELETE RESTRICTED
101
FOREIGN KEY (ENDEGRD) (n)
102
REFERENCES K_GDEX(GDEX) (n)
103
INSERT RESTRICTED
104
DELETE RESTRICTED
105
FOREIGN KEY (ABSCHL) (n)
106
REFERENCES K_ABINT(ABSCHL) (n)
107
INSERT RESTRICTED
108
DELETE RESTRICTED
109 )
Im Hinblick auf obiges Beispiel soll in dieser Datei die Tabelle „STG“ (Zeile 78-109)
genauer betrachtet werden:
Nach der Definition der Attribute (Zeile 79-86) erscheint in Zeile 87 der oben vom
Anwender gewählte Primärschlüssel. Der vom Index „i_USTG“ vorgegebene
Schlüsselkandidat steht in Zeile 88. Die folgenden Zeilen bestimmen die FremdschlüsselBeziehungen, die von der Relation „STG“ ausgehen. So ist zum Beispiel vermerkt, daß
das Feld „MtkNr“ (Zeile 89) auf „MtkNr“ in Tabelle „SOS“ (Zeile 90) verweist. Die
beiden darauf folgenden Zeilen (91/92) dienen der Kompatibilität des PRE-Schemas zum
SDT-Schema - sie werden nicht ausgewertet. Am Ende der Zeilen 89/90 stehen in
Klammern die Ergebnisse der Anfragen, die zur Ermittlung der Kardinalitäten dienen.
Wie oben angegeben hat „MtkNr“ keine UNIQUE-Eigenschaft, weshalb (in Zeile 89) ein
„n“ vermerkt wurde. Im anderen Fall würde hier ein „U“ stehen. In Zeile 90 hingegen ist
ein „A“ notiert, weil obige Anfrage an die Datenbank ergeben hat, daß alle
Matrikelnummern aus „SOS“ auch in „STG“ gespeichert sind. Indessen sind nicht alle
Studiengänge aus „K_STG“ auch in „STG.Stg“ abgelegt, so daß bei dieser
Abhängigkeit ein „n“ notiert wird (Zeile 94).
Durch Wahl des Punktes „3“ („Relationenschema editieren“) im Hauptmenü kann
diese Datei noch editiert werden, bevor mit „4“ („Relationenschema in EER-Schema
umsetzen (rel2pre)“) die Umsetzung gestartet wird.
- 112 -
4.3.4 Umsetzung des Relationenschemas in ein PRE-Schema
Der Start des Programms „rel2pre“ erzeugt folgende Bildschirm-Ausgabe:
Hier hat der Anwender keinen Einfluß mehr auf die Art der Umsetzung. Erst die
entstehende Datei „testdb.pre“ kann durch Wahl des Punktes „5“ („EER-Schema
editieren“) aus dem Hauptmenü heraus editiert werden:
1
2
3
4
5
6
7
8
9
10
11
14
K_ABINT(E)
ATTRS: ABSCHL (ID, "", , VARCHAR2 NO NULLS),
ASTAT (, "", , VARCHAR2 NO NULLS),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_ABINT ist SER/BER";
K_ABSTG(R)
ARCS: K_ABINT (k(2), , ),
K_STG (k(2), , )
DESCR: "Rel. K_ABSTG ist RBR";
- 113 -
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
K_AKFZ(E)
ATTRS: AKFZ (ID, "", , VARCHAR2 NO NULLS),
ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
EGMITGL (, "", , VARCHAR2 NULLS ALLOWED),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_AKFZ ist SER/BER";
K_GDBU(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
GDBU (ID, "", , VARCHAR2 NO NULLS),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_GDBU ist SER/BER";
K_GDEX(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
GDEX (ID, "", , VARCHAR2 NO NULLS),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_GDEX ist SER/BER";
K_IKFZ(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
IKFZ (ID, "", , VARCHAR2 NO NULLS),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_IKFZ ist SER/BER";
K_STG(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
KTXT (, "", , VARCHAR2 NULLS ALLOWED),
STG (ID, "", , VARCHAR2 NO NULLS)
DESCR: "Rel. K_STG ist SER/BER";
SOS(E)
ATTRS: EXMDAT (, "", , VARCHAR2 NULLS ALLOWED),
HMKFZ (, "", , VARCHAR2 NULLS ALLOWED),
HMKFZKZ (, "", , VARCHAR2 NULLS ALLOWED),
IMMDAT (, "", , VARCHAR2 NULLS ALLOWED),
MTKNR (ID, "", , NUMBER NO NULLS),
NAME (, "", , VARCHAR2 NULLS ALLOWED),
ORT (, "", , VARCHAR2 NULLS ALLOWED),
RUEBEUDAT (, "", , VARCHAR2 NULLS ALLOWED),
SEMESTER (, "", , NUMBER NULLS ALLOWED),
STAAT (, "", , VARCHAR2 NULLS ALLOWED),
STATUS (, "", , VARCHAR2 NULLS ALLOWED),
STRASSE (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. SOS ist SER/BER";
STG(R)
ARCS: SPEZIELL_STG (k(12), , ),
SOS (k(12), , ),
K_STG (k(2), , )
DESCR: "Rel. STG ist SBR";
SPEZIELL_STG(E)
ATTRS: SEMESTER (ID, "", , NUMBER NO NULLS),
STATUS (, "", , VARCHAR2 NULLS ALLOWED),
STGNR (, "", , VARCHAR2 NO NULLS)
DESCR: "Spez. Entity zu SBR STG";
HAT_1(R)
ARCS: SOS (k(1), , ),
K_GDEX (k(2), , )
DESCR: "FS-Bez. (REFERENCE) SOS --> K_GDEX";
- 114 -
71
72
73
74
75
76
77
78
79
80
81
82
HAT_2(R)
ARCS:
SPEZIELL_STG (k(1), , ),
K_GDBU (k(2), , )
DESCR: "FS-Bez. (REFERENCE) STG --> K_GDBU";
HAT_3(R)
ARCS: SPEZIELL_STG (k(1), , ),
K_GDEX (k(2), , )
DESCR: "FS-Bez. (REFERENCE) STG --> K_GDEX";
HAT_4(R)
ARCS: SPEZIELL_STG (k(1), , ),
K_ABINT (k(2), , )
DESCR: "FS-Bez. (REFERENCE) STG --> K_ABINT";
Daraus kann folgendes EER-Schema abgelesen werden:
K_GDEX
(0,N)
K_GDBU
(0,N)
HAT_1
(0,N)
HAT_3
(0,1)
(0,1)
SOS
HAT_2
(1,N)
STG
(1,N)
(0,N)
HAT_4
(0,N)
K_ABSTG
SPEZIELL_STG
(0,1)
K_STG
K_AKFZ
(0,1)
(0,N)
(0,N)
K_ABINT
K_IKFZ
Die Relationen „K_ABINT“, „K_AKFZ“, „K_IKFZ“, „K_GDBU“, „K_GDEX“,
„K_STG“ und „SOS“ werden in gleichnamige Entities („E“) umgesetzt, deren
Primärschlüsselattribute durch die Angabe von „ID“ in der jeweiligen Attribut-Zeile
markiert werden. Für jedes Feld wird weiterhin vermerkt, welchen Datentyp es hat und
ob leere Einträge erlaubt sind oder nicht.
Tabelle „K_ABSTG“ (Zeile 8-11) wird als Beziehung („R“) klassifiziert, weil alle
Felder seines Primärschlüssels auch als Fremdschlüsselattribute fungieren. Die Beziehung
enthält keine eigenen Attribute, sondern stellt die Verbindung zwischen den Entities
- 115 -
„K_ABINT“ und „K_STG“ her. Als Kardinalitäten werden auf beiden Seiten (0,n)
(„k(2)“) notiert (Zeile 9/10).
„STG“ wird als spezielle Beziehungs-Relation klassifiziert und somit in eine
Beziehung und ein Entity umgesetzt. Das Entity „SPEZIELL_STG“ (Zeile 62-66)
enthält dabei alle Attribute aus Relation „STG“, die nicht als Fremdschlüsselattribut
dienen. Das Feld „Semester“ ist in Tabelle „STG“ Bestandteil des Primärschlüssels,
wurde aber nicht gleichzeitig als Fremdschlüsselattribut klassifiziert. Deshalb dient es in
dem neuen Entity als Primärschlüssel (Zeile 63). „STG“ (Zeile 57-61) ist eine dreifache
Beziehung, die aus dem Primärschlüssel der gleichnamigen Relation entsteht. Sie
verbindet die drei Entities „SPEZIELL_STG“, „SOS“ und „K_STG“ (Zeile 58-60). An
den beiden ersten Verbindungen werden dabei die Kardinalitäten (1,n) („k(12)“) notiert.
Die Untergrenze kommt dadurch zustande, daß alle Einträge aus „SOS.MtkNr“ bzw.
„SPEZIELL_STG.Semester“ in „STG“ zu finden sind. Bei speziellen BeziehungsRelationen („STG“) kann zwischen den beiden aus dieser Tabelle erzeugten Objekten
(Beziehung „STG“ und Entity „SPEZIELL_STG“) grundsätzlich als Kardinalität (1,n)
festgelegt werden, bei der Verbindung zwischen „SOS“ und „STG“ wird die
Information aus dem Relationenschema ausgenutzt, daß alle Matrikelnummern aus
„STG“ auch in „SOS“ gespeichert sind.
In den Zeilen 67-82 werden die Fremdschlüssel-Beziehungen („HAT“) notiert. Jede
dieser funktionalen Beziehungen hat dabei als Kardinalität auf der Seite der
Referenztabelle (0,n) („k(2)“) stehen, weil die Fremdschlüssel keine UNIQUEEigenschaft erfüllen. Auf der anderen Seite steht jeweils (0,1) („k(1)“), da alle
Fremdschlüsselattribute auch leere Einträge erlauben.
Um auch ein Beispiel für eine Generalisierung / Spezialisierung anzugeben, wird das
oben notierte Relationenschema um die Tabelle „TEST“ erweitert:
1
2
3
4
5
6
7
8
9
10
RELATION TEST (
COL1 NUMBER NO NULLS
COL2 CHAR NO NULLS
STG CHAR NO NULLS
PRIMARY KEY (STG)
FOREIGN KEY (STG) (U)
REFERENCES K_STG(STG) (n)
INSERT RESTRICTED
DELETE RESTRICTED
)
- 116 -
Diese Tabelle wird als besondere Entity-Relation klassifiziert, weil der Primärschlüssel
von „TEST“ aus nur einem Fremdschlüssel besteht:
1
2
3
4
5
TEST(Gen)
ATTRS: COL1 (, "", , NUMBER NO NULLS),
COL2 (, "", , CHAR NO NULLS)
ARCS: K_STG (k(99), , )
DESCR: "Bez. (REFERENCE) zw. BER TEST und Rel. K_STG --> Gen.";
Umgesetzt wird Tabelle „TEST“ deshalb in ein gleichnamiges Entity, das eine
Spezialisierung von „K_STG“ darstellt, weshalb als Objekttyp „Gen“ (Zeile 1) notiert
wird. An der Verbindung zu „K_STG“ steht keine Kardinalität - der Wert „k(99)“ gibt
an, daß es sich hier um die Verbindung zwischen einem Entity und einer Generalisierung
bzw. Spezialisierung handelt.
4.3.5 Umwandlung in ein SDT-Schema
Durch Wahl des Punktes „6“ („EER-Schema in SDT-Schema umsetzen (pre2sdt)“) im
Hauptmenü wird nun das in „test.pre“ abgelegte EER-Schema in ein SDT-Schema
umgewandelt, um es später mit dem Tool „erdraw“ von Markowitz grafisch ausgeben zu
können. Bei dieser Umwandlung werden durch das SED-Script „pre2sdt“ die
Kardinalitäten in SDT-konforme Begriffe umgesetzt. Aus den Kardinalitäten „(0,n)“
wird so ein „HAS_M“ (Zeile 9,10,60,69,73,77,81), aus „(0,1)“ ein „HAS“ (Zeile
68,72,76,80) und aus „(1,n)“ ein „A_HAS_M“ (Zeile 58,59):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
14
K_ABINT(E)
ATTRS: ABSCHL (ID, "", , VARCHAR2 NO NULLS),
ASTAT (, "", , VARCHAR2 NO NULLS),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_ABINT ist SER/BER";
K_ABSTG(R)
ARCS: K_ABINT (HAS_M, , ),
K_STG (HAS_M, , )
DESCR: "Rel. K_ABSTG ist RBR";
K_AKFZ(E)
ATTRS: AKFZ (ID, "", , VARCHAR2 NO NULLS),
ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
EGMITGL (, "", , VARCHAR2 NULLS ALLOWED),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_AKFZ ist SER/BER";
- 117 -
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
K_GDBU(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
GDBU (ID, "", , VARCHAR2 NO NULLS),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_GDBU ist SER/BER";
K_GDEX(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
GDEX (ID, "", , VARCHAR2 NO NULLS),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_GDEX ist SER/BER";
K_IKFZ(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
IKFZ (ID, "", , VARCHAR2 NO NULLS),
KTXT (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. K_IKFZ ist SER/BER";
K_STG(E)
ATTRS: ASTAT (, "", , VARCHAR2 NULLS ALLOWED),
DTXT (, "", , VARCHAR2 NULLS ALLOWED),
KTXT (, "", , VARCHAR2 NULLS ALLOWED),
STG (ID, "", , VARCHAR2 NO NULLS)
DESCR: "Rel. K_STG ist SER/BER";
SOS(E)
ATTRS: EXMDAT (, "", , VARCHAR2 NULLS ALLOWED),
HMKFZ (, "", , VARCHAR2 NULLS ALLOWED),
HMKFZKZ (, "", , VARCHAR2 NULLS ALLOWED),
IMMDAT (, "", , VARCHAR2 NULLS ALLOWED),
MTKNR (ID, "", , NUMBER NO NULLS),
NAME (, "", , VARCHAR2 NULLS ALLOWED),
ORT (, "", , VARCHAR2 NULLS ALLOWED),
RUEBEUDAT (, "", , VARCHAR2 NULLS ALLOWED),
SEMESTER (, "", , NUMBER NULLS ALLOWED),
STAAT (, "", , VARCHAR2 NULLS ALLOWED),
STATUS (, "", , VARCHAR2 NULLS ALLOWED),
STRASSE (, "", , VARCHAR2 NULLS ALLOWED)
DESCR: "Rel. SOS ist SER/BER";
STG(R)
ARCS: SPEZIELL_STG (A_HAS_M, , ),
SOS (A_HAS_M, , ),
K_STG (HAS_M, , )
DESCR: "Rel. STG ist SBR";
SPEZIELL_STG(E)
ATTRS: SEMESTER (ID, "", , NUMBER NO NULLS),
STATUS (, "", , VARCHAR2 NULLS ALLOWED),
STGNR (, "", , VARCHAR2 NO NULLS)
DESCR: "Spez. Entity zu SBR STG";
HAT_1(R)
ARCS: SOS (HAS, , ),
K_GDEX (HAS_M, , )
DESCR: "FS-Bez. (REFERENCE) SOS --> K_GDEX";
HAT_2(R)
ARCS: SPEZIELL_STG (HAS, , ),
K_GDBU (HAS_M, , )
DESCR: "FS-Bez. (REFERENCE) STG --> K_GDBU";
HAT_3(R)
ARCS: SPEZIELL_STG (HAS, , ),
K_GDEX (HAS_M, , )
DESCR: "FS-Bez. (REFERENCE) STG --> K_GDEX";
- 118 -
79
80
81
82
HAT_4(R)
ARCS:
SPEZIELL_STG (HAS, , ),
K_ABINT (HAS_M, , )
DESCR: "FS-Bez. (REFERENCE) STG --> K_ABINT";
Betrachtet man wieder die Erweiterung des Schemas um Tabelle „TEST“, so würden
zusätzlich die folgenden Zeilen am Ende der Datei „test.sdt“ stehen:
1
2
3
4
5
TEST(E)
ATTRS: COL1 (, "", , NUMBER NO NULLS),
COL2 (, "", , CHAR NO NULLS)
ARCS: K_STG (ISA, , )
DESCR: "Bez. (REFERENCE) zw. BER TEST und Rel. K_STG --> Gen.";
Im Unterschied zu obigem PRE-Schema gibt es bei SDT-Schemata nicht die
Möglichkeit, Generalisierungen / Spezialisierungen zu definieren. Das Objekt „TEST“
wird hier deshalb als Entity behandelt (Zeile 1), das mit Objekt „K_STG“ verbunden ist.
Die Art dieser Verbindung wird auf „ISA“ festgelegt (Zeile 4).
Auch das SDT-Schema kann über das Hauptmenü editiert werden. Dazu ist die
Wahl des siebenten Hauptmenü-Punktes („SDT-Schema editieren“) erforderlich.
4.3.6 Vergleich der erzeugten SDT-Schemata
Das in der Datei „testdb.rel“ abgelegte Relationenschema (siehe oben) kann auch mit
dem Programm „rel2sdt“ von Markowitz direkt in ein SDT-Schema umgesetzt werden.
Aufgerufen wird dieses Programm durch Wahl des Punktes „11“ („Relationenschema in
SDT-Schema umsetzen (rel2sdt - MARKOWITZ)“) im Hauptmenü:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Generated by rel2sdt
9
K_ABINT(E)
ATTRS: ABSCHL (ID, "", , varchar NO NULLS),
ASTAT (, "", , varchar NO NULLS),
DTXT (, "", , varchar NULLS ALLOWED),
KTXT (, "", , varchar NULLS ALLOWED)
DESCR: "";
K_ABSTG(R)
ARCS: K_ABINT (M, RESTRICTED, ),
K_STG (M, RESTRICTED, )
DESCR: "";
K_AKFZ(E)
ATTRS: AKFZ (ID, "", , varchar NO NULLS),
ASTAT (, "", , varchar NULLS ALLOWED),
DTXT (, "", , varchar NULLS ALLOWED),
EGMITGL (, "", , varchar NULLS ALLOWED),
KTXT (, "", , varchar NULLS ALLOWED)
DESCR: "";
- 119 -
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
K_GDBU(E)
ATTRS: ASTAT (, "", , varchar NULLS ALLOWED),
DTXT (, "", , varchar NULLS ALLOWED),
GDBU (ID, "", , varchar NO NULLS),
KTXT (, "", , varchar NULLS ALLOWED)
DESCR: "";
K_GDEX(E)
ATTRS: ASTAT (, "", , varchar NULLS ALLOWED),
DTXT (, "", , varchar NULLS ALLOWED),
GDEX (ID, "", , varchar NO NULLS),
KTXT (, "", , varchar NULLS ALLOWED)
DESCR: "";
K_IKFZ(E)
ATTRS: ASTAT (, "", , varchar NULLS ALLOWED),
DTXT (, "", , varchar NULLS ALLOWED),
IKFZ (ID, "", , varchar NO NULLS),
KTXT (, "", , varchar NULLS ALLOWED)
DESCR: "";
K_STG(E)
ATTRS: ASTAT (, "", , varchar NULLS ALLOWED),
DTXT (, "", , varchar NULLS ALLOWED),
KTXT (, "", , varchar NULLS ALLOWED),
STG (ID, "", , varchar NO NULLS)
DESCR: "";
SOS(E)
ATTRS: EXMDAT (, "", , varchar NULLS ALLOWED),
HMKFZ (, "", , varchar NULLS ALLOWED),
HMKFZKZ (, "", , varchar NULLS ALLOWED),
IMMDAT (, "", , varchar NULLS ALLOWED),
MTKNR (ID, "", , number NO NULLS),
NAME (, "", , varchar NULLS ALLOWED),
ORT (, "", , varchar NULLS ALLOWED),
RUEBEUDAT (, "", , varchar NULLS ALLOWED),
SEMESTER (, "", , number NULLS ALLOWED),
STAAT (, "", , varchar NULLS ALLOWED),
STATUS (, "", , varchar NULLS ALLOWED),
STRASSE (, "", , varchar NULLS ALLOWED)
ARCS: K_GDEX (HAS, RESTRICTED, )
DESCR: "";
STG(E)
ATTRS: SEMESTER (ID, "", , number NO NULLS),
STATUS (, "", , varchar NULLS ALLOWED),
STGNR (, "", , varchar NO NULLS)
ARCS: SOS (ID, RESTRICTED, ),
K_STG (ID, RESTRICTED, ),
K_GDBU (HAS, RESTRICTED, ),
K_GDEX (HAS, RESTRICTED, ),
K_ABINT (HAS, RESTRICTED, )
DESCR: "";
- 120 -
Daraus kann folgendes Schema abgelesen werden:
K_GDEX
K_GDBU
HAS
HAS
HAS
SOS
STG
ID
ID
K_STG
K_AKFZ
M
K_ABSTG
HAS
M
K_ABINT
K_IKFZ
Auffällig sind dabei die folgenden Unterschiede zu dem oben erstellten SDT-Schema:
• Relation „STG“ wird von Markowitz anders klassifiziert und umgesetzt als im
selbstentwickelten Algorithmus: Weil der Primärschlüssel von „STG“ nicht
ausschließlich aus Fremdschlüsselfeldern besteht, wird diese Tabelle als EntityObjekt behandelt. Alle Attribute und Beziehungen werden dem Objekt „STG“
zugeordnet. Die aus den beiden Attributen „MtkNr“ und „Stg“ des
Primärschlüssels von Relation „STG“ folgenden Abhängigkeiten werden als
„ID“-Verbindungen von Objekt „STG“ zu den Objekten „SOS“ bzw. „K_STG“
dargestellt (Zeile 63/64). Oben wurde Tabelle „STG“ als spezielle EntityRelation klassifiziert und deshalb in ein Entity „SPEZIELL_STG“ und eine
Beziehung „STG“ umgewandelt.
• Die Fremdschlüsselbeziehungen „HAT“ fehlen im Schema von Markowitz ganz.
„rel2sdt“ ordnet stattdessen die Verbindungen zwischen Fremdschlüssel und
Referenztabelle direkt den Entities zu (Zeile 57, 65-67).
An diesen Punkten kann man erkennen, daß „rel2sdt“ weniger Struktur-Informationen
aus dem Relationenschema abliest als „rel2pre“ und „pre2sdt“.
4.3.7 Grafische Ausgabe des Schemas
Mittels des Menüpunktes „8“ („SDT-Schema in ERD-Schema umsetzen (sdt2erd MARKOWITZ)“) wird dann das SDT-Schema aus der Datei „testdb.sdt“ in ein ERD-
- 121 -
Schema umgewandelt, das einzig der grafischen Ausgabe des Schemas dient. Die
entstehende Datei kann mit „9“ („ERD-Schema editieren“) editiert und nach Wahl des
Punktes „10“ („ERDRAW aufrufen (erdraw - MARKOWITZ)“) mit dem MarkowitzTool „erdraw“ eingelesen werden. „erdraw“ stellt dann das Schema grafisch in folgender
Form dar:
- 122 -
Auf der ersten Seite des Schemas sind alle Entities aufgeführt. Durch Weiterblättern
gelangt man dann zur zweiten Seite, auf der alle Beziehungen abgebildet sind:
- 123 -
Die nun folgenden Seiten enthalten einzeln alle Entities mit den dazugehörigen
Beziehungen. So wird zum Beispiel auf Seite 3 des ERD-Schemas das Entity
„K_ABINT“ dargestellt. Weil die Beziehungen „K_ABSTG“ und „HAT_4“ auf
„K_ABINT“ verweisen, sind auch diese Objekte mit allen damit verbundenen Objekten
auf dieser Seite aufgeführt:
- 124 -
Weil auf Entity „K_AKFZ“ keine Abhängigkeit verweist, enthält die vierte Seite des
ERD-Schemas nur dieses Objekt. Interessanter ist wieder „K_GDBU“, da die
Fremdschlüsselbeziehung „HAT_2“ von „SPEZIELL_STG“ auf „K_GDBU“ verweist:
Analog dazu werden auf Seite 6 die beiden Fremdschlüsselbeziehungen „HAT_1“ und
„HAT_3“ von „SOS“ bzw. „SPEZIELL_STG“ auf Entity „K_GDEX“ dargestellt.
Seite 7 enthält wieder nur ein Entity: Das Objekt „K_IKFZ“ ist hier abgebildet.
- 125 -
Auf Entity „K_STG“ verweisen die Beziehungen „K_ABSTG“ und „STG“.
Deshalb werden beide Beziehungen und alle an diesen Beziehungen teilnehmenden
Objekte auf der achten Seite des Schemas dargestellt:
- 126 -
Das Objekt „SOS“ ist Bestandteil der Beziehung „STG“. Außerdem verweist die
Fremdschlüsselbeziehung „HAT_1“ von „SOS“ auf „K_GDEX“. Aus diesem Grund
werden diese Objekte auf der neunten Bildschirm-Seite von „erdraw“ abgebildet:
- 127 -
Die komplexeste Grafik enthält die letzte Seite des ERD-Schemas. Die vier Beziehungen
„STG“, „HAT_2“, „HAT_3“ und „HAT_4“ enthalten alle Verweise auf das Entity
„SPEZIELL_STG“. Deshalb sind hier nahezu alle Objekte des ERD-Schemas
aufgeführt:
4.4 Bewertung der Resultate
Sieht man von der „aufgespaltenen referentiellen Integritätsbedingung“ bei Feld
„HmKfz“ ab („HmKfz“ bildet keinen Fremdschlüssel im eigentlichen Sinne: Das Attribut
„HmKfzKz“ bestimmt, ob Tabelle „K_AKFZ“ oder „K_IKFZ“ Referenztabelle ist), so
deckt sich das hier erhaltene Ergebnis mit dem, was am Ende des Kapitels 3.3 zu
erwarten war. Insofern ist das Ergebnis besser als die Resultate, die mit einem der
anderen Verfahren zu erzielen sind. Allerdings ist es auch hier noch notwendig, daß der
Anwender alle relevanten Fremdschlüssel und Schlüsselkandidaten bestimmt, sofern sie
nicht aus dem Oracle-Datenbank-Schema abzulesen sind. Eine Möglichkeit wäre, die
- 128 -
Anfragen aus Kapitel 3.1 auf allen möglichen Feldkombinationen auszuprobieren, um
damit den Anwender zu entlasten. Dieses scheitert jedoch daran, daß die Anzahl der
Anfragen exponentiell mit der Anzahl der Attribute in den Tabellen ansteigt und mit ihr
auch die Laufzeit. Ein automatisches Durchsuchen der Datenbank nach Schlüsseln ist nur
bei winzigen Schemata möglich, hier aber gleichzeitig auch unnötig, denn bei
entsprechend kleinen Datenbanken ist ein Tools zum Reverse Engineering nicht mehr
erforderlich.
Weiterhin ist zu beachten, daß eventuell fehlerhafte Eingaben des Anwenders nur
dann erkannt werden, wenn die gespeicherten Instanzen, also der jeweilige DatenbankZustand, dies zuläßt. Für dieses Verfahren gibt es aber keine Alternative, so daß diese
Abhängigkeit vom Zustand der Datenbank in Kauf genommen werden muß.
Wenn wir als Beispiel die letzte Seite des ERD-Schemas betrachten (s.o.), so fällt
auf, daß die Umsetzung dieses Schemas in ein Relationenschema wieder auf die
ursprüngliche Tabellen-Struktur zurückführt. Hieran sieht man recht deutlich, daß alle
wichtigen Struktur-Informationen des Relationenschemas im EER-Schema umgesetzt
werden.
Wie bereits in Kapitel 3.4 erwähnt sind auch am Ende dieses Verfahrens noch
Änderungen am entstandenen Schema notwendig, um die Lesbarkeit zu erhöhen.
Besonders „erdraw“ bietet hier noch nicht ausreichend Möglichkeiten der grafischen
Darstellung. So werden Kardinalitäten noch nicht abgebildet und die Objekte
Generalisierungen / Spezialisierungen gibt es bei den Werkzeugen von Markowitz
überhaupt nicht. Hier kann die Entwicklung eines neuen grafischen Tools, das ein PRESchema direkt auswerten und als EER-Schema auf dem Bildschirm ausgeben kann,
schon für Abhilfe sorgen. Jedoch muß der Anwender auch dann noch z.B. die Namen der
Fremdschlüssel-Beziehungen ändern.
Zu bemerken ist außerdem, daß die Information über Schlüsselkandidaten bei dem
Schritt vom Relationenschema zum PRE-Schema verloren geht. Dies liegt daran, daß im
EER-Modell, wie es am Anfang des zweiten Kapitels definiert worden ist, keine
Schlüsselkandidaten-Angabe möglich ist. Auch das SDT-Schema von Markowitz sieht
eine solche Option nicht vor.
- 129 -
4.5 Folgerungen für das Relationenschema
Aus den Umsetzungs-Ergebnissen können Korrekturen abgelesen werden, die die
relationale Struktur der Test-Datenbank verbessern:
• In Tabelle „STG“ sollte der Primärschlüssel aus den Attributen „MtkNr“,
„Semester“ und „Stg“ zusammengesetzt werden. Damit wird also im
bisherigen Primärschlüssel das Attribut „StgNr“ durch „Stg“ ersetzt.
• Die Attribute „HmKfzKz“ und „HmKfz“ in Relation „SOS“ sollten zu einem
Fremdschlüsselattribut „HmKfz“ verschmolzen werden. In den Tabellen
„K_AKFZ“
bzw.
„K_IKFZ“
Primärschlüsselattributen
die
werden
dann
Kennzeichen
den
„A“
Daten
bzw.
in
„I“
den
(aus
„SOS.HmKfzKz“) vorangestellt. Weiterhin sollte eine neue Tabelle „K_KFZ“
mit
nur
einem
Attribut
„Kfz“
erzeugt
werden,
die
in
diesem
Primärschlüsselattribut alle Daten aus „K_AKFZ.AKfz“ sowie „K_IKFZ.IKfz“
speichert. Dadurch kann erreicht werden, daß „K_AKFZ“ und „K_IKFZ“ von
„rel2pre“ als besondere Entity-Relationen klassifiziert werden und so eine
(totale exklusive) Generalisierung erzeugt wird, die den Zweck der Relationen
am besten wiedergeben.
Nach diesen Änderungen wird durch die Programme „ora2rel“ und „rel2pre“ für die
Tabellen „SOS“, „K_KFZ“, „K_AKFZ“ und „K_IKFZ“ das folgende EER-Schema
erzeugt:
SOS
HAT_1
K_KFZ
K_AKFZ
K_IKFZ
- 130 -
4.6 Vergleich mit Chiangs Verfahren
Bei Vergleich des Verfahrens von Chiang (siehe Kapitel 2) mit dem in Kapitel 3
vorgestellten neuen Algorithmus fällt als erstes das gemeinsame Problem der
Namensgebung auf: Kein Algorithmus kann helfen, sinnvolle Namen für die
unterschiedlichen Objekte im Zielschema zu vergeben. In beiden Zielschemata existieren
Objekte mit Namen wie „HAT“. Hier ist der Anwender gefordert, Bezeichnungen zu
wählen, die die Lesbarkeit des EER-Schemas erhöhen.
Hingegen wird der Anwender bei der Ermittlung von Schlüsselkandidaten und
Fremdschlüsseln durch das neue Verfahren besser unterstützt: Während Chiang
Namensgleichheit von Attributen ausnutzt, um Fremdschlüsselvermutungen zu äußern,
werden im eigenen Algorithmus diese Vermutungen zusätzlich durch DatenbankAnfragen überprüft. Außerdem ermittelt das System mögliche Schlüsselkandidaten über
Anfragen. Aber auch diese Vermutungen müssen durch den Anwender überprüft und
gegebenenfalls korrigiert werden, da die Ergebnisse der Anfragen vom jeweiligen
Datenbank-Zustand abhängig sind. Dennoch erhält der Nutzer eine sinnvolle
Unterstützung bei der Definition weiterer Schlüssel, weil unsinnige Angaben durch das
Verfahren erkannt und zurückgewiesen werden, sofern ausreichend viele Instanzen in der
Datenbank gespeichert sind.
Außerdem enthält das Zielschema von Chiang keine Kardinalitäten. Das neue
Verfahren hingegen bestimmt mögliche Kardinalitäten über Anfragen an die Datenbank.
Ein weiterer Unterschied liegt in der Reihenfolge, in der die Beziehungs-Relationen
umgesetzt werden. Durch das Vorziehen der Erstellung der Entities zu speziellen EntityRelationen vor die Bildung von Beziehungen (siehe Kapitel 3.3, Schritt 5) werden beim
eigenen Verfahren auch Beziehungen zwischen diesen „SPEZIELL“-Entities und
anderen Entities oder Beziehungen erkannt und gebildet. Bei Chiang ist dies nicht
möglich.
Weiterhin ist der Grad der Automatisierung erhöht worden, indem der Anwender
nicht mehr auswählen muß, ob Attribute an ein Entity oder eine Beziehung gehängt
werden, wenn beide Fälle äquivalent sind (siehe Schritt 15 von Chiang). Im eigenen
Verfahren werden die Attribute in diesem Fall immer dem Entity zugeordnet.
- 131 -
4.7 S-Designor Professional
Ein weiteres Tool, das eine Option zum Reverse Engineering von Datenbanken anbietet,
ist das Programm „S-Designor Professional“, dessen Beta-Version im Rahmen dieser
Arbeit kurz getestet wurde. Das Programm wurde von Xiao-Yun Wang, Powersoft
GmbH, entwickelt und stand in der Version 4.1.2 zum Test zur Verfügung (frei erhältlich
unter „http://www.powersoft.com/mktg/prodinfo/designor/sdpro.html“).
Der S-Designor ist ein Werkzeug, das unter Microsoft-Windows (ab Version 3.10)
lauffähig ist und mit Datenbanken zusammenarbeitet, die dem ODBC (Open DataBase
Connectivity) - Standard von Microsoft entsprechen. Neben einer Option zum Reverse
Engineering bietet es dem Anwender vor allem die Möglichkeit, im S-Designor definierte
„Entities“ (dieser Begriff hat hier eine andere Bedeutung als i.A. üblich, siehe unten) als
Relationen in unterschiedlichen Datenbank-Systemen zu erzeugen (Ein kurzer Bericht
über diese Funktionen ist in der Zeitschrift „PC Professionell“, Ausgabe 01/96, Seite 92,
zu finden). Diese Möglichkeiten werden hier jedoch nicht weiter behandelt - stattdessen
wurde die Funktion „Reverse Engineering“ genauer betrachtet:
Nach Wahl dieser Funktion muß eine Datenbank spezifiziert werden, auf die das
Tool angewendet werden soll. Zum Test wurde unter Microsoft-Access 2.0 eine
Datenbank angelegt, die dieselben Tabellen aufweist wie die bereits in Kapitel 4.3
betrachtete Test-Datenbank. Nach Auswahl dieser Datenbank im S-Designor startet die
Reverse Engineering-Funktion, die sehr schnell arbeitet und folgende BildschirmAusgaben erzeugt:
- 132 -
Der Anwender hat dabei an keiner Stelle die Möglichkeit, in den Algorithmus
einzugreifen. Das Ergebnis, das diese Funktion liefert, wird wie folgt dargestellt:
Hieran sieht man recht deutlich, daß der S-Designor kein Schema erzeugt, das dem
(E)ER-Modell entspricht, sondern die Tabellen der Access-Datenbank auf dem
- 133 -
Bildschirm ausgibt und über Namensgleichheiten referentielle Abhängigkeiten vermutet.
So wird beispielsweise der Verweis von „STG.MtkNr“ auf „SOS.MtkNr“ richtig
vermutet, die Beziehung zwischen „STG“ und „GDEX“ wird hingegen nicht erkannt,
weil die Attribute „Beugrund“ bzw. „Gdex“ unterschiedliche Namen haben. Selbst
wenn die entsprechenden Fremdschlüssel-Beziehungen direkt in Access definiert werden,
kann der S-Designor diese nicht auswerten und darstellen.
Verwunderlich ist auch das Ergebnis in Bezug auf die Attribute „Stg“ und „Abschl“
in Relation „STG“: Hier wird eine Beziehung zwischen „STG“ und „K_ABSTG“
vermutet, was, wie in Kapitel 4.3 zu sehen ist, sogar dem Datenbank-Zustand
widerspricht. Offensichtlich werden bei der Reverse Engineering-Funktion des SDesignor Instanzen nicht ausgewertet, denn sonst würde eine solche Beziehung nicht
vermutet werden.
Durch Nachbereitung des Schemas im S-Designor kann eine ähnliche Darstellung
gewonnen werden, wie bereits Microsoft-Access in seiner Funktion „Beziehungen“
bietet. Dabei werden die Tabellen der Datenbank auf dem Bildschirm ausgegeben und
Attribute, die durch Fremdschlüssel-Definitionen miteinander in Beziehung stehen,
werden durch einfache Pfeile verbunden. Einzig die Funktion, Verbindungen zwischen
gleichnamigen Attributen unterschiedlicher Relationen zu erzeugen, bietet Access nicht.
Aus diesem Grund fällt die Bewertung der Reverse Engineering-Funktion des SDesignor sehr negativ aus: Das Zielschema, das erzeugt wird, stellt nur die in der
Datenbank definierten Tabellen auf dem Bildschirm dar. Gleichnamige Attribute
verschiedener Tabellen werden miteinander verbunden, ohne daß Instanzen, die in der
Datenbank abgelegt sind, dabei beachtet werden. Fremdschlüssel-Informationen werden,
zumindest was Microsoft-Access angeht, aus dem ursprünglichen Datenbank-System
überhaupt nicht übernommen. Befremdlich wirkt außerdem, daß die Tabellen im SDesignor als „Entities“ bezeichnet werden - die Begriffe „Relationship“ oder
„Beziehung“ sind dem System hingegen unbekannt.
Die Existenz eines solchen Tools deutet aber darauf hin, daß in nächster Zeit im
Bereich „Reverse Engineering von Datenbanken“ einige Neuerungen zu erwarten sind.
Vielleicht bietet schon die nächste Version des S-Designor in dieser Hinsicht mehr
Möglichkeiten.
- 134 -
5 Ausblick
Wie bereits angemerkt, sind die im Rahmen dieser Arbeit entstandenen Programme noch
an einigen Stellen zu verbessern und zu erweitern:
• Das in Kapitel 3 vorgestellte Verfahren ist noch nicht vollständig im Programm
implementiert: Es fehlt noch die Behandlung von Aggregationen sowie die
Unterscheidung zwischen den verschiedenen Generalisierungs-Typen. Hier liegt
ein erster Ansatz, das Umsetzungs-Programm „rel2pre“ zu erweitern.
• Die Interaktivität der Werkzeuge „ora2rel“ sowie „rel2pre“ sollte erhöht werden
und der Anwender an mehr Stellen die Möglichkeit erhalten, in die UmsetzRoutinen einzugreifen. So kann es zum Beispiel sinnvoll sein, bei der Festlegung
der Kardinalitäten den Anwender mehr in den Umsetz-Prozeß einzubinden.
Außerdem hat der Nutzer bisher keinen Einfluß auf die Klassifizierung der
Tabellen - auch an dieser Stelle ist es vielleicht hilfreich, wenn das System beim
Anwender nachfragt, welche Klassifizierung sinnvoll ist. Jedoch ist dabei immer
abzuwägen, ob es sinnvoller ist, den Nutzer durch viele Fragen mehr in den
Umsetz-Prozeß einzubinden, oder ob es nicht besser ist, wenn die Programme
nahezu automatisch arbeiten und der Anwender erst nach der Umsetzung die
Möglichkeit erhält, das entstandene Zielschema zu ändern. Unter Beachtung
derselben Frage ist auch zu diskutieren, ob der Anwender schon während des
Umsetz-Prozesses Namen von EER-Objekten festlegen sollte.
• Einige Möglichkeiten, die zum Beispiel das Oracle-Datenbanksystem dem
Anwender bietet, werden von „ora2rel“ noch nicht ausgewertet. So ist zum
Beispiel aus Trigger-Definitionen ablesbar, wie die Kardinalitäten an Beziehungen
festzulegen sind. Die Analyse von Views kann helfen, Zusammenhänge zwischen
Relationen zu ermitteln, um beispielsweise Hinweise auf Fremdschlüssel zu
erhalten.
Durch
die
Untersuchung
von
Datenbank-Operationen
in
Anwenderprogrammen können weitere Informationen über den Aufbau einer
Datenbank gewonnen werden (vgl. [2,17], siehe Ende Kapitel 2).
- 135 -
• Durch die Teilung der Umsetzungs-Routine in die zwei Tools „ora2rel“ und
„rel2pre“ ist es verhältnismäßig einfach, neben Oracle auch andere DatenbankSysteme zu unterstützen. Um beispielsweise auch relationale Datenbanken eines
Informix-Systems in ein EER-Schema umzusetzen, ist es nur noch notwendig, ein
Programm „inf2rel“ zu entwickeln, das ein Relationenschema im vorgegebenen
Format (siehe Anhang A/a) erzeugt. Durch „rel2pre“ kann auch dieses aus einer
Informix-Datenbank entstandene Schema ausgewertet werden.
Diese Punkte betreffen aber nur die schon vorhandenen Werkzeuge. Der erste Schritt
sollte sicherlich die Entwicklung eines Programmes sein, das die Ausgabe-Schemata von
„rel2pre“ auswerten und als EER-Schema darstellen kann.
Eine andere Frage ist die Einbindung der entwickelten Tools in ein interaktives
Entwurfsunterstützungssystem. Ein mit den Programmen erzeugtes EER-Schema bildet
die Grundlage für einen neuen Datenbank-Entwurf. Durch die Analyse des EERSchemas können Fehler erkannt werden, die bei dem ursprünglichen Datenbank-Entwurf
gemacht wurden. Nach Behebung der Fehler muß aus dem EER-Schema wieder ein
Relationenschema gewonnen werden. Für diesen Vorgang gibt es bereits einige
Programme, die automatisch die zugehörigen Tabellen aufbauen. Die Kombination
solcher Tools mit den Programmen dieser Arbeit bildet so ein umfassendes Werkzeug,
um vorhandene relationale Datenbanken zu optimieren.
Das Ziel muß aber nicht immer ein Relationenschema sein. Ebenso ist es auch
denkbar, aus dem (verbesserten) EER-Schema eine objektorientierte Datenbank zu
entwickeln.
Ein weiterer Punkt ist die Art der Anwendung der Programme: In dieser Arbeit
wurde ausschließlich darauf eingegangen, wie man „überlieferte“ Relationenschemata
verbessert, indem man sie auf Basis des erzeugten EER-Schemas komplett neu entwirft.
Unter dem Stichwort „Vermächtnis-Systeme“ bzw. (englisch) „legacy systems“ sind zu
diesem Thema weitere Artikel in der Literatur zu finden. Demgegenüber ist ein System
wünschenswert, bei dem einer Änderung in der Relationen-Struktur nicht unbedingt eine
komplette neue Umsetzung mit Hilfe der Programme folgen muß, sondern bei dem eine
derartige Änderung auch „nur“ eine Änderung im EER-Schema hervorruft. Dadurch
kann die Pflege von relationalen Datenbanken erheblich vereinfacht werden. Jedoch ist
die Umsetzung eines kleinen Teils eines Relationenschemas problematisch, weil z.B.
- 136 -
Fremdschlüssel zwischen Tabellen nicht erkannt werden können, wenn die jeweilige
Referenztabelle nicht ebenfalls umgesetzt wird. Dennoch ist ein solches System
realisierbar, wenn der Anwender dafür sorgt, daß das alte EER-Schema und das neue
Teil-Schema in geeigneter Form kombiniert werden. Aber auch ein Algorithmus ist
vorstellbar, der diese Aufgabe übernimmt. Es muß dann aber darauf geachtet werden,
daß Relationenschema und EER-Schema quasi gleichzeitig verändert werden müssen.
Auch wenn nur eine Änderung des Relationenschemas im EER-Schema nicht
nachvollzogen wird, kann dies das Zielschema schon so stark verfälschen, daß die
Struktur der Datenbank nicht mehr erkannt wird. Sinnvoll wäre hier also eine
Datenbank-Umgebung, bei der Änderungen an der relationalen Struktur die sofortige
Änderung des zugehörigen EER-Schemas bewirkt.
Wenn man die Ankündigungen vieler Datenbank-Hersteller beachtet, so wird deutlich,
daß das Thema „Reverse Engineering“ zunehmende Bedeutung erhält. Nicht nur der in
Kapitel 4.7 kurz vorgestellte „S-Designor“ bietet eine Option zum „Reverse
Engineering“ an, auch die Firma Oracle hat für die nächste Version ihres
Datenbanksystems eine solche Möglichkeit angekündigt. Es ist aber auch verständlich,
daß immer mehr Hersteller von Datenbank-Managementsystemen sich mit diesem Thema
beschäftigen, denn viele bereits existierende Datenbanken bedürfen einer Überarbeitung
und Optimierung. Ein Werkzeug mit „Reverse Engineering“-Option kann den
Datenbank-Entwickler bei dieser Arbeit unterstützen.
- 137 -
Glossar
Abhängigkeit
In dieser Arbeit ist der Begriff „Abhängigkeit“ stets mit „referentieller
Abhängigkeit“ gleichzusetzen. Zwei Attribute, die in verschiedenen Relationen
gespeichert sind, bezeichnet man als referentiell abhängig voneinander, wenn die
Speicherung eines Wertes in der einen Tabelle die Speicherung desselben Wertes in
der anderen Relation voraussetzt (siehe auch Kapitel 2.4).
Data-Dictionary
Relationale →DBMS verwalten die Tabellen, Indexe, Attribute usw. der
verschiedenen Anwender intern auch mit Hilfe von Relationen. Die Gesamtheit
aller dieser System-Tabellen wird als Data-Dictionary bezeichnet.
Datenbank-Managementsystem (DBMS)
Ein DBMS verwaltet Daten und kümmert sich um den Zugriff auf eine Datenbank.
Die am weitesten verbreitete Sprache zum Zugriff auf →relationale Datenbanken
ist →SQL. Nahezu jedes moderne DBMS enthält diese Anfrage-Sprache.
Häufig anzutreffen sind die DBMS der Hersteller Oracle, Informix oder Sybase
(E)ER-Schema
Ein Schema, das dem →(E)ER-Modell genügt.
Entity-Relationship-Modell (ER-Modell)
Konzepte dieses Modells sind Entities (Objekte der realen Welt) und Relationships
(Beziehungen). Diese werden grafisch dargestellt (siehe auch Kapitel 2.3).
Erweitertes Entity-Relationship-Modell (EER-Modell)
Erweiterungen des →ER-Modells um Elemente wie „Generalisierungen“ oder
„Aggregationen“. Es gibt viele verschiedene Varianten des EER-Modells (siehe
auch Kapitel 2.3).
- 138 -
Feld
Einige Datenbank-Hersteller benutzen den Begriff „Feld“ statt „Attribut“. In dieser
Arbeit werden deshalb beide Bezeichnungen synonym verwendet.
„is a“-Beziehung
Beziehung zwischen zwei Entity-Typen, von denen eines als „Master“, eines als
„Slave“ bezeichnet wird. Zwischen Master und Slave besteht dabei eine InklusionsBeziehung bzw. →Abhängigkeit, bei der Slave vollständig in Master enthalten ist.
Bezogen auf das Relationenmodell bedeutet dies, daß die Slave-Tabelle zusätzliche
Daten zu einzelnen Datensätzen der Master-Relation enthält. Der Primärschlüssel
der Slave-Tabelle muß dazu den der Master-Tabelle enthalten.
relationale Datenbank
Daten werden in Form von Tabellen in einer Datenbank gespeichert. Eine Tabelle
wird dabei als Relation bezeichnet. Diese Art der Speicherung basiert auf dem
→Relationenmodell.
Relationenmodell
Das relationale Datenmodell beruht auf der Struktur Tabelle oder Relation. Jede
Zeile einer solchen Tabelle nennt man Tupel. Alle Informationen einer Datenbank,
also sowohl Objekte als auch ihre Beziehungen untereinander, werden durch
Relationen dargestellt. Beziehungen sind vorhanden, wenn ein Wert in mehreren
Tabellen vorkommt. Zwischen diesen Tabellen besteht dann eine →Abhängigkeit
(siehe auch Kapitel 2.4).
Relationenschema
Ein Schema, das dem →Relationenmodell genügt.
SQL
Structured Query Language = Strukturierte Anfrage-Sprache
SQL ist eine standardisierte Sprache für den Zugriff auf →relationale
Datenbanken. Sie enthält sowohl Befehle zur Datenselektion als auch zur
Datenmanipulation.
Trigger
Trigger (oder Triggered Procedures) enthalten Befehlsfolge(n), die nach Änderung
von Tabelleneinträgen aufgerufen werden und die Gültigkeit der Einträge prüfen.
Auf diese Weise kann die Integrität einer Datenbank sichergestellt werden.
- 139 -
Literaturhinweise
[1]
Albrecht, M.: Semantikakquisition im Reverse-Engineering. Reihe Informatik I
(4/94), Technische Universität Cottbus
[2]
Andersson, M.: Extracting an Entity Relationship Schema from a Relational
Database through Reverse Engineering. in: Proc. Thirteenth Internat. Conf. on
Entity Relationship Approach, 1994, S. 403-419
[3]
Batini, C. / Ceri, S. / Navathe, S.: Conceptual Database Design - An Entity
Relationship Approach. The Benjamin/Cummings Publishing Company,
Redwood City (California), 1992
[4]
Chiang, R.H.L. / Barron, T.M. / Storey, V.C.: Performance Evaluation of
Reverse Engineering Relational Databases into Extended Entity-Relationship
Models. in: Proc. Twelfth Internat. Conf. on Entity Relationship Approach, 1993,
S. 352-363
[5]
Chiang, R.H.L. / Barron, T.M. / Storey, V.C.: Reverse Engineering of Relational
Databases - Extraction of an EER Model from a Relational Database. in: Data
& Knowledge Engineering, Vol. 12, 1994, S. 107-142
[6]
Date, C.J.: An Introduction to Database Systems Vol. I (5th ed.). AddisonWesley Publ. Co., Reading (Mass.), 1990
[7]
Davis, K.H. / Arora, A.K.: Converting a Relational Database Model into an
Entity-Relationship Model. in: Proc. Seventh Internat. Conf. on Entity
Relationship Approach, 1988, S. 271-285
[8]
Hainaut, J.-L.: Database Reverse Engineering - Models, Techniques,
Strategies. in: Proc. Tenth Internat. Conf. on Entity Relationship Approach, 1991,
S. 729-741
[9]
Hainaut / Tonneau / Joris / Chandelon: Transformation-based Database Reverse
Engineering. in: Proceedings of the ER Conference, 1993
[10] Johannesson, P. / Kalman, K.: A Method for Translating Relational Schemas
into Conceptual Schemas. in: Proc. Eighth Internat. Conf. on Entity Relationship
Approach, 1989, S. 271-285
[11] Lipeck, U.W.: Skriptum zur Vorlesung „Datenbanksysteme“. Vorlesung an der
Universität Hannover, 1993
- 140 -
[12] Lipeck, U.W.: Skriptum zur Vorlesung „Datenbank-Entwurf“. Vorlesung an
der Universität Hannover, 1994
[13] Markowitz, V.M. / Makowsky, J.A.: Identifying Extended Entity-Relationship
Object Structures in Relational Schemas. in: IEEE Transactions on Software
Engineering, Vol. 16, No. 8, August 1990, S. 777-790
[14] Markowitz, V.M. / Shoshani, A.: An Overview of the Lawrence Berkeley
Laboratory Extended Entity-Relationship Database Tools. Technical Report
LBL-34932, Lawrence Berkeley Laboratory, Dezember 1993
[15] Markowitz, V.M. / Wang, J. / Fang, W.: SDT 6.3 - A Schema Definition and
Translation Tool for Extended Entity-Relationship Schemas (Reference
Manual). Technical Report LBL-27843, Lawrence Berkeley Laboratory,
Dezember 1993
[16] Navathe, S.B. / Awong, A.M.: Abstracting Relational and Hierarchical Data
with a Semantic Data Model. in: Proc. Sixth Internat. Conf. on Entity
Relationship Approach, 1987, S. 305-333
[17] Petit, J.-M. / Kouloumdjian, J. / Boulicaut, J.-F. / Toumani, F.: Using Queries to
Improve Database Reverse Engineering. in: Proc. Thirteenth Internat. Conf. on
Entity Relationship Approach, 1994, S. 369-385
[18] Premerlani, W.J. / Blaha, R.B.: An Approach for Reverse Engineering of
Relational Databases. in: Communications of the ACM 1994, Vol. 37, No. 5,
S. 42-49
[19] Shoval, P. / Shreiber, N.: Database Reverse Engineering - From the Relational
to the Binary Relationship Model. in: Data & Knowledge Engineering, Vol. 10,
1993, S. 293-315
[20] Signore, O. / Loffredo, M. / Cima, M.: Reconstruction of ER Schema from
Database Applications - a Cognitive Approach. in: Proc. Thirteenth Internat.
Conf. on Entity Relationship Approach, 1994, S. 387-401
[21] Szeto, E. / Markowitz, V.M.: ERDRAW 5.3 - A Graphical Editor for Extended
Entity-Relationship Schemas (Reference Manual). Technical Report LBLPUB-3084, Lawrence Berkeley Laboratory, Dezember 1993
[22] Ullmann, J.D.: Principles of Database and Knowledge-Base Systems (Vol. I).
Computer Science Press, Rockville (Md.), 1988
[23] Wenguang, J. / Carlson, C.R. / Dreyer, D.: An Algorithm Converting Relational
Schemas to Nested Entity Relationship Schemas. in: Proc. Tenth Internat. Conf.
on Entity Relationship Approach, 1991, S. 231-246
[24] Zehnder, C.: Informationssysteme und Datenbanken. Teubner, Stuttgart, 1989
Herunterladen