Entwicklung einer Anfragesprache für temporale Datenbanken

Werbung
Entwicklung einer
Anfragesprache für
temporale Datenbanken:
Semantik, Ausdrucksfähigkeit und
graphische Benutzerschnittstelle
Diplomarbeit von
Barbara Ingrid Kuhn
im Rahmen des Studiengangs
Mathematik mit Nebenfach Informatik
an der Universität Hannover
Prüfer:
Prof. Dr. Udo Lipeck
Hannover, den 19. November 1997
Zusammenfassung
Die Notwendigkeit, in temporalen Datenbanksystemen temporale Daten berücksichtigen
zu müssen, findet zunehmend Beachtung. Insbesondere die Speicherung von Gültigkeitszeiträumen von Datenbankeinträgen ermöglicht eine effektivere Nutzung z.B. von Daten aus Geschäftsprozessen. Anfragen vergangene, aktuelle und zukünftige Datenbankzustände betreffend könnten gestellt werden. Solche Anfragen bedürfen eines geeigneten
Werkzeugs: einer mächtigen temporalen Anfragesprache, die aber leicht zu erlernen ist.
Basierend auf dem TEER–Modell, einer temporalen Erweiterung des EER–Modells, wird
in dieser Arbeit eine graphische temporale Datenbank–Anfragesprache vorgestellt. Anfragen werden mit Hilfe eines graphischen TEER–Anfrage–Editors auf der Basis des der
Datenbank zugrundeliegenden TEER–Schemas gestellt. Dadurch muß der Anwender nur
das in der Regel leicht verständliche konzeptionelle Schema der Datenbank kennen, um
Anfragen stellen zu können.
Formal definiert wird die TEER–Anfragesprache durch Festlegung einer Syntax und einer
Semantik unter Verwendung des hier vorgestellten TEER–Kalküls. Desweiteren werden
eine exemplarische Implementierung der Anfragesprache vorgeschlagen und ein TEER–
Anfrage–Editor zur Demonstration der Sprache implementiert. Auf Einschränkungen der
Sprache bzw. der sie definierenden Syntax/Semantik sowie auf Verbesserungsmöglichkeiten wird hingewiesen.
4
Inhaltsverzeichnis
1 Einleitung
9
1.1 Gegenstand der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.2 Aufbau der Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Grundlagen
13
2.1 Das EER–Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.1
EER–Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.2
EER–Diagramm
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.2 Ein Beispiel–Datenbank–Schema . . . . . . . . . . . . . . . . . . . . . . . . 18
2.3 Die Datentyp–Signatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.1
Formale Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.2
EER–Standarddatentyp–Signatur . . . . . . . . . . . . . . . . . . . 21
2.4 Die EER–Signatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4.1
Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4.2
Semantik
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.5 Der EER–Kalkül . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.1
Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5.2
Semantik
2.5.3
Anfragen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2.6 Relationenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.6.1
Formale Definition . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.6.2
Transformation des EER–Modells in das Relationenmodell . . . . . 39
3 Ein graphisches temporales Datenmodell
43
3.1 Das TEER–Modell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2 Ein temporales Beispiel–Datenbank–Schema . . . . . . . . . . . . . . . . . 47
3.3 TEER–Standarddatentyp–Signatur . . . . . . . . . . . . . . . . . . . . . . 47
3.4 Lineare Syntax der TEER–Standarddatentyp–Signatur . . . . . . . . . . . 56
3.5 Transformation des TEER–Modells in das Relationenmodell . . . . . . . . 57
5
INHALTSVERZEICHNIS
4 Die TEER–Anfragesprache
69
4.1 Eine graphische temporale Anfragesprache . . . . . . . . . . . . . . . . . . 69
4.1.1
Konstrukte der TEER–Anfragesprache . . . . . . . . . . . . . . . . 69
4.1.2
Anfrageeditor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.1.3
TEER–Datenbank–Anfragesprache . . . . . . . . . . . . . . . . . . 73
4.2 Der TEER–Kalkül . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.2.1
Die umgangssprachlichen temporalen Prädikate . . . . . . . . . . . 87
4.2.2
Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
4.2.3
Semantik
4.2.4
Auswertung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
4.3 Transformation in den TEER–Kalkül . . . . . . . . . . . . . . . . . . . . . 97
4.3.1
Voraussetzungen und Einschränkungen . . . . . . . . . . . . . . . . 98
4.3.2
Die Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
4.3.3
Die Transformation von restrict expr und restrict attr . . . . 102
4.3.4
Die Transformation von temp sel expr . . . . . . . . . . . . . . . . 103
4.3.5
Die Transformation von temp proj expr . . . . . . . . . . . . . . . 104
4.3.6
Die Transformationsregeln . . . . . . . . . . . . . . . . . . . . . . . 105
4.3.7
Beispieltransformationen . . . . . . . . . . . . . . . . . . . . . . . . 111
5 Exemplarische Implementierung in SQL
125
5.1 Voraussetzungen in ORACLE . . . . . . . . . . . . . . . . . . . . . . . . . 125
5.2 Übersetzung der Beispielanfragen . . . . . . . . . . . . . . . . . . . . . . . 128
5.2.1
Übersetzung des Get–Operators . . . . . . . . . . . . . . . . . . . . 128
5.2.2
Übersetzung des Restrict–Operators . . . . . . . . . . . . . . . . . . 131
5.2.3
Übersetzung des Query–result–link–Operators . . . . . . . . . . . . 133
5.2.4
Übersetzung des temporalen Projektionsoperators . . . . . . . . . . 136
5.2.5
Übersetzung des True–time–Operators . . . . . . . . . . . . . . . . 139
5.2.6
Übersetzung des temporalen Selektionsoperators . . . . . . . . . . . 144
5.2.7
Übersetzung des Time–link–Operators . . . . . . . . . . . . . . . . 148
6 Kritik und Ausblick
151
A Implementierung der Testdatenbank
155
A.1 Die Tabelle Firma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
A.2 Die Tabelle Angestellter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
A.3 Die Tabelle Abteilung
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
6
INHALTSVERZEICHNIS
A.4 Die Tabelle Produkt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
A.5 Die Tabelle Mitarbeiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
A.6 Die Tabelle Zulieferfirma . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
A.7 Die Tabelle Vorprodukt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
A.8 Die Tabelle gehoert zu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
A.9 Die Tabelle produziert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
A.10 Die Tabelle liefert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
B Syntax der TEER–Datenbank–Anfragesprache
165
C Transformation in den TEER–Kalkül
167
D Benutzerhandbuch
175
D.1 Modularisierung und Installation . . . . . . . . . . . . . . . . . . . . . . . 175
D.2 Erstellung des TEER–Modells . . . . . . . . . . . . . . . . . . . . . . . . . 178
D.3 Handbuch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
D.3.1 Das Hauptfenster . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
D.3.2 Laden eines Schemas . . . . . . . . . . . . . . . . . . . . . . . . . . 182
D.3.3 Die Editoroperatoren Remove und Duplicate . . . . . . . . . . . . . 183
D.3.4 Der Get–Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
D.3.5 Der Restrict–Operator . . . . . . . . . . . . . . . . . . . . . . . . . 189
D.3.6 Der Query–result–link–Operator . . . . . . . . . . . . . . . . . . . . 190
D.3.7 Der temporale Selektionsoperator . . . . . . . . . . . . . . . . . . . 192
D.3.8 Der temporale Projektionsoperator . . . . . . . . . . . . . . . . . . 193
D.3.9 Der Time–link–Operator . . . . . . . . . . . . . . . . . . . . . . . . 196
D.3.10 Anmerkungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Literaturverzeichnis
197
Abbildungsverzeichnis
201
Index
202
7
INHALTSVERZEICHNIS
8
Kapitel 1
Einleitung
1.1
Gegenstand der Arbeit
Zeit ist ein wesentlicher Faktor, was das Festhalten von Informationen über sich stetig
entwickelnde Sachverhalte betrifft. Fakten oder Daten müssen im Kontext Zeit“ inter”
pretiert werden. Beziehungen zwischen Objekten oder Ereignissen sind ebenfalls zeitlichen
Rahmenbedingungen unterworfen. Zeit ist ein allumfassender Wert, der aber in konventionellen Datenbankmanagementsystemen (DBMS) kaum Beachtung findet. Diese Systeme
erlauben zwar vom Anwender eingegebene Zeitdaten bestehend aus Datum und Uhrzeit
abzuspeichern, aber eine automatische Speicherung des temporalen Kontexts von Daten
existiert nicht. Damit Daten aber ein korrektes Bild der realen Welt wiedergeben, ist die
Abspeicherung zeitlicher Informationen unablässig.
In konventionellen Datenbanken wird nur der momentane Zustand von Daten festgehalten. Werden Einträge verändert, ersetzt der neue Wert den alten. In einer temporalen
Datenbank dagegen führt eine Datenveränderung im allgemeinen zu einer Einfügung neuer Daten, so daß alte Werte nicht gelöscht werden. Dieses ermöglicht die Formulierung von
Anfragen an den aktuellen Datenbankzustand, aber auch an vergangene und zukünftige
Zustände. In temporalen Datenbanken werden somit verschiedene Zustände festgehalten.
Weitere Anforderungen an eine temporale Datenbank sind die Möglichkeit, den Zustand
zu einem bestimmten Zeitpunkt zu bestimmen, und die Möglichkeit, zwischen verschiedenen Zeitpunkten in Anfragen zu unterscheiden.
Es gibt zwei Arten von zeitlichen Veränderungen, die in einem DBMS von Interesse sind.
Zum einem ist dieses der Zeitpunkt einer Transaktion, oder auf eine Menge von Intervallen
bezogen, der Existenzzeitraum von Daten. Dieser Existenzzeitraum heißt Transaction–
Time. Mit Hilfe dieser Zeitform kann im nachhinein festgestellt werden, wann welche
Daten wie verändert worden sind und seit wann sie in der Datenbank existieren. Beispiele
für DBMS, die die Transaction–Time zur Verfügung stellen, sind Postgres und sein kommerzieller Nachfolger Illustra. Bei diesen DBMS wird diese Vorhaltung der Transaction–
Time mit Time Travel“ bezeichnet. Die zweite Zeitart beschreibt den Zeitraum, in dem
”
Daten gültig sind. Diese Gültigkeitszeit von Daten heißt Valid–Time. Diese zusätzlichen
temporalen Informationen ermöglichen die Formulierung von Anfragen, die historische,
gegenwärtige oder zukünftige Zustände betreffen. Eine weiterführende Behandlung der
Valid– und der Transaction–Time findet sich in [Ku94].
9
Kapitel 1. Einleitung
Graphische Benutzeroberflächen für Computerprogramme ermöglichen die Nutzung dieser Programme einer großen Gruppe von Anwendern. Die Anforderungen an den Benutzer
sind i.a. minimal. Sie beschränken sich auf den Umgang mit der Maus, mit der bestimmte
Aktionen auslösbar sind, sowie der Reaktion auf diese Aktionen, was häufig der Eingabe
von Daten über eine Tastatur entspricht. Mit Hilfe einer graphischen Oberfläche kann ein
Anwender durch ein Programm geführt werden, wobei durch eine abstrahierende Darstellung von komplexen Befehlsstrukturen Fehler des Anwenders weitestgehend unterbunden
werden. Durch einen einzigen Mausklick sind in graphisch gesteuerten Programmen Befehle aktivierbar, für deren Ausführung der Anwender sonst eine lange Liste von Kommandos
eingeben muß. Auf Grund graphischer Oberflächen ist der Anwender nicht mehr gezwungen, ständig neue Befehle zu erlernen und sich bewußt an strenge syntaktische Regeln zu
halten.
Einen Ansatz zur Verbindung graphischer Benutzeroberflächen mit Datenbanken bietet das Entity–Relationship–Modell (ER–Modell). Dieses Modell wurde 1976 von Peter
Chen [Che76] zur visuellen Darstellung eines Datenbankaufbaus eingeführt. Es zeigt leicht
verständlich, welche Arten von Daten in der Datenbank gespeichert werden sollen und
wie die Daten zueinander in Beziehung stehen. Es hat sich seit seiner Einführung zu
einem unverzichtbaren Werkzeug insbesondere beim konzeptionellen Datenbankentwurf
entwickelt, da das ER–Modell die Darstellung von Datenbankschemata mit einfachen
Mitteln ermöglicht. Dabei bleibt das Datenmodell unabhängig vom logischen Modell des
DBMS sowie frei von physischen Betrachtungen und Zwängen, die erst in einem späteren
Entwurfsschritt, dem physischen Datenbank–Entwurf, Einfluß in den Datenbankentwurf
finden. Das ER–Modell wurde im Laufe der Jahre von verschiedenen Autoren zu einem
erweiterten ER–Modell (EER–Modell) entwickelt. Das EER–Modell ermöglicht durch die
Kombination verschiedener EER–Modellelemente die graphische Darstellung auch von
komplexen Datenstrukturen. Außerdem sind zusätzlich Informationen über die Beziehungen der Elemente untereinander darstellbar. Auf diesem EER–Modell setzt das temporale EER–Modell (TEER–Modell) von Ramez Elmasri et. al. [EWK93] auf, das auch die
Abbildung der Zeit berücksichtigt. Dabei besteht kein graphischer Unterschied zwischen
dem EER– und dem TEER–Schema sondern ein interpretatorischer. Alle Objekte und
Beziehungen, die in einem TEER–Schema dargestellt sind, stehen in einem temporalen
Kontext. Zu Daten eines jeden Objekts und einer jeden Beziehung wird zusätzlich der
Zeitraum festgehalten, in dem diese Daten Gültigkeit haben. Das TEER–Schema von
[EWK93] bezieht nur die Valid–Time ein.
Nicht temporal abhängige Daten sind zeitinvariant. Dieses bedeutet, daß die Daten über
die gesamte Lebensdauer einer Datenbank gültig sind und nicht verändert werden können.
Zu dem Konzept temporal und nicht temporal abhängiger Objekte in einer gemeinsamen
temporalen Datenbank gibt es in der Literatur eine Reihe von Vorschlägen ([EEK90],
[EK92]). Es ist aber in dem hier vorgestellten TEER–Modell, auf dem eine Anfragesprache definiert wird, nicht vorgesehen. Auf eine Erweiterung wird verzichtet, da sonst eine
graphische Unterscheidung temporal abhängiger und unabhängiger Objekte eingeführt
werden müßte, was das Datenmodell unnötigt kompliziert. Zur Darstellung zeitinvarianter
Objekte ist es einfacher, die Lebensdauer des Objekts auf die Lebensdauer der Datenbank
zu setzen.
Im Rahmen dieser Arbeit wird eine graphische temporale Datenbank–Anfragesprache entwickelt, die auf einem Vorschlag von Vram Kouramajian und Michael Gertz [KG95] ba10
1.2. Aufbau der Arbeit
siert. Die graphische Grundlage dieser Sprache bildet das TEER–Modell. Die Sprache,
genannt TEER–Anfragesprache, stellt Operatoren zur Auswahl von Daten sowohl auf
Grund temporaler als auch nichttemporaler Bedingungen zur Verfügung. Diese Operatoren ermöglichen Anfragen wie
Wann war Herr Müller Leiter der Abteilung Montage ?“
”
Welche Angestellten haben in der Abteilung von Herrn Müller gearbeitet als dieser Ab”
teilungsleiter war ? “
Auf diesen Operatoren basierend wurde ein Editor in Tcl/Tk implementiert, der die Darstellung eines TEER–Schemas sowie die Formulierung von Anfragen graphisch realisiert.
Von einem TEER–Schema ausgehend kann der Anwender die gewünschte Anfrage graphisch zusammensetzen. Dabei wird er insofern geführt, als daß der Editor in jedem
Schritt nur syntaktisch folgerichtige Operatoren zur Verfügung stellt. Für die graphische
TEER–Anfragesprache wird eine lineare Syntax angegeben. Auf dieser basierend wird
anschließend die Semantik der Sprache definiert wird. Dazu ist es nötig, daß die linearen
Syntaxkonstrukte in den TEER–Kalkül transformiert werden. Dieser Kalkül wird zuvor
aus dem EER–Kalkül hergeleitet.
Um die Funktionalität der Sprache zu zeigen, wird ein spezielles TEER–Schema nach
ORACLE, einem konventionellen, relationalen DBMS, transformiert und dazu eine Testdatenbank angelegt. An Hand von Beispielanfragen wird eine Übersetzungsmethode für
die graphischen Anfragen in SQL–Anfragen vorgeführt. Diese SQL–Anfragen wurden an
die Testdatenbank gestellt.
Eine allgemeine SQL–Implementierung sowie die Betrachtung der Ausdrucksfähigkeit der
TEER–Anfragesprache haben sich als zu aufwendig im Rahmen dieser Diplomarbeit erwiesen.
1.2
Aufbau der Arbeit
Der vorliegende Text gliedert sich wie folgt:
In Kapitel 2 sind sämtliche theoretischen Grundlagen aufgeführt, die zur Definition
des TEER–Modells, der neu entwickelten Anfragesprache sowie des temporalen Kalküls
benötigt werden. Hauptbestandteile sind dabei die formale und graphische Definition des
EER–Modells durch Angabe einer Syntax und einer Semantik, die graphische Darstellung
und die formale Definition des zugehörigen EER–Kalküls.
In Kapitel 3 wird das temporale graphische Datenmodell eingeführt. Dazu wird zunächst
das TEER–Modell vorgestellt und anschließend mit Hilfe einer Syntax und einer Semantik
formal definiert. Im letzten Abschnitt wird die Transformation des TEER–Modells in das
Relationenmodell diskutiert und eine in späteren Kapiteln herangezogene Testdatenbank
angelegt.
Die auf dem TEER–Modell basierende TEER–Anfragesprache wird in Kapitel 4 vorgestellt. Es wird eine lineare Syntax eingeführt und eine sich daran orientierende Semantik
mit Hilfe des in diesem Zusammenhang definierten TEER–Kalküls angegeben. In Abschnitt 4.1.3 werden zum besseren Verständnis für bestimmte Anfragetypen Beispiele
gegeben. Auf diese Beispiele wird in späteren Teilen der Arbeit wieder zurückgegriffen.
11
Kapitel 1. Einleitung
In Kapitel 5 ist eine exemplarische Implementierung der TEER–Anfragesprache beschrieben. Dazu werden die Beispielanfragen aus Kapitel 4.1.3 in SQL–Anfragen übersetzt und
an die Testdatenbank gestellt.
Im letzten Kapitel des Hauptteils werden die Ergebnisse dieser Arbeit zusammengefaßt
sowie ein Ausblick auf mögliche Spracherweiterungen gegeben.
Im Anhang dieser Arbeit finden sich die SQL–Anweisungen zur Erzeugung der Testdatenbank (Anhang A), die alphabetisch sortierte lineare Syntax der TEER–Anfragesprache
(Anhang B) sowie die alphabetisch angeordneten Regeln für die Transformation dieser
Syntax in den TEER–Kalkül (Anhang C). Den Abschluß bildet Anhang D, ein Benutzerhandbuch für den Anfrageeditor.
12
Kapitel 2
Grundlagen
2.1
Das EER–Schema
Ein EER–Schema ist eine in einer Datenbeschreibungssprache abgefaßte Definition der
in einer Datenbank zugelassenen Datenstrukturen. Die zu einem EER–Schema gehörige
Sprache ist das EER–Modell. Es stellt Konzepte zur Darstellung dieser Datenstrukturen
zur Verfügung. Die graphische Darstellung eines EER–Modells ist das EER–Diagramm.
Das EER–Modell und das EER–Diagramm werden in den beiden folgenden Abschnitten
eingeführt.
2.1.1
EER–Modell
Das Entity–Relationship–Modell (ER–Modell) ist ein Werkzeug, das 1976 von Peter Chen
zur graphischen Darstellung von Datenbankschemata eingeführt wurde [Che76]. Ein Datenbankschema ist die formale Beschreibung aller in einer Datenbank enthaltenen Daten
und ihrer Beziehungen zueinander. Es stellt somit einen Ausschnitt der realen Welt, eine
sogenannte Mini–Welt, dar.
Die Modellierungskonzepte des ER–Modells sind Objekte, Beziehungen zwischen Objekten und Attribute. Attribute geben Eigenschaften von Objekten oder auch von Beziehungen an. In Anlehnung an den englischen Sprachgebrauch werden im folgenden Objekte als
Entities und Beziehungen als Relationships bezeichnet. Einzelne Entities, welche ähn”
lich“, vergleichbar“ oder zusammengehörig“ sind, werden zu einem Entitytyp zusam”
”
mengefaßt. Die Beziehungen zwischen verschiedenen Entitytypen werden durch Relationshiptypen beschrieben.
Das erweiterte Entity–Relationship–Modell (EER–Modell) stellt neben neuen Konzepten
auch neue Datentypen und Informationen über die Art der dargestellten Beziehungen zur
Verfügung. Das hier Verwendung findende EER–Modell bietet folgende neuen Konzepte
an: Die Konzepte Aggregation und Assoziation ermöglichen die Bildung komplex strukturierter Entitytypen, wogegen das Konzept der Generalisierung bzw. Spezialisierung das
Ausdrücken von Teilmengenbeziehungen zwischen Entitytypen ermöglicht.
13
Kapitel 2. Grundlagen
Entities und Entitytypen
Nach Chen ist ein Entity eindeutig identifizierbar. Es entspricht einem Gegenstand, einer Person oder einem Begriff der Mini–Welt, über die veränderliche Informationen zu
speichern sind. Um Entities in der Datenbank speichern zu können, werden sie in einem
ER–Modell zu Klassen gleicher Entities zusammengefaßt, den Entitytypen.
Ein Entitytyp ist eine Menge von Entities desselben Typs, d.h. die Entities besitzen
dieselben Attributtypen. Jeder Entitytyp Ei besitzt eine Menge von Attributtypen
Ai1 ,. . . ,Ain , und zu jedem Attributtyp Aij gehört ein Wertebereich domain(Aij ). Jedem
Entity ei eines Entitytyps Ei werden somit Attribute aij aus dem Bereich domain(Aij )
zugeordnet.
Dieser Wertebereich domain(Aij ) eines Attributtyps kann durch einen der fest vorgegebenen Standarddatentypen wie integer (ganze Zahlen Z) oder number (reelle Zahlen
R) festgelegt sein. Es besteht aber auch die Möglichkeit, anwendungsbezogene Nicht–
Standarddatentypen wie circle (Kreiskoordinaten) oder point (Punktkoordinaten) zu definieren. Der Wertebereich eines Attributtyps kann auch ein zusammengesetzter Datentyp
sein. Er ist dann mengen–, multimengen– oder listenwertig, d.h. er liefert eine Menge (set),
Multimenge (bag) oder Liste (list) von Werten.
Im EER–Modell kann der Wertebereich eines Attributtyps um einen Nullwert erweitert
werden. Dieses bedeutet, daß ein Attribut unbekannt sein darf. Solche Attributtypen heißen optional, die anderen obligatorisch. Der optionale Attributtyp Aij , der jedem Entity ei eines Entitytyps Ei einen Wert aus dem Bereich domain(Aij ) zuordnet, beschreibt
eine partielle Funktion.
Zur Identifikation eines speziellen Entities ist es in der Regel nicht erforderlich, alle Attribute anzugeben. Ein Entity kann bereits durch ein Attribut oder durch eine Kombination mehrerer eindeutig festgelegt werden. Eine Menge von Attributtypen, die ausreicht, ein Entity eindeutig zu identifizieren, heißt Schlüsselkandidat des Entitytyps.
Ein Schlüssel ist ein minimaler Schlüsselkandidat, in dem Sinne, daß es keine weitere
Untermenge von Attributtypen dieses Schlüsselkandidaten gibt, die ausreicht, die Entities des Entitytyps eindeutig zu identifizieren. Die an einem Schlüssel partizipierenden
Attributtypen heißen Schlüsselattribute(typen).
Aggregationen
Eine Aggregation ist ein Konstruktor zur Bildung neuer Entitytypen durch Zusammenfassen von mehreren Objekten verschiedener Typen. Beispielsweise können n Entitytypen
E1 , . . . , En zu einem Entitytyp Eagg durch kartesische Produktbildung zusammengefaßt
werden, d.h. das Entity einer Aggregation ist ein Tupel von Entities der verwendeten
Entitytypen:
eagg = (e1 , . . . , en ),
eagg ∈ Eagg ,
ei ∈ Ei , i = 1, . . . , n
Im EER–Modell wird diese Typ–Neubildung durch objektwertige Attributtypen erzielt. Diese Attributtypen besitzen als Wertebereich einen Entitytyp anstelle eines Datentyps. Ein objektwertiger Attributtyp heißt Komponente. Da nur Entitytypen Komponenten besitzen dürfen, können mit Hilfe der Komponenten komplexe Entitytypen erzeugt
14
2.1. Das EER–Schema
werden. Dies ist möglich, weil Entities einer Komponente wiederum Entities als Bestandteile besitzen können.
Assoziationen
Die Assoziation, auch Gruppierung genannt, entspricht einer Potenzmengenbildung, d.h.
ein Objekt entsteht durch das Zusammenfassen mehrerer Objekte gleichen Typs. Ein
Entity einer Assoziation Eass über einem Entitytyp E besteht also aus einer Menge von
Entities des Typs E:
eass = {e1 , . . . , en },
eass ∈ Eass ,
ei ∈ E, i = 1, . . . , n
Eine Assoziation wird im EER–Modell durch einen komplex–objektwertigen Attributtyp
erzeugt. Ein komplex–objektwertiger Attributtyp ist eine mehrwertige, d.h. listen–,
mengen– oder multimengenwertige, Komponente.
Generalisierungen und Spezialisierungen
Eine Generalisierung bzw. Spezialisierung ist eine Klassifikation von Entitytypen in neue
Typen. Eine Spezialisierung erlaubt, einen neuen Entitytyp Espez als Teilmenge eines anderen Entitytyps E zu definieren, dagegen faßt eine Generalisierung mehrere Entitytypen
E1 , . . . , En zu einem neuen Entitytyp Egen zusammen.
Spezialisierungen und Generalisierungen werden im EER–Modell durch das Konzept der
Typkonstruktion ausgedrückt. Eine Typkonstruktion T = T (E1 , . . . , En ; A1 , . . . , Am )
besitzt eine Menge von eingehenden Entitytypen E1 , . . . , En , n ≥ 1, und eine Menge daraus konstruierter Entitytypen A1 , . . . , Am , m ≥ 1, entsprechend Eingangs– und
Ausgangstypen genannt. Mit diesem Konzept können beliebige Teilmengenbeziehungen
zwischen Entitytypen explizit ausgedrückt werden. So sind neben Generalisierung und
Spezialisierung auch Partition und Kategorisierung formulierbar.
Relationships und Relationshiptypen
Die Beziehungen zwischen den Objekten in einer Mini–Welt werden durch Relationshiptypen ausgedrückt. Ein Relationshiptyp R mit der Stelligkeit m verbindet m Entitytypen
E1 , . . . , Em .
Relationshiptypen können eigene Attributtypen besitzen. Diese bringen spezielle Eigenschaften zum Ausdruck, die erst durch das Herstellen der Beziehung relevant werden. Für
die beteiligten Entitytypen sind diese Eigenschaften bedeutungslos. Damit ist jedes Relationship r eines m–stelligen Relationshiptyps R mit s Attributen ein m + s–Tupel
r =< e1 , . . . , em , a1 , . . . , as > mit ei ∈ Ei und aj ∈ Aj , i = 1, . . . , m, j = 1, . . . , s.
Jeder an einem Relationshiptyp teilnehmende Entitytyp E1 , . . . , Em erhält einen innerhalb des Relationshiptyps eindeutigen Rollennamen n1 , . . . , nm zugeordnet. Dieser Rollenname gibt an, welche Rolle der Entitytyp in der Beziehung einnimmt. Partizipiert ein
Entitytyp mehrfach an demselben Relationshiptyp, so dienen die Rollennamen der Unterscheidung der unterschiedlichen Rollen. Bei einer einfachen Teilnahme eines Entitytyps
15
Kapitel 2. Grundlagen
an einem Relationshiptyp ist die Vergabe eines Rollennamens optional. Der Name des
Entitytyps kann als Rollenname automatisch angenommen werden.
Zu jeder Beziehung zwischen einem Entitytyp Ei und einem Relationshiptyp R (mit
Rollennnamen ni ) kann eine Kardinalität der Form (min,max) mit min ∈ N0 und
max ∈ N ∪ {∗} angegeben werden. Diese Angabe verlangt, daß ein Entity ei vom Typ Ei
mindestens min–mal und höchstens max–mal an den Beziehungen des Typs R teilnehmen
darf; ∗“ bedeutet dabei unendlich. Die Standardangabe ist (0, ∗), d.h. jedes Entity ei
”
kann beliebig oft, insbesondere auch gar nicht, an R partizipieren. Der Spezialfall (1, ∗)
erzwingt, daß jedes Entity ei an der Beziehung R teilnehmen muß.
2.1.2
EER–Diagramm
Das EER–Diagramm dient der graphischen Veranschaulichung der in einem EER–Modell
enthaltenen Informationen.
Ein Entitytyp E wird durch ein Rechteck dargestellt.
E
Ein Relationshiptyp R wird durch eine Raute repräsentiert. Diese Raute wird durch
ungerichtete Kanten mit den beteiligten Entitytypen E1 , . . . , Em verbunden. Die Kanten
sind mit den zu jeder Beziehung gehörigen Rollennamen n1 , . . . , nm und den Kardinalitäten beschriftet, wobei diese Angaben optional sind.
E1
n1 (min1 , max1 )
R
(minm , maxm ) nm
Em
.....
Ein Attribut Aij zu einem Entitytyp E bzw. einem Relationshiptyp R mit einem Wertebereich vom Datentyp d wird durch eine Ellipse repräsentiert. Diese Ellipsen werden
durch ungerichtete Kanten mit dem zugehörigen Rechteck des Entitytyps bzw. der zugehörigen Raute des Relationshiptyps verbunden. Die Angabe des Datentyps ist optional,
da er sich oft aus dem Kontext erschließen läßt.
16
2.1. Das EER–Schema
Aij : [set/bag/list] d
E
Aij : [set/bag/list] d
R
Jeder Bestandteil eines Schlüssels zu einem Entitytyp E wird durch einen dicken Punkt
am Rechteck von E gekennzeichnet.
Aij : [set/bag/list] d
E
Die Kante eines optionalen Attributtyps enthält einen Kreis.
Aij : [set/bag/list] d
E
Eine Komponente C zum Entitytyp E1 mit dem Wertebereich E2 oder set/bag/list(E2 )
über einem Entitytyp E2 wird durch eine Ellipse dargestellt, das mit dem Rechteck des
Entitytyps E1 mit einer ungerichteten Kante verbunden ist. Anstelle von E2 steht ein
Quadrat, von dem aus ein Pfeil auf den Entitytyp E2 zeigt.
E2
C : [set/bag/list]
E1
Jede Typkonstruktion T mit den Eingangstypen E1 , . . . , En und den Ausgangstypen
A1 , . . . , Am wird als Dreieck dargestellt. Die Eingangstypen Ei sind durch Kanten mit der
Grundseite des Dreiecks verbunden, die Ausgangstypen Aj mit dem gegenüberliegenden
Eckpunkt.
17
Kapitel 2. Grundlagen
A1
E1
....
....
T
En
2.2
Am
Ein Beispiel–Datenbank–Schema
Zur Veranschaulichung der einzelnen Konzepte des EER–Modells wird das EER–Schema
eines Konzerns verwendet.
Die Abbildung 2.1 zeigt die Modellierung Konzern” als EER–Diagramm, in dem der
”
Konzern (KONZERN), verschiedene Arten von Firmen (FIRMA, ZULIEFERFIRMA,
KUNDE), Produkte (PRODUKT, VORPRODUKT), Aufträge (AUFTRAG), Abteilungen (ABTEILUNG) und Angestellte (ANGESTELLTER) sowie zugehörige Adressen
(ADRESSE) jeweils als Entitytyp modelliert sind. Zwischen den Entities dieser Typen
bestehen die folgenden Relationships:
• Ein Kunde vergibt Aufträge.
• Jede Abteilung gehört zu genau einer Firma.
• Eine Abteilung produziert mehrere Produkte.
• Ein Auftrag besteht aus mehreren Produkten.
• Zulieferfirmen liefern Vorprodukte.
In dem EER–Diagramm sind neben den üblichen Attributtypen, die Eigenschaften wie den
Namen (AngName) einer Person oder die Chargennummer (ChargenNr) eines Produkts
beschreiben, eine Reihe von objektwertigen und komplex–objektwertigen Attributtypen
vertreten. Diese sind in Form einer Komponente realisiert. So besitzt zum Beispiel jede
Abteilung einen Abteilungsleiter (AbtLeiter) und mehrere Mitarbeiter, die jeweils Angestellte sind.
Das Konzept der Typkonstruktion erlaubt Spezialisierungen und Generalisierungen von
Entitytypen. So sind Zulieferfirmen und Kunden zu Firmen generalisiert, und jedes Vorprodukt ist ein Produkt.
Jeder Entitytyp, der nicht Ausgangstyp einer Typkonstruktion ist, besitzt einen eindeutigen Schlüssel. Einige Rollennamen sind explizit vergeben worden. Sie sind bei der späteren
theoretischen Beschreibung dieses EER–Schemas hilfreich.
18
2.2. Ein Beispiel–Datenbank–Schema
Name
Tochterfirmen: set
KONZERN
Adresse:
Strasse
FIRMA
Firmenname
.
HausNr
ADRESSE
Anschrift:
.
Plz
Ort
⊇
⊇
TelNr
Fax
ZULIEFERFIRMA
KUNDE
(1,*)
(1,*)
vergibt
(1,*) k auftr
liefert
Auftrag:
AUFTRAG
.
Datum
AuftrNr
(1,*)
AngAnschrift:
AngName
PersNr
a inhalt
VORPRODUKT
Gehalt
⊇
(1,1)
.
PRODUKT
ChargenNr
Preis
Menge
p auftr
p abt
(1,1)
ProdName
besteht
aus
produziert
(1,*)
AbtLeiter:
abt p
ABTEILUNG
(1,*)
.
Mitarbeiter: set
AbtName
StPreis
gehört
zu
ANGESTELLTER
Position
Auslastung
(1,*)
.
(1,1)
abt f
Abbildung 2.1: Konzern–Schema
19
Kapitel 2. Grundlagen
2.3
Die Datentyp–Signatur
In diesem Abschnitt werden die Begriffe der Syntax und der Semantik einer Datentyp–
Signatur eingeführt. Darauf aufbauend werden die Standarddatentypen des EER–Modells
definiert.
Als erstes werden die verwendeten Notationen eingeführt:
|SET| : Klasse aller Mengen
|REL| : Klasse aller Relationen
|FUN| : Klasse aller Funktionen
|FISET| : Klasse aller endlichen Mengen
Es sei S eine beliebige Menge aus |SET|. Dann ist
P(S) : Menge aller Teilmengen von S (Potenzmenge von S)
F (S) : Menge aller endlichen Teilmengen von S
B(S) : Menge aller endlichen Multimengen über S
S ∗ : Menge aller endlichen Listen über S
S + : Menge aller endlichen, nichtleeren Listen über S
2.3.1
Formale Definition
Definition 2.1
Die Syntax einer Datentyp–Signatur DT = (SORTDT , OPNSDT , PREDDT ) besteht
aus
1. den endlichen Mengen SORTDT , OPNSDT , PREDDT ∈ |FISET|,
2. den Hilfsfunktionen source, destination, arguments ∈ |FUN|, so daß
source : OPNSDT → SORT∗DT ,
destination : OPNSDT → SORTDT ,
arguments : PREDDT → SORT+
DT .
Ist ω ∈ OPNS mit source(ω) =< d1 , . . . , dn > und destination(ω) = d, so wird
ω : d1 , . . . , dn → d als Operationssignatur (oder kurz Operation) von ω bezeichnet.
Ist π ∈ PRED mit arguments(π) =< d1 , . . . , dn >, so wird π : d1 , . . . , dn als Prädikatsignatur (oder kurz Prädikat) von π bezeichnet.
Definition 2.2
Eine Interpretation I einer Datentyp–Signatur DT ist ein Tripel I
(ISORT , IOPNS , IPRED ) mit
=
1. einer Funktion ISORT : SORT → |SET|, so daß ⊥d ∈ ISORT (d) für jedes d ∈ SORT.
⊥d bezeichne einen Nullwert für jedes d ∈ SORT.
20
2.3. Die Datentyp–Signatur
2. einer Funktion IOPNS : OPNS → |FUN|, so daß jedes ω : d1 , . . . , dn → d ∈ OPNS
eine Funktion
IOPNS(w) : ISORT (d1 ) × . . . × ISORT (dn ) → ISORT (d)
impliziert.
|DT| bezeichne die Klasse aller Interpretationen der Datentyp–Signatur DT.
Die Semantik µ[DT] einer Datentyp–Signatur DT ist eine feste Interpretation aus der
Klasse DT.
2.3.2
EER–Standarddatentyp–Signatur
Die Standarddatentypen des EER–Modells sind die aus Programmiersprachen bekannten Datentypen boolean, integer, number und string. Mit Hilfe einer Datentyp–Signatur
können sie, zusammen mit üblichen Operationen und Prädikaten, eindeutig definiert werden. Die Listenbildung (list), Mengenbildung (set), sowie Multimengenbildung (bag) werden zur Definition verschiedener Operationen benötigt.
Jede Interpretation eines Datentyps s enthält einen sogenannten Nullwert ⊥s im Sinne
von undefiniert“. Der Grund für die Einführung dieser speziellen Werte ⊥ sind die optio”
nalen Attributtypen. Ist A ein derartiger Attributtyp zu einem Entitytyp E oder einem
Relationshiptyp R mit einem Wertebereich domain(A) := s ∈ SORT, so kann das Attribut a den Wert ⊥s liefern, wenn der Attributwert zu einem konkreten Entity e oder
einem Relationship r nicht bekannt ist.
SORTDT = {boolean, integer, number, string}
Es seien u ∈ SORTDT und v ∈ {integer, number} ⊆ SORTDT beliebig.
Gegeben seien die wie folgt definierten Hilfsoperationen max und min.
Es seien x, y ∈ v, dann gilt:
x, falls x ≥v y
max(x, y) :=
y, sonst
min(x, y) :=
x, falls x ≤v y
y, sonst
21
Kapitel 2. Grundlagen
OPNSDT = { and, or : boolean, boolean → boolean,
not : boolean → boolean,
+i , −i , ∗i : integer, integer → integer,
/i : integer, integer → number,
numberi : integer → number,
+n , −n , ∗n , /n : number, number → number,
avgset(v) : set(v) → number,
countset(u) : set(u) → integer,
maxset(v) : set(v) → v,
minset(v) : set(v) → v,
sumset(v) : set(v) → v,
avgbag(v) : bag(v) → number,
btsbag(u) : bag(u) → set(u),
countbag(u) : bag(u) → integer,
maxbag(v) : bag(v) → v,
minbag(v) : bag(v) → v,
occbag(u) : bag(u), u → integer,
sumbag(v) : bag(v) → v,
avglist(v) : list(v) → number,
countlist(u) : list(u) → integer,
indlist(u) : list(u) → set(integer),
ltblist(u) : list(u) → bag(u),
ltslist(u) : list(u) → set(u),
maxlist(v) : list(v) → v,
minlist(v) : list(v) → v,
occlist(u) : list(u), u → integer,
poslist(u) : list(u), u → set(integer),
sellist(u) : list(u), integer → u,
sumlist(v) : list(v) → v }
PREDDT = {
<i , >i , ≤i , ≥i , =i , =i : integer, integer,
<n , >n , ≤n , ≥n , =n , =n : number, number
∈set(u) : u, set(u)
∈bag(u) : u, bag(u)
∈list(u) : u, list(u) }
Weitere Operationen und Prädikate können in gleicher Weise hinzugefügt werden, wie
zum Beispiel Vergleichsprädikate für Zeichenketten.
ISORT (boolean) := {true, f alse, ⊥b }
ISORT (integer) := Z ∪ {⊥i }
ISORT (number) := R ∪ {⊥n }
22
2.3. Die Datentyp–Signatur
ISORT (string) := Menge aller endlichen Zeichenketten und einem Element ⊥s
IOPNS (and) : logische UND–Verknüpfung boolescher Ausdrücke
Diese logische Verknüpfung wird gemäß der folgenden dreiwertigen Logik ausgewertet:
and true false ⊥b
true true false ⊥b
false false false false
⊥b false ⊥b
⊥b
IOPNS (or) : logische OR–Verknüpfung boolescher Ausdrücke
Diese logische Verknüpfung wird gemäß der folgenden dreiwertigen Logik ausgewertet:
or
true
false
⊥b
false ⊥b
true true
false ⊥b
⊥b
⊥b
true
true
true
true
IOPNS (not) : Negation eines booleschen Ausdrucks
Diese logische Verknüpfung wird gemäß der folgenden dreiwertigen Logik ausgewertet:
not
true false
false true
⊥b
⊥b
IOPNS (+i) : Summe ganzer Zahlen
IOPNS (−i ) : Differenz ganzer Zahlen
IOPNS (∗i) : Produkt ganzer Zahlen
IOPNS (/i) : Quotient ganzer Zahlen
IOPNS (numberi ) : Konvertierung eines integer–Werts in einen number–Wert
Die Anwendung auf einen number–Wert verändert diesen nicht.
IOPNS (+n ) : Summe reeller Zahlen
IOPNS (−n ) : Differenz reeller Zahlen
IOPNS (∗n ) : Produkt reeller Zahlen
IOPNS (/n ) : Quotient reeller Zahlen
Mengenoperationen
IOPNS (avgset(v) ) : Berechnung des Durchschnitts von Mengenelementen
Es sei {k1 , . . . , kn } ∈ set(v), dann ist

falls n = 0
 ⊥v ,
numberi (sumset(v) ({k1 , . . . , kn })) /n
avgset(v) ({k1 , . . . , kn }) :=
, sonst

numberi (countset(v) ({k1 , . . . , kn }))
23
Kapitel 2. Grundlagen
IOPNS (countset(u) ) : Bestimmung der Anzahl von Mengenelementen
Es sei {k1 , . . . , kn } ∈ set(u), dann ist
countset(u) ({k1 , . . . , kn }) := n.
IOPNS (maxset(v) ) : Bestimmung des Maximums von Mengenelementen
Es sei {k1 , . . . , kn } ∈ set(v), dann ist
falls n = 0
⊥v ,
maxset(v) ({k1 , . . . , kn }) :=
max(k1 , maxset(v) ({k2 , . . . , kn })), sonst
IOPNS (minset(v) ) : Bestimmung des Minimums von Mengenelementen
Es sei {k1 , . . . , kn } ∈ set(v), dann ist
falls n = 0
⊥v ,
minset(v) ({k1 , . . . , kn }) :=
min(k1 , minset(v) ({k2 , . . . , kn })), sonst
IOPNS (sumset(v) ) : Summenbildung von Mengenelementen
Es sei {k1 , . . . , kn } ∈ set(v), dann ist
⊥v ,
falls n = 0
sumset(v) ({k1 , . . . , kn }) :=
k1 +v . . . +v kn , sonst
Multimengenoperationen
IOPNS (avgbag(v) ) : Berechnung des Durchschnitts von Multimengenelementen
Es sei {{k1 , . . . , kn }} ∈ bag(v), dann ist

falls n = 0
 ⊥v ,
(sum
({
{k
,
.
.
.
,
k
}
}))
/
number
i
1
n
n
avgbag(v) ({{k1 , . . . , kn }}) :=
bag(v)
, sonst

numberi (countbag(v) ({{k1 , . . . , kn }}))
IOPNS (btsbag(u) ) : Konvertierung einer Multimenge in eine Menge (bag–to–set)
Es sei {{k1 , . . . , kn }} ∈ bag(u), dann ist
{ },
falls n = 0
btsbag(u) ({{k1 , . . . , kn }}) :=
{k1 } ∪ btsbag(u) ({{k2 , . . . , kn }}), sonst
IOPNS (countbag(u) ) : Bestimmung der Anzahl von Multimengenelementen
Es sei {{k1 , . . . , kn }} ∈ bag(u), dann ist
countbag(u) ({{k1 , . . . , kn }}) := n.
IOPNS (maxbag(v) ) : Bestimmung des Maximums von Multimengenelementen
Es sei {{k1 , . . . , kn }} ∈ bag(v), dann ist
falls n = 0
⊥v ,
maxbag(v) ({{k1 , . . . , kn }}) :=
max(k1 , maxbag(v) ({{k2 , . . . , kn }})), sonst
24
2.3. Die Datentyp–Signatur
IOPNS (minbag(v) ) : Bestimmung des Minimums von Multimengenelementen
Es sei {{k1 , . . . , kn }} ∈ bag(v), dann ist
falls n = 0
⊥v ,
minbag(v) ({{k1 , . . . , kn }}) :=
min(k1 , minbag(v) ({{k2 , . . . , kn }})), sonst
IOPNS (occbag(u) ) :
Berechnung der Häufigkeit eines Elements in
(occurrence)
Es sei {{k1 , . . . , kn }} ∈ bag(u), k ∈ u, dann ist

 0,
occbag(u) ({{k2 , . . . , kn }}, k),
occbag(u) ({{k1 , . . . , kn }}, k) :=

occbag(u) ({{k2 , . . . , kn }}, k) + 1,
einer Multimenge
falls n = 0
falls n ≥ 1 und k = k1
sonst
IOPNS (sumbag(v) ) : Summenbildung von Multimengenelementen
Es sei {{k1 , . . . , kn }} ∈ bag(v), dann ist
⊥v ,
falls n = 0
sumbag(v) ({{k1 , . . . , kn }}) :=
k1 +v . . . +v kn , sonst
Listenoperationen
IOPNS (avglist(v) ) : Berechnung des Durchschnitts von Listenelementen
Es sei < k1 , . . . , kn >∈ list(v), dann ist

falls n = 0
 ⊥v ,
numberi (sumlist(v) (< k1 , . . . , kn >)) /n
avglist(v) (< k1 , . . . , kn >) :=
, sonst

numberi (countlist(v) (< k1 , . . . , kn >))
IOPNS (countlist(u) ) : Bestimmung der Anzahl von Listenelementen
Es sei < k1 , . . . , kn >∈ list(u), dann ist
countlist(u) (< k1 , . . . , kn >) := n.
IOPNS (indlist(u) ) : Berechnung der Indizes einer Liste
Es sei < k1 , . . . , kn >∈ list(u), dann ist
indlist(u) (< k1 , . . . , kn >) := {1, . . . , n}
IOPNS (ltblist(u) ) : Konvertierung einer Liste in eine Multimenge (list–to–bag)
Es sei < k1 , . . . , kn >∈ list(u), dann ist
ltblist(u) (< k1 , . . . , kn >) := {{k1 , . . . , kn }}.
IOPNS (ltslist(u) ) : Konvertierung einer Liste in eine Menge (list–to–set)
Es sei < k1 , . . . , kn >∈ list(u), dann ist
{ },
falls n = 0
ltslist(u) (< k1 , . . . , kn >) :=
{k1 } ∪ ltslist(u) (< k2 , . . . , kn >), sonst
25
Kapitel 2. Grundlagen
IOPNS (maxlist(v) ) : Bestimmung des Maximums von Listenelementen
Es sei < k1 , . . . , kn >∈ list(v), dann ist
maxlist(v) (< k1 , . . . , kn >) :=
⊥v ,
falls n = 0
max(k1 , maxlist(v) (< k2 , . . . , kn >)), sonst
IOPNS (minlist(v) ) : Bestimmung des Minimums von Listenelementen
Es sei < k1 , . . . , kn >∈ list(v), dann ist
minlist(v) (< k1 , . . . , kn >) :=
⊥v ,
falls n = 0
min(k1 , minlist(v) (< k2 , . . . , kn >)), sonst
IOPNS (occlist(u) ) : Berechnung der Häufigkeit eines Elements in einer Liste
Es sei < k1 , . . . , kn >∈ list(u), k ∈ u, dann ist

falls n = 0
 0,
falls n ≥ 1 und k = k1
occlist(u) (< k2 , . . . , kn >, k),
occlist(u) (< k1 , . . . , kn >, k) :=

occlist(u) (< k2 , . . . , kn >, k) + 1, sonst
IOPNS (poslist(u) ) : Berechnung des Indizes eines Listenelements (position)
Es sei < k1 , . . . , kn >∈ list(u), k ∈ u, dann ist

falls n = 0
 { },
poslist(u) (< k2 , . . . , kn >, k),
falls n ≥ 1 und k = k1
poslist(u) (< k1 , . . . , kn >, k) :=

poslist(u) (< k2 , . . . , kn >, k) ∪ {1}, sonst
IOPNS (sellist(u) ) : Selektion eines Listenelements (selection)
Es sei < k1 , . . . , kn >∈ list(u), j ∈ integer, dann ist
kj , falls 1 ≤ j ≤ n
sellist(u) (< k1 , . . . , kn >, j) :=
⊥u , sonst
IOPNS (sumlist(v) ) : Summenbildung von Listenelementen
Es sei < k1 , . . . , kn >∈ list(v), dann ist
falls n = 0
⊥v ,
sumlist(v) (< k1 , . . . , kn >) :=
k1 +v . . . +v kn , sonst
IPRED (<i ) :
IPRED (>i ) :
IPRED (≤i ) :
IPRED (≥i ) :
IPRED (=i ) :
IPRED (=i ) :
Kleiner–Relation für ganze Zahlen
Größer–Relation für ganze Zahlen
Kleiner–gleich–Relation für ganze Zahlen
Größer–gleich–Relation für ganze Zahlen
Gleich–Relation für ganze Zahlen
Ungleich–Relation für ganze Zahlen
26
2.4. Die EER–Signatur
IPRED (<n ) :
IPRED (>n ) :
IPRED (≤n ) :
IPRED (≥n ) :
IPRED (=n ) :
IPRED (=n ) :
Kleiner–Relation für reelle Zahlen
Größer–Relation für reelle Zahlen
Kleiner–gleich–Relation für reelle Zahlen
Größer–gleich–Relation für reelle Zahlen
Gleich–Relation für reelle Zahlen
Ungleich–Relation für reelle Zahlen
IPRED (∈set(u) ) : ist–Element–von–Prädikat für Mengen
Es sei {k1 , . . . , kn } ∈ set(u), k ∈ u dann ist
k ∈set(u) {k1 , . . . , kn } ⇔ ∃ kj mit k = kj , 1 ≤ j ≤ n
IPRED (∈bag(u) ) : ist–Element–von–Prädikat für Multimengen
Es sei {{k1 , . . . , kn }} ∈ bag(u), k ∈ u dann ist
k ∈bag(u) {{k1 , . . . , kn }} ⇔ ∃ kj mit k = kj , 1 ≤ j ≤ n
IPRED (∈list(u) ) : ist–Element–von–Prädikat für Listen
Es sei < k1 , . . . , kn >∈ list(u), k ∈ u dann ist
k ∈list(u) < k1 , . . . , kn >⇔ ∃ kj mit k = kj , 1 ≤ j ≤ n
2.4
Die EER–Signatur
In der EER–Signatur werden die Grundkonzepte des EER–Modells formalisiert. Damit
wird eine Möglichkeit zur Beschreibung der Syntax und der Semantik des EER–Modells
eingeführt.
2.4.1
Syntax
Zu der Beschreibung der Syntax des EER–Modells werden die Mengen, die den Grundkonzepten entsprechen, und die darauf definierten Hilfsfunktionen eingeführt.
Die nachstehenden Mengen entsprechen den Grundkonzepten des EER–Modells direkt:
E-TYPE = { Namen aller spezifizierten Entitytypen }
R-TYPE = { Namen aller spezifizierten Relationshiptypen }
ROLE = { Namen aller spezifizierten Rollen }
ATTR = { Namen aller spezifizierten Attributtypen }
COMP = { Namen aller spezifizierten Komponenten }
CONSTRUCTION = { Namen aller spezifizierten Typkonstruktionen }
Hilfsfunktionen spiegeln den Zusammenhang der Konzepte wider:
participants : liefert zu jedem Relationshiptyp die teilnehmenden Entitytypen
relship : ordnet jedem Rollennamen den zugehörigen Relationshiptyp zu
entity : ordnet jedem Rollennamen den teilnehmenden Entitytyp zu
type : legt den Typ (Entity oder Relationship) eines Attributtyps oder einer Komponente
fest
27
Kapitel 2. Grundlagen
domain : legt den Wertebereich eines Attributtyps oder einer Komponente fest
input : bestimmt den Eingangstyp einer Typkonstruktion
output : bestimmt den Ausgangstyp einer Typkonstruktion
Definition 2.3
Es sei eine Datentyp–Signatur DT = (SORTDT , OPNSDT , PREDDT ) gegeben. Die Syntax
einer EER–Signatur EER(DT) über DT besteht aus:
1. den endlichen Mengen E-TYPE, R-TYPE, ROLE, ATTR, COMP,
CONSTRUCTION ∈ |FISET|
2. den Hilfsfunktionen participants, relship, entity, type, domain, input, output ∈
|FUN|, so daß
R-TYPE → E-TYPE+
ROLE → R-TYPE
ROLE → E-TYPE
ATTR → E-TYPE ∪ R-TYPE
COMP → E-TYPE
domain :
ATTR → {d | d ≡ d oder d ≡ set/bag/list(d), d ∈ SORTDT }
COMP → {e | e ≡ e oder e ≡ set/bag/list(e), e ∈ E-TYPE}
input, output : CONSTRUCTION → (F (E-TYPE) − ∅)
participants :
relship :
entity :
type :
Für jeden Relationshiptyp R ∈ R-TYPE mit participants(R) =< E1 , . . . , Em > können
genau m Rollennamen ni ∈ ROLE (i = 1, . . . , m) mit relship(ni ) = R und entity(ni ) = Ei
existieren. Dann wird R(n1 : E1 , . . . , nm : Em ) ∈ R-TYPE und ni : R → Ei ∈ ROLE(i =
1, . . . , m) notiert.
Für A ∈ ATTR mit type(A) = S, S ∈ E-TYPE ∪ R-TYPE und domain(A) = d wird
A : S → d notiert und entsprechend C : E → E für C ∈ COMP mit type(C) = E und
domain(C) = E .
Für Typkonstruktionen T, T1 , T2 ∈ CONSTRUCTION müssen die folgenden Bedingungen erfüllt sein:
1. output(T1 ) ∩ output(T2 ) = ∅ für T1 = T2
2. Sei connection:= {(I, O) | T ∈ CONSTRUCTION, I ∈ input(T ), O ∈ output(T )}
eine Relation und bezeichne connection+ die transitive Hülle dieser Relation, so darf
(E, E) ∈ connection+ für keinen Entitytyp E ∈ E-TYPE erfüllt sein.
Beispiel 2.4
Das EER–Schema des Konzerns in Abbildung 2.1 ist analog dem EER–Schema, das durch
die folgenden Mengen gegeben ist:
28
2.4. Die EER–Signatur
E-TYPE =
{
R-TYPE = {
KONZERN, FIRMA, ADRESSE, ZULIEFERFIRMA, KUNDE, AUFTRAG,
VORPRODUKT, PRODUKT, ABTEILUNG, ANGESTELLTER}
vergibt(kunde: KUNDE, k auftr: AUFTRAG),
liefert(zulieferfirma: ZULIEFERFIRMA, vorprodukt: VORPRODUKT),
besteht aus(a inhalt: AUFTRAG, p auftr: PRODUKT),
produziert(abt p: ABTEILUNG, p abt: PRODUKT),
gehört zu(abt f: ABTEILUNG, firma: FIRMA) }
ROLE =
{
firma (von FIRMA), zulieferfirma(von ZULIEFERFIRMA),
kunde (von KUNDE), a inhalt, k auftr (von AUFTRAG),
vorprodukt (von VORPRODUKT), p abt, p auftr (von PRODUKT),
abt f, abt p (von ABTEILUNG) }
ATTR =
{
Name (von KONZERN), Firmenname (von FIRMA),
Strasse, HausNr, Plz, Ort, TelNr, Fax (von ADRESSE),
Datum, AuftrNr (von AUTRAG), Preis, Menge (von besteht aus),
ChargenNr, ProdName, StPreis (von PRODUKT),
Auslastung (von produziert), AbtName (von ABTEILUNG),
Position, Gehalt, PersNr, AngName (von ANGESTELLTER) }
COMP =
{
Tochterfirmen, Adresse (von Konzern), Anschrift (von FIRMA),
AbtLeiter, Mitarbeiter (von ABTEILUNG),
AngAnschrift (von ANGESTELLTER),
Auftrag (von liefert) }
CONSTRUCTION = { ⊇(FIRMA;ZULIEFERFIRMA),
⊇(FIRMA;KUNDE),
⊇(PRODUKT;VORPRODUKT) }
2.4.2
Semantik
Zu jedem EER–Modell gehört ein Universum µ, das aus einer Sammlung von Wertebereichen bzw. Mengen möglicher Entities zu den im Modell angegebenen Daten– bzw.
Entitytypen besteht.
Zu jedem Datenbank–Schema gehört eine Menge
von passenden Datenbank–Zuständen
(Ausprägungen). Ein Zustand σ einer Datenbank ist eine Menge von Entities, Relationships und Attributen, die zu den in der Datenbank modellierten
Entity– und Relationship–
sowie Attributtypen gehören. In jedem Zustand σ ∈
werden die im Schema angegebenen Entity– und anderen Strukturtypen durch passende mathematische Strukturen wie
Mengen, Funktionen, Relationen usw. interpretiert.
Es folgt die Semantik der einzelnen Modellierungskonzepte des EER–Modells:
Entitytypen
Es sei E ∈ E-TYPE, dann gilt:
• E → µ(E)
29
Kapitel 2. Grundlagen
mit µ(E) = Menge der möglichen Entities vom Typ E. Dieses ist i. a. eine (nur
gedachte) unendliche Menge.
• im Zustand σ:
σ(E) = Menge der aktuellen Entities vom Typ E, so daß σ(E) ⊆ µ(E).
Das bedeutet, daß ein Entity vom Typ E im Zustand σ ein Element e ∈ σ(E) ist.
• Für verschiedene Entitytypen Ei = Ej , Ei , Ej ∈ E-TYPE, wird die Disjunktheit
der Universen und damit auch von Zuständen gefordert, d.h.
µ(Ei ) ∩ µ(Ej ) = ∅ ⇒ σ(Ei ) ∩ σ(Ej ) = ∅
Relationshiptypen
Es seien R ∈ R-TYPE und E1 , . . . , Em ∈ E-TYPE mit participants(R) = {E1 , . . . , Em }.
Im Zustand σ gilt:
σ(R) ⊆ σ(E1 ) × . . . × σ(Em )
Das bedeutet, daß ein Relationship vom Typ R zwischen Entities e1 , . . . , em ein m–Tupel
(e1 , . . . , em ) ∈ σ(R) ist.
Attributtypen
• Entity–Attributtypen:
Es seien E ∈ E-TYPE und A ∈ ATTR mit type(A) = E.
Im Zustand σ gilt:
σ(A) : σ(E) → domain(A)
Das heißt, daß ein Attribut vom Typ A im Zustand σ ein Zuordnungspaar (e, a) mit
e ∈ E und a ∈ domain(A) ist.
• optionale Entity–Attributtypen:
Es seien E ∈ E-TYPE und A ∈ ATTR mit type(A) = E.
Im Zustand σ gilt:
σ(A) : σ(E)→domain(A)
σ(A) ist eine partielle Funktion, da ⊥u ∈ domain(A) gilt, wobei ⊥u den Nullwert
eines Datentyps u ∈ SORTDT bezeichnet.
• Relationship–Attributtypen:
Es seien R ∈ R-TYPE und A ∈ ATTR mit type(A) = R.
Im Zustand σ gilt:
σ(A) : σ(R) → domain(A)
• optionale Relationship–Attributtypen:
Es seien R ∈ R-TYPE und A ∈ ATTR mit type(A) = R.
Im Zustand σ gilt:
σ(A) : σ(R)→domain(A)
30
2.4. Die EER–Signatur
Rollen
Es seien n ∈ ROLE, R ∈ R-TYPE und E ∈ E-TYPE mit relship(n) = R und
entity(n) = E.
Im Zustand σ gilt:
σ(n) = π : σ(R) → σ(E)
Ein Rollenname benennt eine Projektion π zwischen zusammengehörigen Entity– und
Relationshiptypen.
Kardinalitäten
Es seien R ∈ R-TYPE und E1 , E2 ∈ E-TYPE mit participants(R) ⊆ {E1 , E2 }.
Für die allgemeine Kardinalität (min1 , max1 ), (min2 , max2 ) gilt im Zustand σ:
∀ e1 ∈ σ(E1 ) : min1 ≤ |{e2 ∈ σ(E2 ) | (e1 , e2 ) ∈ σ(R)}| ≤ max1
∀ e2 ∈ σ(E2 ) : min2 ≤ |{e1 ∈ σ(E1 ) | (e1 , e2 ) ∈ σ(R)}| ≤ max2
Kardinalitäten beschreiben die Beteiligung von Objekten an Beziehungen.
Komponenten
Es seien C ∈ COMP und E1 , E2 ∈ E-TYPE mit type(C) = {E1 , E2 }.
• Aggregation
Im Zustand σ als objektwertiges Attribut gilt:
σ(C) : σ(E1 ) → σ(E2 )
Das bedeutet, daß die Komponente eine Zuordnung zwischen Objektmengen bezeichnet.
• Assoziation
Im Zustand σ als komplex–objektwertiges Attribut gilt:
σ(C) : σ(E1 ) → ass(σ(E2 ))
Hierbei steht ass für die Listen–, Mengen– oder Multimengenbildung:
σ(C) : σ(E1 ) → (σ(E2 ))∗
σ(C) : σ(E1 ) → P(σ(E2 ))
σ(C) : σ(E1 ) → B(σ(E2 ))
Typkonstruktionen
Gegeben seien n Eingangstypen E1 , . . . , En ∈ E-TYPE und m Ausgangstypen
A1 , . . . , Am ∈ E-TYPE sowie ein Teilmengenoperator Θ. In Abhängigkeit von m, n und Θ
werden durch eine Typkonstruktion T verschiedene Teilmengenbeziehungen beschrieben.
Es muß input(T ) = {E1 , . . . , En } und output(T ) = {A1 , . . . , Am } gelten.
• Generalisierung: m = 1, Θ ≡ =
31
Kapitel 2. Grundlagen
• einfache Spezialisierung: n = m = 1, Θ ≡ ⊇
• allgemeine (disjunkte) Spezialisierung: n = 1, Θ ≡ ⊇
• Kategorisierung: m = 1, Θ ≡ ⊇
• Partition: n = 1, Θ ≡ =
Damit alle Entities der Eingangstypen zusammengefaßt und ein Teil von ihnen auf die
Ausgangstypen verteilt wird, müssen die folgenden Bedingungen vom Universum µ und
in jedem Zustand σ erfüllt sein:
•
n
k=1
n
k=1
σ(Ek ) Θ
µ(Ek ) =
m
j=1 σ(Aj )
m
j=1
µ(Aj )
Diese beiden Bedingungen besagen, daß die Ausgangstypen nur Entities der Eingangstypen enthalten dürfen.
• σ(Ap ) ∩ σ(Aq ) = ∅ für p = q und p, q = 1, . . . , m
Dieses bedeutet, daß die Ausgangstypen disjunkt sind, d.h. ein Eingangstyp kann
nur in einem Ausgangstyp präsent sein.
Schlüssel
Gegeben sei ein Entitytyp E mit den Attributtypen A1 , . . . , An , d.h. type(Ai ) = E für i =
1, . . . , n. Eine Teilmenge {Ai1 , . . . , Aik } ⊆ {A1 , . . . , An } von obligatorischen Attributen
ist genau dann ein Schlüssel von E, wenn gilt:
• ∀ σ ∀ e, e ∈ σ(E) : (∀ j = 1, . . . , k : σ(Aij )(e) = σ(Aij )(e )) ⇒ e = e
• {Ai1 , . . . , Aik } ist eine minimale Teilmenge mit dieser Eigenschaft.
In einem EER–Modell muß zu jedem Entitytyp ein Schlüssel angegeben werden, sofern
dieser Typ kein Ausgangstyp einer Typkonstruktion ist. In einem solchen Fall erbt ein
Ausgangstyp die Schlüssel der Eingangstypen.
2.5
Der EER–Kalkül
Ein Kalkül zu einem Datenmodell ist eine Sprache, die die Darstellung logischer Zusammenhänge in einer übersichtlichen und exakten Form ermöglicht. Er eignet sich daher zur
Definition der Semantik einer Sprache, die auf diesem Datenmodell basiert.
Die Syntax des EER–Kalküls wird mit Hilfe der Prädikatenlogik 1. Ordnung definiert.
Im Gegensatz zur Prädikatenlogik ist der EER–Kalkül aber nicht hierarchisch aufgebaut (Abbildung 2.2), sondern besitzt eine rekursive Struktur (Abbildung 2.3). Daher ist
bei einzelnen Definitionen die Verwendung später definierter Begriffe nicht vermeidbar.
Die Semantik des Kalküls wird anschließend formal definiert. Auch wird der Begriff der
32
2.5. Der EER–Kalkül
Datenbank–Anfrage definiert, denn nur mit einer Anfrage ist es möglich, Informationen
aus einer Datenbank zu erhalten.
Terme
Formeln
Atomare Formeln
Abbildung 2.2: Hierarchischer Aufbau der Prädikatenlogik 1. Ordnung
Terme
Atomare Formeln
Bereiche
Formeln
Deklarationen
Abbildung 2.3: Rekursiver Aufbau des EER–Kalküls
Es sei ein EER–Modell einschließlich zugehöriger Datentypen SORTDT sowie ein
Datenbank–Zustand σ gegeben. Die Datentypen haben eine feste Interpretation.
Die Beispiele in diesem Kapitel beziehen sich alle auf das Konzern–Modell (siehe Abbildung 2.1) aus Kapitel 2.2.
2.5.1
Syntax
Definition 2.5
Das Alphabet des EER–Kalküls setzt sich wie folgt zusammen:
• Trennzeichen
• Klammern
• Doppelpunkt
, (Komma)
(, )
:
• Verbindungszeichen
• Quantoren
¬, ∧, ∨, ⇒, ⇔
∀, ∃
• Individuenvariablen
x, y, z . . .
• Sorten
33
Kapitel 2. Grundlagen
– Datensorten SORTDT
– Entitytypen E-TYPE
– Relationshiptypen R-TYPE
• Sortenausdrücke
– Jede Sorte ist ein Sortenausdruck.
– Ist s ein Sortenausdruck, so sind list(s), set(s) und bag(s) Sortenausdrücke.
• Die Menge der Prädikatsymbole π(τ1 , . . . , τn ) besteht aus den Datentyp–Prädikaten
der Menge PREDDT sowie den Relationshiptypen. Mit den Prädikaten der Menge
PREDDT stehen Vergleichsoperatoren für Zahlen, Listen, Mengen und Multimengen
zur Verfügung. Die Datentyp–anzeigenden Indizes der Prädikate der Menge PREDDT
werden i. allg. weggelassen, da sich dieser aus dem Kontext erschließen läßt.
Ein Relationshiptyp (ohne Berücksichtigung von Relationship–Attributtypen)
R(n1 : E1 , . . . , nm : Em ) mit partizipierenden Entitytypen Ei und zugehörigen Rollennamen ni ist als Prädikat R(τ1 , . . . , τm ) zugelassen. Die Definition dieses Prädikats ist
R(τ1 , . . . , τm ) := ∃ (xR : R) (n1 (xR ) = τ1 ∧ . . . ∧ nm (xR ) = τm ),
wobei xR eine Variable für den Relationshiptyp R ist. Das bedeutet, daß die zu
Entities ei ausgewerteten Terme τi (i = 1, . . . , m) in einer Beziehung des Typs R
stehen müssen, um die Formel zu erfüllen. Die τi sind Terme im Sinne der unten
gegebenen Definition.
Die Menge der Prädikatsymbole wird durch is–Prädikate, die auf Typkonstruktionen
angewendet werden, erweitert. Das Prädikat is Ak : Ej prüft, ob ein Entity des
Eingangstyps Ej auch Entity des Ausgangstyps Ak ist. Es sei e ∈ Ej , dann gilt
true, falls e ∈ Ak
is Ak (e) =
f alse, sonst
Analog ist das Prädikat is Ej : Ak definiert.
• Die Menge der Operatorsymbole ω(τ1 , . . . , τn ) besteht aus den Datentyp–Operationen der Menge OPNSDT . Damit existieren Operationen auf Listen, Mengen und
Multimengen. Aggregierende Funktionen auf Assoziationen von Zahlen und Konvertierungsfunktionen sind definiert. Der Datentyp–anzeigende Index wird auch für
Operatoren der Menge OPNSDT i. allg. nicht angegeben.
Erweitert wird diese Menge durch Datenbankschema–Operatoren. Ist x eine Variable der Sorte E ∈ E-TYPE oder R ∈ R-TYPE und A ∈ ATTR ein Attribut, so
bezeichnet x.A eine Variable für das Attribut A, das zum Typ E oder R gehört.
In gleicher Weise werden Variablen für Komponenten C ∈ COMP oder Rollennamen n ∈ ROLE erzeugt: x.C.A entspricht einer Variablen für das Attribut A der
Komponente C, die objektwertiges Attribut des Typs E oder R ist.
Partielle Konversionen ermitteln die gemeinsamen Entities von Ein– und Ausgangstypen von Typkonstruktionen. So berechnet der Operator as Ak : Ej → Ak diejenigen Entities des Ausgangstyps Ak , die auch Entities des Eingangstyps Ej sind. Der
Operator as Ej : Ak → Ej ist analog definiert.
34
2.5. Der EER–Kalkül
Eine besondere Art von Operator ist eine Konstante. Konstanten k der spezifizierten
Datentypen s werden als nullstellige Funktionen k :→ s aufgefaßt (nach [Hoh93]).
Definition 2.6
Eine Deklaration δ = (x : ρ) bindet eine Variable x an einen (sortenmäßig passenden)
Bereich ρ. Ein Bereich ist eine (Multi–) Menge mit endlich vielen Elementen oder ein
Sortenausdruck.
Definition 2.7
Die Terme des EER–Kalküls sind wie folgt induktiv definiert:
1. Jede Variable x ist ein Term.
2. Jede sortenmäßig passende Anwendung ω(τ1 , . . . , τn ) eines Operators ω auf Terme
τ1 , . . . , τn ist ein Term.
3. Seien δ1 , . . . , δk Deklarationen und ϕ eine Formel. Wenn τ1 , . . . , τn Terme sind, so
sind es auch
• Mengenterme:
{τ1 , . . . , τn | δ1 ∧ . . . ∧ δk ∧ ϕ}
• Multimengenterme:
{{τ1 , . . . , τn | δ1 ∧ . . . ∧ δk ∧ ϕ}}
Die Gültigkeitsbereiche der Deklarationen bestehen aus den Termen τ1 , . . . , τn sowie
der Formel ϕ. Damit darf jede in δi deklarierte Variable sowohl in τ1 , . . . , τn als auch
in ϕ verwendet werden.
Beispiel 2.8
Die Variable ab sei vom Typ ABTEILUNG.
1. ab.AbtLeiter ist ein Term der Sorte ANGESTELLTER. AbtLeiter: ABTEILUNG
→ ANGESTELLTER ist eine Operation und die Variable ab ein Term (nach 2.7.1).
Nach 2.7.2 ist der Ausdruck also ein Term.
2. {{ab | (ab : ABTEILUNG)}} ist ein Term der Sorte bag(ABTEILUNG). Die Variable
ab ist durch die Deklaration (ab: ABTEILUNG) gebunden. Der Term ist nach 2.7.3
aufgebaut.
Definition 2.9
Atomare Formeln sind definiert durch:
1. Eine Gleichung τ1 = τ2 zwischen zwei Termen τ1 und τ2 .
2. Eine sortenmäßig passende Anwendung π(τ1 , . . . , τn ) eines Prädikats π auf Terme
τ1 , . . . , τn .
35
Kapitel 2. Grundlagen
Beispiel 2.10
Die Variable ang sei vom Typ ANGESTELLTER, die Variable ab vom Typ ABTEILUNG,
die Variable prod sei vom Typ PRODUKT und die Variable p vom Typ produziert.
1. ang = ab.AbtLeiter ist eine atomare Formel nach 2.9.1.
2. p.Auslastung > 80 ist eine atomare Formel nach 2.9.2.
3. produziert(prod, ab) ist eine atomare Formel nach 2.9.2.
Definition 2.11
Eine Variable ist frei, wenn sie weder im Gültigkeitsbereich einer Deklaration noch in
dem eines Quantors liegt. Ist eine Variable nicht frei, so ist die gebunden.
Definition 2.12
Die Formeln des EER–Kalküls sind gegeben durch:
1. Jede atomare Formel ist eine Formel.
2. Wenn ϕ, ϕ1 , ϕ2 Formeln sind, so sind auch ¬ϕ, ϕ1 ∧ ϕ2 , ϕ1 ∨ ϕ2 Formeln.
3. Wenn ϕ eine Formel und δ = (x : ρ) eine Deklaration ist, so sind auch ∃ (x : ρ)(ϕ)
und ∀ (x : ρ)(ϕ) Formeln.
Der Gültigkeitsbereich der Deklaration δ ist auf ϕ beschränkt.
Beispiel 2.13
Die Variable ang sei vom Typ ANGESTELLTER.
1. Die Beispiele 2.10.1 und 2.10.2 sind Formeln nach 2.12.1.
2. (ang.PersNr = 100) ∨ (ang.PersNr = 101) ist eine Formel nach 2.12.2.
3. ∃ (ab : ABTEILUNG)(ang = ab.AbtLeiter) ist eine Formel nach 2.12.3.
Bemerkung
Die im Alphabet eingeführten Verbindungszeichen ⇒ und ⇔ sind als syntaktische
Abkürzungen wie folgt definiert. ϕ1 und ϕ2 seinen Formeln.
(ϕ1 ⇒ ϕ2 ) := (¬(ϕ1 ) ∨ ϕ2 )
(ϕ1 ⇔ ϕ2 ) := ((ϕ1 ⇒ ϕ2 ) ∧ (ϕ2 ⇒ ϕ1 ))
2.5.2
Semantik
Definition 2.14
Ein Bereich ist, wie in 2.6 bereits definiert, eine (Multi–) Menge mit endlich vielen Elementen oder ein Sortenausdruck. Aus diesen Bereichen kann eine Variable x Werte durch
Belegung annehmen. Eine Belegung β ordnet dabei allen (vorkommenden) Variablen
passende Werte, Objekte oder Beziehungen zu.
36
2.5. Der EER–Kalkül
Die folgenden Notationen werden verwendet:
[σ, β](τ ) bezeichne den Wert des Terms τ im Zustand σ unter der Belegung β.
[σ, β] |= ϕ bedeutet: Eine Formel ϕ ist im Zustand σ unter der Belegung β gültig.
Es folgt die Semantik, d.h. eine Interpretation der einzelnen Kalkülkonstrukte:
Definition 2.15
Die Semantik der Terme ist die folgende:
• [σ, β](x) := β(x)
• [σ, β](ω(τ1 , . . . , τn )) := σ(ω)([σ, β](τ1 ), . . . , [σ, β](τn ))
• [σ, β]({τ1 , . . . , τn | δ1 ∧ . . . ∧ δk ∧ ϕ}) :=
{[σ, β ](τ1 ), . . . , [σ, β ](τn ) | es gibt eine Ergänzung β der Belegung β für die in
δ1 , . . . , δk deklarierten Variablen, so daß [σ, β ] |= ϕ}.
• [σ, β]({{τ1 , . . . , τn | δ1 ∧ . . . ∧ δk ∧ ϕ}}) :=
{{[σ, β ](τ1 ), . . . , [σ, β ](τn ) | es gibt eine Ergänzung β der Belegung β für die in
δ1 , . . . , δk deklarierten Variablen, so daß [σ, β ] |= ϕ}}.
Definition 2.16
Die Semantik der atomaren Formeln:
• [σ, β] |= τ1 = τ2
gdw.
• [σ, β] |= π(τ1 , . . . , τn )
[σ, β](τ1 ) = [σ, β](τ2 )
gdw. ([σ, β](τ1 ), . . . , [σ, β](τn )) ∈ σ(π)
Definition 2.17
Die Semantik der Formeln:
• [σ, β] |= ¬ϕ
gdw.
nicht [σ, β] |= ϕ
• [σ, β] |= ϕ1 ∧ ϕ2
gdw.
[σ, β] |= ϕ1 und [σ, β] |= ϕ2
• [σ, β] |= ϕ1 ∨ ϕ2
gdw.
[σ, β] |= ϕ1 oder [σ, β] |= ϕ2
• [σ, β] |= ∃ (x : ρ)(ϕ) gdw.
es gibt r ∈ σ(ρ), so daß [σ, β ] |= ϕ, wobei β eine Ergänzung der Belegung β mit
β (x) = r und β (y) = β(y) für y ≡ x ist.
• [σ, β] |= ∀ (x : ρ)(ϕ) gdw.
für alle r ∈ σ(ρ) gilt [σ, β ] |= ϕ, wobei β eine Ergänzung der Belegung β mit
β (x) = r und β (y) = β(y) für y ≡ x ist.
37
Kapitel 2. Grundlagen
2.5.3
Anfragen
Anfragen dienen dazu, Informationen aus einer Datenbank zu erhalten. Wird eine Information benötigt, muß eine Anfrage gefunden werden, die diese Information aus dem
vorhandenen Datenbankinhalt spezifiziert.
Definition 2.18
Eine Anfrage im EER–Kalkül ist ein Term ohne freie Variablen.
Das Verbot freier Variablen stellt sicher, daß ein Term nur in Abhängigkeit eines Datenbankzustands σ, aber unabhängig von einem durch eine Belegung gegebenen Kontext
ausgewertet wird.
Definition 2.19
Die Semantik einer Anfrage τ ist gegeben durch:
[σ, β] |= τ
gdw. [σ, α] |= τ,
wobei α und β beliebige Belegungen sind.
Beispiel 2.20
1. Welche Angestellten verdienen mehr als 4000 DM ?“
”
{ang.PersNr, ang.AngName | (ang : ANGESTELLTER) ∧ ang.Gehalt > 4000}
2. Welche Aufträge hat die Firma ’Meier’ vergeben ?“
”
{a.AuftrNr | (a : AUFTRAG) ∧ ∃ (f : FIRMA)(f.Firmenname = ’Meier’
∧ vergibt(as KUNDE(f), a)) }
3. Welche Mitarbeiter arbeiten in der Abteilung ’Montage’ ?“
”
{ang.PersNr, ang.AngName | (ang : ANGESTELLTER)
∧ ∃ (ab : ABTEILUNG)(ab.AbtName = ’Montage’ ∧ ang ∈ ab.Mitarbeiter)}
4. In welcher Abteilung arbeitet der Angestellte mit dem höchsten Gehalt ?“
”
{ab.AbtName | (ab : ABTEILUNG) ∧ ∃ (ang : ANGESTELLTER)
(ang.Gehalt = max{a.Gehalt | (a : ANGESTELLTER)}
∧ ang ∈ ab.Mitarbeiter)}
2.6
Relationenmodell
2.6.1
Formale Definition
Das Relationenmodell ist die Grundlage für viele Datenbank–Managementsysteme. Die
einzelnen Relationen werden durch Tabellen repräsentiert. Jede Zeile einer Tabelle heißt
38
2.6. Relationenmodell
Tupel. Alle Informationen einer Datenbank, also sowohl die Objekte wie auch ihre Beziehungen, werden auf die gleiche Art durch Tabellen dargestellt. Beziehungen zwischen
Objekten sind vorhanden, wenn ein Wert in mehreren Relationen vorkommt. Zur Definition des Relationenmodells wird der Begriff des Relationenschemas benötigt.
Definition 2.21
Es sei eine Datentyp–Signatur DT = (SORTDT , OPNSDT , PREDDT ) gegeben. Die Syntax
eines Relationenschemas r ist gegeben durch:
1. die Mengen REL-TYPE, ATTRR ∈ |FISET| und
2. die Hilfsfunktionen sourceR und destinationR , so daß
sourceR : ATTRR → REL-TYPE
destinationR : ATTRR → SORTDT
Ein Relationenschema (auch Tupel genannt) r ∈ REL-TYPE ist von der Form
r = prod(A1 : u1 , . . . , An : un ) mit Ai ∈ ATTRR und ui ∈ SORTDT (f ür i = 1, . . . , n,
n ≥ 1).
Definition 2.22
Die Semantik eines Relationenschemas ist gegeben durch:
1. eine Funktion µREL : REL-TYPE → |FISET| und
2. eine Funktion µATTR : ATTRR → |FUN|, so daß
µATTR (A) : µREL (sourceR (A)) → µSORTDT (destinationR (A)).
Definition 2.23
Das Relationenmodell besteht aus einer Menge ATTRR von Attributen und einer Menge REL-TYPE von Relationenschemata ([Hoh93]).
2.6.2
Transformation des EER–Modells in das Relationenmodell
Die Transformation M eines EER–Modells in ein Relationenmodell ist eine Abbildung,
die zu gegebener EER–Modellierung eine äquivalente“ relationale Modellierung erzeugt:
”
EER-Modell → Relationenmodell
M :=
EER(DT)
→ REL(DT)
Diese Abbildung beinhaltet insbesondere die Transformation derjenigen Nicht–
Standarddatentypen der Menge DT, die nicht von relationalen Datenbanksystemen angeboten werden. M liefert zu gegebener EER–Signatur EER(DT) eine relationale Signatur
REL(DT), die, um Integritätsbedingungen erweitert, zur EER–Signatur äquivalent ist.
39
Kapitel 2. Grundlagen
Definition 2.24
Es sei eine Datentyp–Signatur DT = (SORTDT , OPNSDT , PREDDT ) gegeben.
Eine relationale Datentyp–Signatur REL(DT) zu einem EER–Schema ist ein Tripel
REL(DT) = (SORTREL , OPNSREL , PREDREL ), wobei gilt:
1. SORTREL := SORT
n DT ∪ {surrogateS | S ∈ E-TYPE ∪ R-TYPE} ∪
{ k=1 surrogateEk | C ∈ CONSTRUCTION
mit input(C) = {E1 , . . . , En }}
2. OPNSREL := OPNSDT
3. PREDREL := PREDDT
surrogateS , S ∈ E-TYPE ∪ R-TYPE, ist eine Menge spezieller Datentypen im Relationenmodell. Attribute, deren Wertebereich surrogate ist, heißen Surrogate. Diese sind
systemdefiniert und –kontrolliert, d.h. ein Benutzer hat auf diesen Wert keinen Einfluß.
Das Surrogat identifiziert eindeutig die zu einem Entity oder Relationship gehörigen Tupel
einer Relation. Surrogate können mit Hilfe der Mengenvereinigung miteinander kombiniert
werden.
Das Ziel dieser Arbeit ist die eindeutige Definition einer Datenbank–Anfragesprache.
Das Anlegen sowie Verwalten der dazu benötigten Datenbank, insbesondere die Integritätsüberwachung, stehen nicht im Vordergrund. Daher wird in diesem Abschnitt nur
die Rolle der Surrogate bei der Erzeugung einer Datenbank auf der Grundlage eines
EER–Schemas herausgestellt. Dadurch sollen die Unterschiede und Probleme, die bei der
Erzeugung einer benötigten temporalen Testdatenbank auftreten, verständlich gemacht
werden. Eine ausführliche Beschreibung der Transformation eines EER–Modells in das
Relationenmodell ist in [Zec97] zu finden. Dort wurden zu diesem Zweck Algorithmen
und ihre Übersetzung in eine Daten–Definitionssprache entwickelt. Im Rahmen der Diplomarbeit [Zec97] wurde das Werkzeug EDE (EER–Diagramm–Editor) erstellt, das ein
EER–Schema nach ORACLE transformiert. ORACLE ist ein Datenbankmanagementsystem, das auf dem Relationenmodell basiert. Die zugehörige Datenbanksprache ist SQL
(Structured Query Language).
Surrogat– und Schlüsselattribute
Bei der Transformation eines EER–Modells wird für jeden Entitytypen E, E ∈ E-TYPE,
eine eigene Relation definiert. Diese Relation heißt Stammrelation. Sie erhält ein zusätzliches Attribut, ein künstliches Surrogat E$. Bei der Erzeugung einer solchen Stammrelation in ORACLE wird das Surrogat als primary key, die eigentlichen Schlüsselattribute als
unique–Werte angelegt. Das bedeutet, daß sowohl der Surrogat– als auch der Schlüsselwert
eines Objekts innerhalb seiner Tabelle eindeutig sind. Die primary key–Klausel ist eine
Möglichkeit in SQL einen Wert so auszuzeichnen, daß andere Tabellen darauf zugreifen
können. Es ist hervorzuheben, daß dieses Surrogat mit der oben gegebenen Definition eines
Surrogats nicht übereinstimmt. So soll ein Surrogat systemdefiniert und –kontrolliert sein.
Das hier sichtbare, manipulierbare Surrogat dient der Darstellung von Datenabhängigkeiten.
40
2.6. Relationenmodell
Zu jedem Relationshiptyp R(n1 : E1 , . . . , nm : Em ) (ohne Berücksichtigung von Relationship–Attributtypen), R ∈ R-TYPE, wird ebenfalls eine entsprechende Stammrelation
festgelegt. Der Schlüssel einer solchen Relation setzt sich aus den Schlüsseln der beteiligten Entitytypen Ei zusammen, die Surrogate Ei $ bilden somit den Schlüssel. Die Surrogate
der Entitytypen werden benutzt, um Zusammenhänge zwischen verschiedenen Entities,
im EER–Diagramm durch die Verwendung von Relationships, Typkonstruktionen oder
Komponenten dargestellt, mit möglichst geringem Aufwand darzustellen. Relationships
und mehrwertige Komponenten werden durch eigene Tabellen ausgedrückt. Diese Tabellen werden im folgenden als Datenabhängigkeiten darstellende Tabellen bezeichnet.
Bei Typkonstruktionen und einwertigen Komponenten ist lediglich die Erweiterung der
Entitytyp darstellenden Tabellen um Surrogateinträge nötig. Ohne die Verwendung von
Surrogaten müßte jeweils der eigentliche Entityschlüssel an Stelle des Surrogats in die
Tabellen aufgenommen werden. Dieses kann aber, falls sich ein Schlüssel aus mehreren
Attributen zusammensetzt, mehr Speicher kosten, als ein einzelnes Surrogatattribut.
Ein Nachteil der Surrogate ist, wie bereits erwähnt, deren Generierung und Verwaltung.
Es gibt aber Datenbanksysteme, die eine fortlaufende Erzeugung und Verwaltung von
künstlichen Werten unterstützen, die zu diesem Zweck sinnvoll ausgenutzt werden kann.
In ORACLE wird zum Beispiel für jedes in die Datenbank eingetragene Objekt eine innerhalb der Datenbank eindeutige Identifikation (ID) erzeugt, vgl. [KL95]. Diese wird
in der Systemtabelle USER OBJECTS unter Object ID abgespeichert. Ob und wie diese
ID als sichtbarer Surrogatschlüssel zu nutzen ist, geht über den Rahmen dieser Arbeit
hinaus. Vorstellbar wäre, direkt nach dem Eintrag eines Objekts eine update–Operation
auf den eben erzeugten Eintrag auszuführen und dabei die Objekt–ID aus der Tabelle USER OBJECTS in die eigentliche Tabelle an Stelle eines benutzerdefinierten Surrogats
einzufügen.
41
Kapitel 2. Grundlagen
42
Kapitel 3
Ein graphisches temporales
Datenmodell
In konventionellen Datenbanken wird nur der momentane Zustand von Daten festgehalten. Werden Einträge verändert, ersetzt der neue Wert den alten. In einer temporalen
Datenbank dagegen führt eine Datenveränderung im allgemeinen zu einer Einfügung neuer Daten, so daß alte Werte nicht gelöscht werden. Dieses ermöglicht die Formulierung
von Anfragen an den aktuellen Datenbankzustand, aber auch an vergangene und, wenn
Gültigkeitszeiträume angegeben werden, zukünftige Zustände.
In dieser Arbeit wird die graphische Formulierung von Anfragen an eine temporale Datenbank realisiert. Dazu wird ein Datenmodell als Grundlage benötigt: das temporale erweiterte Entity–Relationship–Modell (TEER–Modell). Das TEER–Modell nach [EWK93]
basiert auf dem EER–Modell. Das EER–Modell ist dabei um die zeitliche Dimension erweitert, womit auch zeitliche Informationen über die Daten und deren Beziehungen zueinander beschreibbar werden. Das TEER–Modell wird im zweiten Abschnitt vorgestellt.
Das TEER–Diagramm ist die graphische Umsetzung der in einem TEER–Schema enthaltenen Informationen. Es ist identisch mit dem EER–Diagramm, da sämtliche Elemente
eines TEER–Schemas zusätzlich zeitabhängig sind, die Zeit aber nicht dargestellt wird.
Ein nicht temporal abhängiges Element ist zeitinvariant. Dieses bedeutet, daß das Element
über die gesamte Lebensdauer einer Datenbank gültig ist und nicht verändert werden
kann. Auf eine Erweiterung des TEER–Modells um zeitinvariante Objekte wird verzichtet,
da sonst eine graphische Unterscheidung temporal abhängiger und unabhängiger Objekte
eingeführt werden müßte, was das Datenmodell unnötigt kompliziert. Zur Darstellung
zeitinvarianter Objekte ist es einfacher die Lebensdauer des Objekts auf die Lebensdauer
der Datenbank zu setzen.
Nach der Einführung der temporalen Standarddatentypen werden die Syntax und Semantik des TEER–Modells formuliert. Auf dem TEER–Modell basierend wird in Kapitel
4.1 eine graphische Anfragesprache definiert, anschließend wiederum deren Syntax und
Semantik.
43
Kapitel 3. Ein graphisches temporales Datenmodell
3.1
Das TEER–Modell
Da im TEER–Modell nach [EWK93] und im EER–Modell dieselben Konzepte verwendet
werden, wird hier nur auf temporale Erweiterungen, die die jeweiligen Konzepte betreffen,
eingegangen.
Temporale Hierarchie
Im Zusammenhang mit der temporalen Korrektheit eines TEER–Modells kann man von
einer temporalen Hierarchie sprechen. Diese ergibt sich, da Entity–Attribute, Typkonstruktionen, Komponenten und Relationships nicht älter als die an ihnen beteiligten
Entities sein dürfen. Relationship–Attribute wiederum dürfen die Lebensdauer des zugehörigen Relationships nicht übersteigen.
Entity
= Eingangstyp (im Fall einer Typkonstruktion)
Typkonstruktion
Entityattribute Relationships Komponenten
Relationshipattribute
Ausgangstyp
Entityattribute
des Ausgangstyps
Relationships
Relationshipattribute
Abbildung 3.1: Die temporale Hierarchie
Darstellung der Zeit
Es sei T die abzählbar unendliche Menge von geordneten diskreten Punkten in der Zeit,
d.h. T = {t0 , t1 , . . . , tnow , tnow+1 , . . . , t∞ }. t0 bezeichnet den Entstehungszeitpunkt der Datenbank, tnow den aktuellen Zeitpunkt, der sich stetig verändert. t∞ bezeichnet den in der
unendlichen Zukunft liegenden Zeitpunkt. Der Abstand der Zeitpunkte ist von der Anwendung der Datenbank abhängig, d.h. Jahr, Monat, Tag, Stunde oder jede andere sinnvolle
Zeiteinteilung ist möglich. Ein Zeitintervall [ts , te ] ist dann eine Menge von aufeinanderfolgenden Zeitpunkten:
[ts , te ] = {ts , ts+1 , . . . , te } ⊆ T
ts ist die Start– bzw. Anfangszeit, te die Endzeit. Ein einzelner Zeitpunkt wird als Zeitintervall [t, t], oder kurz [t], dargestellt.
Ein temporales Element TE ist eine endliche Vereinigung von Zeitintervallen, d.h. eine
Menge von Zeitpunkten. Seien Ii , i = 1, . . . , n, Intervalle in T , dann gilt:
TE = I1 ∪ I2 ∪ . . . ∪ In
= {t | t ∈ I1 ∨ t ∈ I2 ∨ . . . ∨ t ∈ In }
44
3.1. Das TEER–Modell
Ein Intervall Ij ⊆ TE ist maximal in TE, wenn für alle Intervalle Ik ⊆ TE, j = k, mit
Ij ∩ Ik = ∅ gilt: Ik ⊆ Ij .
In dieser Version des TEER–Modells wird nur die Valid–Time betrachtet. Diese Zeitart
gibt den Gültigkeitszeitraum der in der Datenbank enthaltenen Daten an. Die Valid–Time
ermöglicht somit den Zugriff auf aktuell gültige Daten, historische Daten und Daten, die in
der sogenannten Zukunftszeit gültig sind. Historische Daten repräsentieren einen vergangenen Zustand der Mini–Welt. Daten der Zukunftszeit beschreiben dagegen Ereignisse,
die geplant sind.
Temporaler Datenbankzustand
Der Zustand σ einer temporalen Datenbank besteht aus einer Folge von Zuständen σt ,
t ∈ T:
σ =< σt0 , σt1 , . . . , σtnow , σtnow+1 , . . . , σt∞ > .
σt ist der Zustand des Datenbankinhalts zu einem Zeitpunkt t, ein sogenannter Schnappschuß. Eine temporale Datenbank enthält für jeden Zeitpunkt t einen Schnappschuß. Der
Zustand σ besteht somit aus einer Folge von Schnappschüssen.
Entities und Entitytypen
Entities und Entitytypen stehen in der temporalen Hierarchie auf der obersten Stufe, was
bedeutet, daß an sie keine temporalen Korrektheitsbedingungen gestellt werden. Entity–
Attributtypen dagegen sind vom zugehörigen Entitytyp zeitabhängig.
Jedem Entity e vom Entitytyp E ist ein temporales Element TE(e) ⊆ [t0 , t∞ ] zugeordnet. TE(e) gibt die Lebensdauer des Entities e an. Diese kann ein Zeitintervall oder die
Vereinigung disjunkter Zeitintervalle sein.
Der zeitliche Wert eines Attributtyps Ai , das zu dem Entity e gehört, kurz Ai (e), ist die
partielle Funktion
Ai (e) : TE(e)→domain(Ai ).
Diese Funktion wird als temporale Zuordnung bezeichnet. Die Teilmenge von TE(e),
in der Ai (e) definiert ist, wird als TE(Ai (e)) notiert und wird temporales Element der
temporalen Zuordnung genannt. Es wird angenommen, daß Ai innerhalb der Intervalle
TE(e) − TE(Ai (e)) unbekannt ist. Der temporale Wert eines Attributs vom Typ Ai wird
mit Ai (e)(t) bezeichnet, es ist der Wert von Ai im Zustand σt .
In einer temporalen Datenbank muß ein Schlüsselattribut(typ) A eines Entitytyps E zu
jedem Zeitpunkt t ∈ T eindeutig sein, d.h. keine zwei Entities vom Typ E dürfen denselben Wert für A zum Zeitpunkt t annehmen. Da jedes Entity das systemdefinierte
Surrogat–Attribut besitzt, ist eine update–Operation auf Schlüsselattribute zulässig. Eine
update–Operation auf einer temporalen Datenbank entspricht einer insert–Operation auf
einer konventionellen Datenbank, so daß mehrere Datenbankeinträge desselben Schlüsselattributs existieren können. Der Wert des Surrogats ist eindeutig für jedes Entity in der
45
Kapitel 3. Ein graphisches temporales Datenmodell
Datenbank bestimmt. Dieser Wert ist für den Benutzer der Datenbank nicht sichtbar
und wird während der ganzen Lebensdauer des Entities nicht verändert. Das temporale
Element des Surrogats stimmt mit der Entity–Lebensdauer TE(e) überein.
Relationships und Relationshiptypen
Relationships sind von den an ihnen beteiligten Entities temporal abhängig.
Jedes Relationship r ist mit einem temporalen Element TE(r) assoziiert. TE(r) gibt die
Lebensdauer des Relationships r an. Zur Sicherung zeitlicher Korrektheit muß gelten, daß
das Relationship r nur zu einem Zeitpunkt t existieren kann, zu dem alle Entities, die zu
dieser Beziehung gehören, existieren:
TE(r) ⊆ (TE(e1 ) ∩ . . . ∩ TE(em )),
wobei die temporale Zuordnung für Relationship–Attributtypen gegeben ist durch
Ai (r) : TE(r)→domain(Ai ).
Für das temporale Element der temporalen Zuordnung gilt:
TE(Ai (r)) ⊆ TE(r).
Ai (r)(t) bezeichne den temporalen Wert des Relationship–Attributtyps Ai .
Komponenten
Eine Komponente C zu einem Entitytyp E1 mit dem Wertebereich E2 oder
set/bag/list(E2 ) besitzt als (komplex–) objektwertiges Attribut den zeitlichen Wert
C(e1 ) : TE(e1 )→domain(C).
Das temporale Element der temporalen Zuordnung ist TE(C(e1 )). Es muß gelten:
TE(C(e1 )) ⊆ TE(e1 ) und TE(C(e1 )) ⊆ TE(e2 ).
Typkonstruktionen
Es sei eine Typkonstruktion T mit den Eingangstypen E1 , . . . , En und Ausgangstypen
A1 , . . . , Am gegeben. Jedem Entity ei , aj vom Typ Ei , Aj ist ein temporales Element
TE(ei ) bzw. TE(aj ) zugeordnet, i = 1, . . . , n, j = 1, . . . , m. Zur Sicherung temporaler
Korrektheit im Rahmen einer Typkonstruktion muß gelten:
n
TE(ei ) ⊇
i=1
m
j=1
46
TE(aj )
3.2. Ein temporales Beispiel–Datenbank–Schema
3.2
Ein temporales Beispiel–Datenbank–Schema
Das EER–Schema eines Konzerns (Abbildung 2.1) aus Kapitel 2.2 kann auch temporal
interpretiert werden. Es ist dann das TEER–Modell eines Konzerns dargestellt. Graphisch
sind, wie bereits erwähnt, ein EER– und ein TEER–Diagramm nicht zu unterscheiden.
Das TEER–Schema des Konzerns stellt Informationen die Vergangenheit, Gegenwart und
Zukunft betreffend zu unternehmensplanerischen Zwecken zur Verfügung. Aus den Daten
lassen sich Geschäftsberichte über beliebige Zeiträume erstellen. Die Entwicklung einzelner
Abteilungen und deren Anteil am Produktionsprozeß lassen sich analysieren. Die Historie
kundenbezogener Auftragsdaten kann dazu dienen, festzustellen, welche Kunden innerhalb
der letzten Zeit weniger Aufträge als früher oder überhaupt keine vergeben haben. An
Hand der bestehenden Auslastung der vorhandenen Kapazitäten und der Auftragslage
lassen sich Unternehmenszukäufe planen. Abteilungsstärken und deren Beteiligung am
Produktionsprozeß sind modellierbar.
Für die in dieser Arbeit folgenden Beispiele habe ein bestimmtes ANGESTELLTER–
Entity e mit Gültigkeitszeitraum TE(e) = [1/7/90, t∞] die unten stehenden Attributwerte.
Der temporale Wert eines Attributs Ai (e)(t) wird hierbei mittels der Notation t → Ai (e)
angegeben. Zusammenhängende Zeitpunkte mit denselben Attributwerten werden dabei
zu Intervallen zusammengefaßt. Der Abstand zwischen zwei aufeinanderfolgenden Zeitpunkten sei ein Tag, tnow sei der 31.7.97.
Surrogat(e) = {[1/7/90, t∞ ] → surrogate id}
AngName(e) = {[1/7/90, t∞ ] → Hans Müller}
PersNr.(e) = {[1/7/90, t∞ ] → 123987}
Gehalt(e) = {[1/7/90, 30/9/90] ∪ [1/4/91, 31/12/91] → 1000,
[1/1/92, 31/12/94] → 1500,
[1/1/95, 30/6/95] → 2500,
[1/7/95, 31/12/95] ∪ [1/4/96, 31/3/97] → 3000,
[1/1/96, 31/3/96] → 2800,
[1/4/97, tnow ] → 3500,
[1/10/97, 31/5/98] → 3800,
[1/10/90, 31/3/91] ∪ [1/6/98, t∞ ] → ⊥n }
Position(e) = {[1/7/90, 30/9/90] ∪ [1/4/91, 31/12/91] → Aushilfe,
[1/10/90, 31/3/91] → ⊥s ,
[1/1/92, 31/12/94] → Lehrling,
[1/1/95, 31/3/97] → Monteur,
[1/4/97, tnow ] → stellv. Abteilungsleiter,
[1/6/98, t∞ ] → Abteilungsleiter}
3.3
TEER–Standarddatentyp–Signatur
In diesem Abschnitt werden basierend auf dem Begriff der Datentyp–Signatur die Zeit–
Standarddatentypen einer temporalen Datenbank definiert, in der Daten auf der Basis
eines TEER–Schemas abgespeichert werden können. Die in Kapitel 2.3.2 eingeführten
Standarddatentypen bilden zusammen mit den Zeit–Standarddatentypen die Standarddatentypen einer temporalen Datenbank.
47
Kapitel 3. Ein graphisches temporales Datenmodell
Die Zeit–Standarddatentypen des TEER–Modells sind die temporalen Datentypen date,
interval und TE type. Die temporalen Elemente sind vom Datentyp TE type. Mit Hilfe
der Listenbildung (list) und der Mengenbildung (set) werden aus dem Datentyp date
die Typen interval und TE type sowie die darauf erlaubten Operationen erzeugt. Dazu
werden die Prädikate des Typs date herangezogen, obwohl sie erst später im Text definiert
werden. Die Mengenbildung wird ebenso bei der Definition verschiedener Operationen
verwendet. Die neu konstruierten Sortenausdrücke besitzen zu gegebener Interpretation
der zugrundeliegenden (vordefinierten) Datentypen eine feste Interpretation.
Die TEER–Standarddatentyp–Signatur ist gegeben durch
TDT = (SORTTDT , OPNSTDT , PREDTDT ),
wobei die beteiligten Mengen wie folgt definiert sind:
Jede Interpretation eines Zeit–Standarddatentyps s enthält einen sogenannten Nullwert
⊥s im Sinne von undefiniert”: ⊥s ∈ ISORT (s) für jedes s ∈ SORTTDT .
”
SORTTDT = SORTDT ∪ {date, interval, TE type}
mit
interval := list(date)
TE type := set(date)
OPNSTDT = OPNSDT ∪
{ −d : date, date → integer,
+d : date, date → integer,
m
: interval, . . . , interval → TE type,
int
m
int : interval, . . . , interval → interval,
m
: TE type, . . . , TE type → TE type,
TE
m
: TE type, . . . , TE type → TE type,
TE
−TE : TE type, . . . , TE type → TE type,
+TE : TE type, . . . , TE type → TE type,
firstTE : TE type → interval,
lastTE : TE type → interval,
min durationTE : TE type → interval,
max durationTE : TE type → interval }
PREDTDT =
PREDDT ∪
{ <d , >d , ≤d , ≥d , =d , =d : date, date,
beforeint , afterint , duringint , superiorint ,
equivalentint , adjacentint , overlapint : interval, interval,
beforeTE , afterTE , duringTE , superiorTE ,
equivalentTE , adjacentTE , overlapTE : TE type, TE type,
∈TE : intervalTE type }
Zu den Sorten, Operationen und Prädikaten im einzelnen:
48
3.3. TEER–Standarddatentyp–Signatur
ISORT (date) := Menge aller Kalenderdaten.
Diese Menge enthält ein Element t0 , das den Entstehungszeitpunkt der Datenbank beschreibt, ein Element tnow , das den aktuellen Zeitpunkt angibt, ein Element t∞ , das die
Zukunftszeit repräsentiert und ein Element ⊥d .
Für diesen Abschnitt habe ein Datum das Format Tag–Monat–Jahr: tag , monat , jahr
mit tag ∈ {1, . . . , 31}, monat ∈ {1, . . . , 12}, jahr ∈ {0, . . . , 9999}.
ISORT (interval) := Menge aller Zeitintervalle.
Ein Intervall I ist eine Liste von Daten. Es wird durch ein Startdatum ts und ein Enddatum te repräsentiert, wobei gilt: ts , te ∈ date, ts ≤d te . Alle Zeitpunkte, die zwischen
diesen beiden Daten liegen, gehören zum Intervall. Ein Intervall ist somit eine Menge von
aufeinanderfolgenden Zeitpunkten: I = [ts , te ] = {ts , ts+1 , . . . , te } ⊆ date.
ISORT (TE type) := Menge aller temporalen Elemente.
Ein temporales Element TE wird erzeugt durch eine endliche Vereinigung nicht notwendigerweise disjunkter Zeitintervalle. Ein temporales Element ist eine Menge von Zeitpunkten, die dann durch disjunkte Intervalle dargestellt wird. Die Informationen über die
Ausprägungen der zur Erzeugung des TE type verwendeten Intervalle gehen verloren. Sei
Ii ∈ interval ein Intervall, dann gilt:
TE = I1 ∪ I2 ∪ . . . ∪ In
= {t | t ∈ date ∧ (t ∈ I1 ∨ . . . ∨ t ∈ In )}
Kalenderdatenoperationen
IOPNS (−d ) : Differenz von Kalenderdaten (in Tagen), wobei Schaltjahre hier nicht berücksichtigt werden.
Es seien t1 , t2 ∈ date mit t1 ≥d t2 , dann ist
t1 −d t2 := s1 +i s2
mit s1 = 365 ∗ h, wobei
falls monat1 ≥i monat2 und tag1 ≥i tag2
jahr1 −i jahr2 ,
h :=
jahr1 −i jahr2 −i 1, sonst
s2 :=
hi :=
falls monat1 ≥i monat2
h1 − h2 ,
, wobei
365 + h1 − h2 , falls monat1 <i monat2
31 +
30 +
28 + ti , i = 1, 2
j∈{1,3,5,7,8,10,12}
j≤monati −1
j∈{4,6,9,11}
j≤monati −1
j=2
monati =2
IOPNS (+d ) : Addition von Kalenderdaten (in Tagen), wobei Schaltjahre hier nicht berücksichtigt werden.
Es seien t1 , t2 ∈ date, dann ist
t1 +d t2 := s1 +i s2
mit
s1 = 365 ∗ h, wobei h := jahr1 +i jahr2 ,
s2 := h1 + h2 , wobei hi , i = 1, 2, wie oben definiert ist.
49
Kapitel 3. Ein graphisches temporales Datenmodell
Intervalloperationen
IOPNS ( m
int ) : m–stellige Vereinigung von Intervallen.
Es sei Ij ∈ interval, j = 1, . . . , m, dann ist
m
int
Ij :=
m
Ij := {t | t ∈ date und ∃ j mit t ∈ Ij , j = 1, . . . , m}.
j=1
IOPNS ( m
int ) : m–stelliger Durchschnitt von Intervallen.
Es sei Ij ∈ interval, j = 1, . . . , m, dann ist
m
int
Ij :=
m
Ij := {t | t ∈ date und t ∈ Ij ∀ j = 1, . . . , m}.
j=1
Operationen auf temporalen Elementen
) : m–stellige Vereinigung von temporalen Elementen.
IOPNS ( m
TE
Es sei TEj ∈ TE type, j = 1, . . . , m, dann ist
m
TE
TEj :=
m
TEj := {t | t ∈ date und ∃ j mit t ∈ TEj , j = 1, . . . , m}.
j=1
) : m–stelliger Durchschnitt von temporalen Elementen.
IOPNS ( m
TE
Es sei TEj ∈ TE type, j = 1, . . . , m, dann ist
m
TE
TEj :=
m
TEj := {t | t ∈ date und t ∈ TEj ∀ j = 1, . . . , m}.
j=1
IOPNS (−TE ) : Differenz für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann ist
TE1 −TE TE2 := {t | t ∈ date, t ∈ TE1 und t ∈ TE2 }.
IOPNS (+TE ) : Addition für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann ist
TE1 +TE TE2 := {t | t ∈ date, t ∈ TE1 oder t ∈ TE2 }.
IOPNS (firstTE ) : Ausgabe des maximalen Intervalls beginnend mit dem ersten Zeitpunkt
eines temporalen Elements.
Es sei TE ∈ TE type, dann ist
firstTE (TE) := [tp , tq ]
mit tp , . . . , tq ∈ TE und ∀ t =d tp ∈ TE : tp <d t
und ∀ t̃ >d tq ∃ t̂ ∈ TE mit tq <d t̂ <d t̃.
50
3.3. TEER–Standarddatentyp–Signatur
IOPNS (lastTE ) : Ausgabe des maximalen Intervalls endend mit dem letzten Zeitpunkt eines
temporalen Elements.
Es sei TE ∈ TE type, dann ist
lastTE (TE) := [tp , tq ]
mit tp , . . . , tq ∈ TE und ∀ t =d tq ∈ TE : tq >d t
und ∀ t̃ <d tp ∃ t̂ ∈ TE mit tp >d t̂ >d t̃.
IOPNS (min durationTE ) : Ausgabe der kürzesten maximalen Intervalle eines temporalen
Elements. Das Ergebnis dieser Funktion ist mengenwertig, da es mehrere Intervalle gleicher
kürzester maximaler Länge geben kann.
Es sei TE ∈ TE type, dann gilt
min durationTE (TE) := { [tp , tq ] | tp , . . . , tq ∈ TE
∧ ∃ [tp , tq+1 ] ⊆ TE ∧ ∃ [tp−1 , tq ] ⊆ TE
und ∀ [tk , tl ] mit tk , . . . , tl ∈ TE ist l −i k +i 1 ≥i q −i p }.
IOPNS (max durationTE ) : Ausgabe der längsten maximalen Intervalle eines temporalen
Elements. Das Ergebnis dieser Funktion ist mengenwertig, da es mehrere Intervalle gleicher
längster maximaler Länge geben kann.
Es sei TE ∈ TE type, dann gilt
max durationTE (TE) := { [tp , tq ] | tp , . . . , tq ∈ TE und ∀ [tk , tl ]
mit tk , . . . , tl ∈ TE ist l −i k +i p ≤i q −i p }.
Kalenderdatenprädikate
IPRED (<d ) : Kleiner–Relation für Kalenderdaten.
Es seien t1 , t2 ∈ date, dann gilt
t1 <d t2 ⇔ jahr1 <i jahr2
oder monat1 <i monat2 und jahr1 =i jahr2
oder tag1 <i tag2 und monat1 =i monat2 , jahr1 =i jahr2 .
IPRED (>d ) : Größer–Relation für Kalenderdaten.
Es seien t1 , t2 ∈ date, dann gilt
t1 >d t2 ⇔ jahr1 >i jahr2
oder monat1 >i monat2 und jahr1 =i jahr2
oder tag1 >i tag2 und monat1 =i monat2 , jahr1 =i jahr2 .
IPRED (=d ) : Gleich–Relation für Kalenderdaten.
Es seien t1 , t2 ∈ date, dann ist
t1 =d t2 ⇔ jahr1 =i jahr2 und monat1 =i monat2 und tag1 =i tag2 .
Entsprechend:
IPRED (≤d ) : Kleiner–gleich–Relation für Kalenderdaten.
51
Kapitel 3. Ein graphisches temporales Datenmodell
IPRED (≥d ) : Größer–gleich–Relation für Kalenderdaten.
IPRED (=d ) : Ungleich–Relation für Kalenderdaten.
Es seien t1 , t2 ∈ date, dann ist
t1 =d t2 ⇔ jahr1 =i jahr2 ∨ monat1 =i monat2 ∨ tag1 =i tag2 .
Intervallprädikate
Zur Interpretation der Prädikate auf Intervall–abhängigen Datentypen seien die Intervalle
I1 = [ts1 , te1 ], I2 = [ts2 , te2 ] ∈ interval gegeben.
IPRED (beforeint ) : liegt–vor–Relation für Intervalle.
[ts1 , te1 ] beforeint [ts2 , te2 ] ⇔ te1 <d ts2 .
IPRED (afterint ) : liegt–hinter–Relation für Intervalle.
[ts1 , te1 ] afterint [ts2 , te2 ] ⇔ ts1 >d te2 .
IPRED (duringint) : liegt–innerhalb–Relation für Intervalle.
[ts1 , te1 ] duringint [ts2 , te2 ] ⇔ ts1 ≥d ts2 ∧ te1 ≤d te2 .
IPRED (superiorint ) : liegt–über–Relation für Intervalle.
[ts1 , te1 ] superiorint [ts2 , te2 ] ⇔ ts1 ≤d ts2 ∧ te1 ≥d te2 .
IPRED (equivalentint ) : fällt–aufeinander–Relation für Intervalle.
[ts1 , te1 ] equivalentint [ts2 , te2 ] ⇔ ts1 =d ts2 ∧ te1 =d te2 .
Dieses Prädikat ist kommutativ.
IPRED (adjacentint ) : ist–benachbart–Relation für Intervalle.
[ts1 , te1 ] adjacentint [ts2 , te2 ] ⇔ ts2 −d te1 =d 1 ∨ ts1 −d te2 =d 1.
Dieses Prädikat ist kommutativ.
IPRED (overlapint ) : sich–überschneiden–Relation für Intervalle.
[ts1 , te1 ] overlapint [ts2 , te2 ] ⇔ ts1 ≤d te2 ∧ ts2 ≤d te1 .
Dieses Prädikat ist kommutativ.
52
3.3. TEER–Standarddatentyp–Signatur
Prädikate auf temporalen Elementen
IPRED (beforeTE ) : liegt–vor–Relation für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann
TE1 beforeTE TE2 ⇔ ∀ t1 ∈ TE1 ∀ t2 ∈ TE2 : t1 <d t2 .
IPRED (afterTE ) : liegt–hinter–Relation für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann
TE1 afterTE TE2 ⇔ ∀ t1 ∈ TE1 ∀ t2 ∈ TE2 : t1 >d t2 .
IPRED (adjacentTE ) : ist–benachbart–Relation für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann
TE1 adjacentTE TE2 ⇔
∃ t1 ∈ TE1 ∀ t̃ ∈ TE1 : t1 >d t̃ ∧ ∃ t2 ∈ TE2 ∀ t̂ ∈ TE2 : t2 <d t̂ ∧ t2 −d t1 =i 1
∨ ∃ t2 ∈ TE2 ∀ t̂ ∈ TE2 : t2 >d t̂ ∧ ∃ t1 ∈ TE1 ∀ t̃ ∈ TE1 : t1 <d t̃ ∧ t1 −d t2 =i 1.
Dieses Prädikat ist kommutativ.
Durch Mengenvergleiche induzierte Prädikate:
IPRED (duringTE ) : liegt–innerhalb–Relation für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann
TE1 duringTE TE2 ⇔ TE1 ⊆ TE2 .
IPRED (superiorTE ) : liegt–über–Relation für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann
TE1 superiorTE TE2 ⇔ TE1 ⊇ TE2 .
IPRED (equivalentTE ) : fällt–aufeinander–Relation für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann
TE1 equivalentTE TE2 ⇔ TE1 = TE2 .
Dieses Prädikat ist kommutativ.
IPRED (overlapTE ) : sich–überschneiden–Relation für temporale Elemente.
Es seien TE1 , TE2 ∈ TE type, dann
TE1 overlapTE TE2 ⇔ TE1 ∩ TE2 = ∅.
Dieses Prädikat ist kommutativ.
IPRED (∈TE ) : ist–Intervall–von–Prädikat für temporale Elemente.
Es sei I = [ts , te ] ∈ interval und TE ∈ TE type, dann ist
I ∈TE TE ⇔ ts , te ∈ TE ∧ ∀ t ts ≤ t ≤ te : t ∈ TE.
53
Kapitel 3. Ein graphisches temporales Datenmodell
Beispiel 3.1
In dem folgenden Beispiel werden einige der oben definierten Operationen und Prädikate
auf temporalen Elementen graphisch dargestellt. Dabei wird ein temporales Element durch
Angabe mehrerer Intervalle dargestellt.
1. firstTE (TE), lastTE (TE) :
Das temporale Element TE ⊆ [tk , tl ] sei durch die Intervalle Ij , j = 1, . . . , 5, gegeben, die wie folgt angeordnet sind:
I4
I1
I5
I2
I3
T
tk
tl
firstTE (TE) = I4 , da I4 das maximale Intervall ist, daß zum Zeitpunkt tk beginnt.
lastTE (TE) = I5 , da I5 das maximale Intervall ist, daß zum Zeitpunkt tl endet.
2. TE1 beforeTE TE2 :
TE1
TE2
T
3. TE1 afterTE TE2 :
TE1
TE2
T
54
3.3. TEER–Standarddatentyp–Signatur
4. TE1 adjacentTE TE2 :
TE1
TE2
T
5. TE1 duringTE TE2 :
TE1
TE2
T
6. TE1 superiorTE TE2 :
TE1
TE2
T
7. TE1 equivalentTE TE2 :
TE1
TE2
T
55
Kapitel 3. Ein graphisches temporales Datenmodell
8. TE1 overlapTE TE2 :
TE1
TE2
T
3.4
Lineare Syntax der TEER–Standarddatentyp–
Signatur
In diesem Abschnitt ist eine lineare Syntax der im vorherigen Kapitel definierten Datentypen und Prädikate angegeben. Die Angaben beschränken sich auf die später benötigten
Ausdrücke.
Formale, syntaktische Definitionen werden in der erweiterten Backus–Naur–Form (EBNF)
angegeben. Die Grundzüge dieser Notation werden zunächst beschrieben.
α, β seien Ausdrücke in EBNF.
• Terminalsymbole werden in Anführungszeichen "
" eingeschlossen.
• [α] bedeutet, daß α einmal oder keinmal auftreten darf.
• [α]∗ bedeutet, daß α beliebig oft auftreten darf.
• [α]+ bedeutet, daß α beliebig oft auftreten darf, aber mindestens einmal auftreten
muß.
• α | β bedeutet, daß entweder α oder β auftreten muß.
Die lineare Syntax der Datentypen und Prädikate ist wie folgt gegeben:
• Zahlausdruck:
integer ::= [ digit ]+
number ::= [ digit ]+ "."[ digit ]+
digit ::= "0" | "1" | ...| "9"
• Zeichenkette:
string ::= alphanum
alphanum ::= [ char digit expr ]+
char ::= "a" | ...| "z" | "A" | ...| "Z" | " "
char digit expr ::= char | digit
56
3.5. Transformation des TEER–Modells in das Relationenmodell
• Zeitintervall:
interval ::= "[" time expr "," time expr "]"
time expr ::= "null" | "now" | "infinity" | date
date ::= [ digit ] digit "/" [ digit ] digit "/"
[ digit digit ] digit digit
• temporales Element:
temp elem ::= interval | interval union
interval union ::= "{" interval [ "," interval ]+ "}"
• Prädikat:
temp pred ::=
"before" | "after" | "during" | "superior" |
"equivalent" | "adjacent" | "overlap"
pred ::= "=" | ">" | "≥" | "<" | "≤" | "="
• TEER–Modell:
teer ::= ent name [ abbrev ] [ "," ent name [ abbrev ] ]∗
[ "," rel name [ abbrev ] ]∗
[ "," typ name ]∗
[ "," comp name ]∗
ent name ::= string
rel name ::= string
typ name ::= string
comp name ::= string
abbrev ::= string
• Attributwert:
value ::= "’" string "’" | number
3.5
Die Testdatenbank – Transformation des TEER–
Modells in das Relationenmodell
Wie bereits in Kapitel 2.6.2 erklärt, ist es nicht Ziel dieser Arbeit eine Daten–Definitions–
und Manipulationssprache für eine temporale Datenbank zu entwerfen, sondern die eindeutige Definition einer graphischen Anfragesprache an eine solche Datenbank zu geben.
Um aber eine Anfragesprache benutzen zu können, muß eine entsprechende Datenbank
existieren. In diesem Abschnitt werden daher die auftretenden Probleme bei der Definition einer temporalen Datenbank in ORACLE, ein auf dem Relationenmodell basierendes
Datenbankmanagementsystem, nur aufgezeigt. Die Grundlage für spätere graphische Anfragen bildet das eingeschränkte Konzern-Schema in Abbildung 3.2. Für dieses Schema
werden die benötigten Tabellen zusammen mit Testdaten angegeben. Die entsprechenden SQL create table–Anweisungen sowie die zur Datenerzeugung benutzten insert–
Befehle sind in Anhang A aufgeführt.
57
Kapitel 3. Ein graphisches temporales Datenmodell
Darstellung der Zeit
Für die Implementierung der temporalen Testdatenbank wird ein temporales Element auf
ein Intervall eingeschränkt. Ein temporales Element ist nach Definition durch eine endliche Anzahl von Intervallen darstellbar. Für jedes dieser Intervalle sind in einer Datenbank
die Anfangs– und Endzeit abzuspeichern. Zur Abspeicherung dieser Daten werden zwei
Tabellenspalten gebraucht. Ist die Anzahl darzustellender Intervalle für alle Entities eines
Entitytyps bekannt und nicht sehr groß, können die pro Intervall benötigten Spalten direkt
an die Entitytyp–darstellende Tabelle angefügt werden. Ab einer bestimmten Anzahl von
benötigten Spalten zur Darstellung des temporalen Elements ist dieser Weg nicht mehr
sinnvoll, da die erzeugten Tabellen sehr groß und damit bei der Ergebnisausgabe auf dem
Bildschirm auch unübersichtlich werden. Eine andere Möglichkeit zur Implementierung
der temporalen Elemente ist das Anlegen einer speziellen Zeittabelle, die aus drei Spalten
besteht. Bei der Transformation des TEER–Modells in das Relationenmodell wird jeder
Entitytyp darstellenden Tabelle eine Extraspalte für Surrogatwerte hinzugefügt. Diese
Spalte ist so angelegt, daß jeder Tabelleneintrag eindeutig identifizierbar ist. Über dieses
Surrogat kann dann eine Verbindung zu der zusätzlich angelegten Tabelle hergestellt werden, in der das Surrogat zusammen mit den beiden Intervalldaten abgespeichert ist. Das
Surrogat ist dann ein zeitinvarianter Wert, der in der extra angelegten Tabelle mehrfach
vorkommen darf. Die Kombination aus Surrogat und Intervalldaten muß nicht eindeutig sein, da der Wert eines Attributs innerhalb eines Zeitintervalls nicht eindeutig sein
muß. Als Beispiel sei die Telefonnummer eines Angestellten genannt. Die Zeittabellen der
Datentypabhängigkeiten–darstellenden Tabellen sind nicht auf dreispaltige Tabellen beschränkbar. An Stelle eines einzigen Surrogats ist der Surrogatschlüssel der partizipierenden Entitytypen, also der Schlüssel der Datentypabhängigkeiten darstellenden Tabellen,
abzuspeichern. Vergleicht man diese beiden Implementierungsmöglichkeiten ist offensichtlich, daß der erste Weg, d.h. die Beschränkung des temporalen Elements von vornherein
auf eine feste Anzahl darstellender Intervalle, der einfachere ist. Es sind deutlich weniger
Tabellen zu erzeugen und Daten zu generieren. Um die Funktionalität der Sprache zu
testen, ist die maximale Beschränkung des temporalen Elements auf ein Intervall ausreichend. Das bedeutet, daß sämtliche Tabellen um zwei Spalten vom ORACLE-Datentyp
date zu erweitern sind. Diese Spalten bekommen die festen Namen vt from und vt to
zugewiesen. vt steht für Valid–Time, die die in dieser Version des TEER–Modells unterstützte Zeitart ist (vgl. 3.1). Die Spalte vt from enthält die Anfangszeit, vt to die
Endzeit des Gültigkeitsintervalls eines Tabelleneintrags.
58
3.5. Transformation des TEER–Modells in das Relationenmodell
Firmenname
FIRMA
⊇
(1,*)
ZULIEFERFIRMA
(1,1)
gehört
zu
abt f
(1,*)
liefert
AngName
(1,*)
PersNr
Gehalt
VORPRODUKT
.
ANGESTELLTER
Position
⊇
AbtLeiter:
p abt
.
produziert
PRODUKT
ChargenNr
(1,1)
abt p
ABTEILUNG
(1,*)
.
Mitarbeiter: set
AbtName
Auslastung
ProdName
StPreis
Abbildung 3.2: Ausschnitt des Konzern–Schemas
59
Kapitel 3. Ein graphisches temporales Datenmodell
Die Einschränkung des temporalen Elements eines beliebigen Entities auf ein Intervall
bedeutet insbesondere, daß das temporale Element des Surrogat–Attributs, welches nach
Definition jedes Entity einer temporalen Datenbank besitzt (vgl. 3.1), ebenfalls auf ein
Intervall eingeschränkt wird. Dieses Surrogat ist zeitinvariant. Es zeigt in einer Tabelle
an, welche Einträge zu einem Entity gehören. Dieses Surrogat der temporalen Datenbank
ist nicht identisch mit den zur Transformation vom EER–Modell in das Relationenmodell
einzuführenden Surrogaten (vgl. 2.6.2). Die dort besprochenen Surrogate sind temporal
abhängig und dienen dazu, Verbindungen zwischen verschiedenen Tabelleneinträgen anzuzeigen. Zur besseren Unterscheidung dieser Surrogate wird das erstere im folgenden als
zeitinvariantes Surrogat, das bei der Transformation einzuführende als temporal abhängiges Surrogat bezeichnet. Die Beschränkung auf ein Intervall zieht nach sich, daß sich die
Attribute eines Entities innerhalb seiner Lebenszeit verändern können, es somit zu mehreren Tabelleneinträgen ein Entity betreffend kommt, wobei sich die zugehörigen Intervalle
aber nicht überschneiden dürfen. Diese Eigenschaft wird im folgenden als temporale Korrektheit des temporalen Elements eines Entities bezeichnet.
Beispiel 3.2
Für ein ABTEILUNG–Entity e seien die folgenden Attributwerte gegeben:
Surrogat(e) = {[1/1/85, t∞ ] → surrogate id}
AbtName(e) = {[1/1/85, t∞ ] → Montage}
AbtLeiter(e) = {[1/1/85,31/12/90] → Müller,
[1/1/91,30/4/91] → Maier
[1/5/91,31/5/91] → Schulz
[1/6/91,31/12/95] → Hinz}
Das angegebene Surrogat ist das zeitinvariante Surrogat. In einer relationalen Datenbank
werden die obigen Daten in zwei Tabellen abgespeichert, da das Attribut AbtLeiter eine
Komponente ist. Die Namen sowie zugehörige Daten der Abteilungsleiter sind in einer
Tabelle Angestellter zu finden. An Stelle des Namens AbtLeiter wird in der Tabelle Abteilung ein referenzierender temporalabhängiger Surrogatwert eingetragen.
temporales zeitinvariantes
Surrogat
Surrogat
5000
995000
5012
995000
5034
995000
5222
995000
AbtLeiter
AbtName (Surrogatwert)
Montage
7018
Montage
7099
Montage
7002
Montage
7111
vt from
01-01-1985
01-01-1991
01-06-1991
01-05-1991
vt to
31-12-1990
30-04-1991
31-12-1995
31-05-1991
Tabelle 3.1: Das ABTEILUNG–Entity e
Auf die unterschiedlichen Surrogate und ihre Bedeutung sowie sich daraus ergebende
Schlüsselbedingungen für die Tabellen wird im nächsten Abschnitt eingegangen.
60
3.5. Transformation des TEER–Modells in das Relationenmodell
Surrogat– und Schlüsselattribute
Bei der Transformation eines TEER–Modells in das Relationenmodell sind, analog zur
Transformation eines EER–Modells, Surrogate einzuführen, so daß Datenabhängigkeiten
ausdrückbar werden. Diese Surrogate sind innerhalb von Entitytyp darstellenden Tabellen
als primary keys anzulegen. Zusätzlich benötigen diese Tabellen eine Spalte, die den temporalen Surrogatwert enthält (vgl. Beispiel 3.2). Diese Tabellenspalte ist als not null–Wert
anzulegen. Die Überwachung der Korrektheit des temporalen Elements ist innerhalb der
Tabellendefinition nicht ausdrückbar. Dafür sind spezielle Kontrollstrukturen anzulegen,
sogenannte Trigger. Diese überprüfen nach jeder Transaktion, ob der erreichte Zustand die
gegebenen Integritätsbedingungen erfüllt. Transaktionen sind das Einfügen, Löschen und
Verändern von Tabelleneinträgen. Die Schlüsselattribute eines Entitytyps dürfen nicht,
wie bei der Transformation eines EER–Modells, als unique–Werte angelegt werden, da innerhalb einer temporalen Datenbank update–Operationen auf Schlüsselattribute erlaubt
sind. Eine update–Operation auf einen Eintrag einer temporalen Datenbank bedeutet
nicht, wie in nichttemporalen Datenbanken üblich, daß der Eintrag entsprechend den angegebenen Werten verändert wird. Es wird vielmehr ein Eintrag den angegebenen Änderungen entsprechend erzeugt und der vt from– bzw. vt to–Wert des zu verändernden
Eintrags wird neu gesetzt.
Tabellen, die Datenabhängigkeiten darstellen, enthalten kein temporales Surrogat. Sie sind
durch die nichttemporalen Surrogate mit den zugehörigen Entitytyp–Tabellen verknüpft.
Der Schlüssel einer solchen Tabelle wird aber nicht nur von den beteiligten Surrogaten
gebildet. In diesen Fällen ist der Gültigkeitszeitraum, d.h. die Werte vt from und vt to,
zum Schlüssel hinzuzunehmen. Da Relationships, Komponenten und Ausgangstypen von
Typkonstruktionen in der temporalen Hierarchie unterhalb zugehöriger Entities liegen,
können die Gültigkeitszeitintervalle in den Datenabhängigkeiten ausdrückenden Tabellen
kleiner sein oder sich auch auf mehrere disjunkte Intervalle aufteilen. Zu Überwachung
dieser Disjunktheit und der temporalen Hierarchie werden ebenfalls Trigger benötigt. Die
Tabellen 3.2 und 3.3 fassen die Unterschiede bei den Transformationen von EER– bzw.
TEER–Modellen in das Relationenmodell zusammen.
EER–Modell → Relationenmodell
eindeutige
Werte
Schlüssel
keine
Nullwerte
Schlüsselattribute
Surrogat
obligatorische Attribute
TEER–Modell → Relationenmodell
Schlüsselattribute in Verbindung
mit vt from und vt to
Surrogat
obligatorische Attribute
Schlüsselattribute
Tabelle 3.2: Entitytyp–Tabellen
EER–Modell → Relationenmodell
Schlüssel
Surrogate der beteiligten Entities
TEER–Modell → Relationenmodell
Surrogate der beteiligten Entities
zusammen mit vt from und vt to
Tabelle 3.3: Datenabhängigkeiten–darstellende Tabellen
61
Kapitel 3. Ein graphisches temporales Datenmodell
Die folgenden Tabellen bilden die Testdatenbank. Für jede Tabelle wird der zugehörige
SQL create–Befehl angegeben. Die zugehörigen insert–Anweisungen sind in Anhang A
zu finden. Sämtliche Surrogate sind als number–Werte angelegt. Das Datumsformat ist auf
4–stellige Jahresangaben erweitert worden. Der Entstehungszeitpunkt t0 dieser Datenbank
ist der 01.01.1985, t∞ wird durch das Datum 31.12.9999 dargestellt. Zeitinvariante Surrogate werden in Spalten mit dem festen Namen t inv$ abgespeichert, temporal abhängige
Surrogate in Spalten mit dem Namen E$.
Die Tabelle Firma
create table Firma (
Firma$ number not null,
t_inv$ number not null,
Firmenname varchar2(15) not null,
vt_from date not null,
vt_to date not null,
primary key (Firma$));
Firma$
1000
1001
1004
1005
1006
t inv$
991000
991001
991004
991005
991006
Firmenname
Prima
Trumpf
Zonk
Flop
Top
Anschrift
11000
11001
11004
11005
11006
Tabelle 3.4: Firma
Die Tabelle Angestellter
create table Angestellter (
Angestellter$ number unique,
t_inv$ number not null,
AngName char(15) not null,
PersNr integer not null,
Gehalt number not null,
Position char(20) not null,
vt_from date not null,
vt_to date not null,
primary key (Angestellter$));
62
vt from
01-01-1985
01-07-1985
01-09-1987
01-01-1997
01-01-1998
vt to
31-12-9999
31-12-1990
31-08-1997
31-07-1997
31-12-9999
t inv$
997000
997000
997010
997010
997015
997020
997025
997030
997035
997040
997045
997050
997050
AngName PersNr Gehalt
Hinz
312
5300
Hinz
312
6300
Mueller
234
5800
Mueller
234
6400
Schmidt
813
4000
Schiller
921
4000
Vogel
789
3800
Klein
909
4500
Gross
877
5000
Maier
987
7500
Schulz
654
6400
Kunz
717
8000
Kunz
717
8500
Position
AbtLeiter
AbtLeiter
AbtLeiter
AbtLeiter
Monteur
Monteur
Maler
Techniker
stellv. AbtLeiter
AbtLeiter
AbtLeiter
AbtLeiter
AbtLeiter
vt from
01-03-1987
01-01-1990
01-01-1985
01-01-1991
01-01-1985
01-01-1985
01-01-1990
01-01-1987
01-01-1985
01-04-1990
01-04-1989
01-07-1990
01-01-1996
Tabelle 3.5: Angestellter
vt to
31-12-1989
31-12-9999
31-12-1990
31-12-1995
31-12-1987
31-12-1995
31-12-9999
31-12-1990
31-12-9999
30-09-1995
31-12-9999
31-12-1995
31-12-9999
3.5. Transformation des TEER–Modells in das Relationenmodell
63
Ang$
7001
7002
7018
7019
7020
7025
7030
7035
7040
7099
7111
7987
7988
Kapitel 3. Ein graphisches temporales Datenmodell
Die Tabelle Abteilung
create table Abteilung (
Abteilung$ number unique,
t_inv$ number not null,
AbtName varchar2(15) not null,
AbtLeiter number not null references Angestellter(Angestellter$),
vt_from date not null,
vt_to date not null,
primary key (Abteilung$));
Abteilung$
5000
5011
5012
5034
5222
5333
t inv$
995000
995010
995000
995000
995000
995010
AbtName
Montage
Lackiererei
Montage
Montage
Montage
Lackiererei
AbtLeiter
7018
7987
7099
7002
7111
7018
vt from
01-01-1985
01-01-1996
01-01-1991
01-06-1991
01-05-1991
01-01-1991
vt to
31-12-1990
31-12-9999
30-04-1991
31-12-1995
31-05-1991
31-12-1995
Tabelle 3.6: Abteilung
Die Tabelle Produkt
create table Produkt (
Produkt$ number unique,
t_inv$ number not null,
ChargenNr number not null,
ProdName varchar2(25) not null,
StPreis number not null,
vt_from date not null,
vt_to date not null,
primary key (Produkt$));
Produkt$
4000
4001
4005
4010
4015
4020
4025
4030
4035
4040
t inv$ ChargenNr
994000
55778
994000
55778
994005
56889
994010
57911
994015
98102
994020
75432
994020
75432
994030
77641
994035
12341
994035
12341
ProdName StPreis
Rennrad
1200
Rennrad
1100
Rennrad
1150
Rennrad
1000
Rennrad
1050
Rennrad
1400
Rennrad
1700
Rennrad
1800
Rennrad
1600
Rennrad
1400
Tabelle 3.7: Produkt
64
vt from
01-01-1985
01-01-1987
01-01-1990
01-01-1991
01-09-1989
01-01-1985
01-01-1987
01-01-1990
01-01-1992
01-01-1996
vt to
31-12-1986
31-08-1987
30-06-1990
31-12-1992
31-12-9999
31-12-1986
31-12-1987
31-12-1992
31-12-1995
31-12-9999
3.5. Transformation des TEER–Modells in das Relationenmodell
Die Tabelle Mitarbeiter
create table Mitarbeiter (
Abteilung$ number not null references Abteilung(Abteilung$),
Mitarbeiter number not null references Angestellter(Angestellter$),
vt_from date not null,
vt_to date not null);
Abteilung$ Mitarbeiter
5000
7020
5000
7025
5000
7030
5000
7035
5000
7040
5011
7025
5012
7025
5034
7025
5222
7025
vt from
01-01-1985
01-01-1985
01-01-1990
01-01-1987
01-01-1985
01-01-1995
01-01-1991
01-06-1991
01-05-1991
vt to
31-12-1987
31-12-1990
31-12-9999
31-12-1990
31-12-1987
31-12-1995
30-04-1991
31-12-1994
31-05-1991
Tabelle 3.8: Mitarbeiter
Die Tabelle Zulieferfirma
create table Zulieferfirma (
Zulieferfirma$ number unique,
t_inv$ number not null,
Firma$ number not null references Firma(Firma$),
vt_from date not null,
vt_to date not null,
primary key (Zulieferfirma$));
Zulieferfirma$
2000
2001
2010
2011
t inv$ Firma$
992000
1000
992010
1000
992020
1004
992030
1001
vt from
01-01-1985
01-01-1991
01-09-1987
01-01-1990
Tabelle 3.9: Zulieferfirma
Die Tabelle Vorprodukt
create table Vorprodukt (
Vorprodukt$ number unique,
t_inv$ number not null,
65
vt to
31-08-1987
31-12-1992
31-08-1997
30-06-1990
Kapitel 3. Ein graphisches temporales Datenmodell
Produkt$ number not null references Produkt(Produkt$),
vt_from date not null,
vt_to date not null,
primary key (Vorprodukt$));
Vorprodukt$
3000
3001
3002
3003
3004
t inv$ Produkt$
993000
4010
993010
4015
993020
4005
993030
4000
993030
4001
vt from
01-01-1991
01-09-1989
01-01-1990
01-01-1985
01-01-1987
vt to
31-12-1992
31-12-9999
30-06-1990
31-12-1986
31-08-1987
Tabelle 3.10: Vorprodukt
Die Tabelle gehoert zu
create table gehoert_zu (
Firma$ number not null references Firma(Firma$),
Abteilung$ number not null references Abteilung(Abteilung$),
vt_from date not null,
vt_to date not null,
primary key (Firma$, Abteilung$, vt_from, vt_to));
Firma$ Abteilung$
1000
5000
1000
5011
1000
5012
1000
5034
1000
5222
1000
5333
1005
5011
vt from
01-01-1985
01-01-1985
01-01-1991
01-06-1991
01-05-1991
01-01-1991
01-01-1997
vt to
31-12-1990
31-12-1990
30-04-1991
31-12-1995
31-05-1991
31-12-1996
31-07-1997
Tabelle 3.11: gehoert zu
Die Tabelle produziert
create table produziert (
Produkt$ number not null references Produkt(Produkt$),
Abteilung$ number not null references Abteilung(Abteilung$),
Auslastung number not null,
vt_from date not null,
vt_to date not null,
primary key (Produkt$, Abteilung$, vt_from, vt_to));
66
3.5. Transformation des TEER–Modells in das Relationenmodell
Produkt$ Abteilung$ Auslastung
4000
5000
75
4005
5000
82
4010
5000
89
4010
5012
73
4010
5034
70
4010
5222
69
4015
5000
72
4015
5011
91
4015
5012
73
4015
5034
75
4015
5222
40
vt from
01-01-1985
01-01-1990
01-01-1990
01-01-1991
01-06-1991
01-05-1991
01-09-1989
01-01-1996
01-01-1991
01-06-1991
01-05-1991
vt to
31-12-1986
30-06-1990
31-12-1990
30-04-1991
31-12-1992
31-05-1991
31-12-1990
31-12-9999
30-04-1991
31-12-1995
31-05-1991
Tabelle 3.12: produziert
Die Tabelle liefert
create table liefert (
Zulieferfirma$ number not null references Zulieferfirma(Zulieferfirma$),
Vorprodukt$ number not null references Vorprodukt(Vorprodukt$),
vt_from date not null,
vt_to date not null,
primary key (Zulieferfirma$, Vorprodukt$, vt_from, vt_to));
Zulieferfirma$ Vorprodukt$
2000
3003
2000
3004
2001
3000
2010
3001
2011
3002
vt from
01-01-1985
01-01-1987
01-01-1991
01-09-1989
01-01-1990
Tabelle 3.13: liefert
67
vt to
31-12-1986
31-08-1987
31-12-1992
31-08-1997
30-06-1990
Kapitel 3. Ein graphisches temporales Datenmodell
68
Kapitel 4
Die TEER–Anfragesprache
4.1
Eine graphische temporale Anfragesprache
Der Sinn einer graphischen Datenbank–Anfragesprache ist, die Nutzung der Datenbank
auch Anwendern zu ermöglichen, die keine speziellen fachlichen Vorkenntnisse besitzen. Die Basis der graphischen TEER–Datenbank–Anfragesprache bildet ein TEER–
Diagramm. Dieses Diagramm kann mit Hilfe eines Editors in eine Anfrage transformiert
werden, die einen zeitlichen Bezug hat. Die zugrundeliegende Datenbank muß das dargestellte Datenmodell mit zugehörigen Daten enthalten. Im folgenden werden zunächst
Konstrukte der TEER–Anfragesprache vorgestellt. Anschließend werden der Anfrageeditor und die Formulierung von Anfragen beschrieben. Desweiteren wird eine lineare Syntax
der graphischen Elemente definiert. In Anhang B ist diese in übersichtlicher Form zu finden. Die TEER–Anfragesprache basiert auf einem Vorschlag in [KG95].
Für Datentypen und darauf definierte Prädikate gelte die lineare Syntax aus Kapitel 3.4.
Alle Beispiele dieses Kapitels beziehen sich auf das temporale Konzern–Schema aus Kapitel 3.2, das in Abbildung 2.1 dargestellt ist. In den Beispielanfragen wird durchgehend das
temporale Prädikat during benutzt. Bei der umgangssprachlichen Formulierung dieser graphischen Anfragen ist versucht worden auszudrücken, daß das Prädikat during nur dann
den Wert true zurückgibt, wenn eine totale liegt–in Beziehung gegeben ist. Das bedeutet,
daß during überlappende Intervalle nicht als ineinanderliegende Intervalle erkennt“.
”
Im Anhang D wird das Programm TEER–Anfrage–Editor vorgestellt, daß die graphische
Formulierung von Anfragen ermöglicht. Diese Implementierung eines Anfrageeditors realisiert die in diesem Kapitel vorgeschlagenen Gestaltungsmöglichkeiten teilweise in anderer
Form. An Stelle der graphischen Unterscheidung von Elementen durch verschiedene Formen bzw. Liniendarstellungen nutzt der TEER–Anfrage–Editor die Möglichkeit der farblichen Unterscheidung und stellt insbesondere keine gestrichelten Linien dar.
4.1.1
Konstrukte der TEER–Anfragesprache
Mit Hilfe einer Anfrage an eine nichttemporale Datenbank werden Entities auf Grund boolescher Prädikate selektiert. Diese Prädikate werden auf die Attributwerte eines Entities
oder auf die Attributwerte von zueinander in Beziehung stehenden Entities angewendet.
69
Kapitel 4. Die TEER–Anfragesprache
Als Ergebnis einer solchen Anfrage werden dann ausgewählte Attribute und Relationships
jedes selektierten Entities ausgegeben. In einer temporalen Datenbank dagegen muß sich
eine Selektionsbedingung nicht nur auf Attributwerte beziehen, sondern kann auch temporale Bedingungen beinhalten. Zusätzlich besteht die Möglichkeit, die gesamte Historie
der Attribute oder Relationships eines selektierten Entities auszugeben oder die Ausgabe auf einen bestimmten Zeitraum einzuschränken. Zur Konstruktion solcher temporaler
Anfragen werden neue Anfrage–Konstrukte benötigt. Dazu werden zunächst die Konzepte des temporalen booleschen Ausdrucks, des Gültigkeitszeitraums einer Bedingung, der
temporalen Selektion sowie der temporalen Projektion definiert.
Temporaler boolescher Ausdruck
Ein temporaler boolescher Ausdruck stellt eine Bedingung an die Attribute und Relationships eines Entities dar. Die Anwendung einer booleschen Bedingung b auf ein Entity e
bedeutet eine temporale Zuordnung
b(e) : TE(e) → {true, false, ⊥b }.
Für die Formulierung eines temporalen booleschen Ausdrucks bool expr bzgl. der Attributtypen attr name gilt die nachfolgende Syntax. Die Attributtypen können verschieden
sein. Sie müssen aber entweder dem Entitytypen angehören oder einem der Relationshiptypen, die mit dem Entitytyp verbunden sind. Die Bezeichnung attr name repräsentiert
die Namen von Attributtypen. Existieren Attributtypen gleichen Namens verschiedener
Entity– oder Relationshiptypen, kann dem Typnamen eine Abkürzung abbrev zugeordnet
werden. Der Attributtyp wird dann mit abbrev"."attr name angegeben.
bool expr ::= "(" attr expr [ bool op attr expr ]∗ ")"
attr expr ::= [ "not" ] attr cond
attr cond ::= attr name pred value
bool op ::= "and" | "or"
Beispiel 4.1
Der boolesche Ausdruck Position = ’Monteur’ and Gehalt = 3000 liefert, bezogen auf
das ANGESTELLTER–Entity, die folgende Menge temporaler Zuordnungen:
{ [1/7/90, 30/9/90] → false,
[1/10/90, 31/3/91] → false,
[1/4/91, 31/12/91] → false,
[1/1/92, 31/12/94] → false,
[1/1/95, 30/6/95] → false,
[1/7/95, 31/12/95] → true,
[1/1/96, 31/3/96] → false,
[1/4/96, 31/3/97] → true,
[1/4/97, tnow ] → false,
[1/10/97, 31/5/98] → false,
[1/6/98, t∞ ] → false }
70
4.1. Eine graphische temporale Anfragesprache
Gültigkeitszeitraum eines booleschen Ausdrucks
Der Gültigkeitszeitraum [[b]] eines booleschen Ausdrucks b(e) besteht aus temporalen Elementen. Diese temporalen Elemente gehören zu denjenigen Entities e, die auf Grund der
Bedingung b(e) selektiert werden. Somit ist der Gültigkeitszeitraum die Zeit, in der der
boolesche Ausdruck b(e) den Wert true annimmt.
Die Syntax eines Gültigkeitszeitraums eines booleschen Ausdrucks true time ist gegeben
durch:
true time ::= "[[" bool expr "]]"
Beispiel 4.2
Der Gültigkeitszeitraum der obigen booleschen Bedingung Position = ’Monteur’ and Gehalt = 3000 (siehe Beispiel 4.1) ist somit {[1/7/95, 31/12/95], [1/4/96, 31/3/97]}.
Temporale Selektion
Eine temporale Selektion vergleicht zwei temporale Elemente mit Hilfe eines beliebigen
Prädikats der Menge PREDTDT . Eines der beiden temporalen Elemente ist ein Gültigkeitszeitraum eines booleschen Ausdrucks. Das zweite temporale Element ist entweder
konstant oder das Ergebnis einer Unteranfrage.
Eine Kurznotation für eine temporale Selektion ist:
temp seltrue
time temp pred cal temp elem (typ),
wobei true time der Gültigkeitszeitraum eines booleschen Ausdrucks ist. cal temp elem
ist ein konstantes, direkt angegebenes temporales Element oder das Ergebnis einer Unteranfrage. temp pred ist eines der zugelassenen Prädikate. typ ist ein Bezeichner für einen
Entity– oder Relationshiptypnamen.
Beispiel 4.3
Die Selektion
tempsel[[(P osition= M onteur )
and (Gehalt=3000)]] ⊆[1/1/95,31/12/95]
(ANGEST ELLT ER)
liefert alle Entities, die im Jahr 95 Monteur waren und 3000 DM verdient haben. Diese
Bedingung wird für jedes einzelne ANGESTELLTER–Entity berechnet und liefert entweder eine true– oder eine false–Antwort. Alle Entities, deren Antwort true ist, werden
ausgegeben.
Die Syntax einer temporalen Selektion hat folgendes Aussehen:
temp sel ::= true time temp pred cal temp elem
cal temp elem ::= temp elem | get time
Die Syntax der Unteranfrage get time wird auf Seite 82 angegeben. Diese Möglichkeit
wird schon hier der Vollständigkeit wegen angegeben.
71
Kapitel 4. Die TEER–Anfragesprache
Temporale Projektion
Eine temporale Projektion wird auf ein TEER–Schema, d.h. auf eine Menge von Entity–,
Relationship– und Attributtypen, angewendet. Sie schränkt alle temporalen Zuordnungen
(Attribute und Relationships) für die im TEER–Schema vorkommenden Entities auf ein
temporales Element ein.
Die Notation einer Projektion ist gegeben durch:
temp projtemp
pred temp elem proj (teer),
wobei temp pred eines der Prädikate der Menge PREDTDT ist. temp elem proj ist ein temporales Element, das direkt angegeben wird und ein Gültigkeitszeitraum eines booleschen
Ausdrucks oder das Ergebnis einer Unteranfrage ist. teer ist das TEER–Schema.
Beispiel 4.4
Wird das ANGESTELLTER–Entity auf den Zeitraum [21/3/94,12/1/95] projiziert,
temp projduring
[21/3/94,12/1/95] (ANGESTELLTER),
werden die Attribute für dieses Entity auf die folgenden Werte eingeschränkt:
Surrogat(e) = {[21/3/94,12/1/95] → surrogate id}
AngName(e) = {[21/3/94,12/1/95] → Hans Müller}
PersNr(e) = {[21/3/94,12/1/95] → 123987}
Gehalt(e) = {[21/3/94,31/12/94] → 1500,
[1/1/95,12/1/95] → 2500}
Position(e) = {[21/3/94,31/12/94] → Lehrling,
[1/1/95,12/1/95] → Monteur}
Die Syntax einer temporalen Projektion ist folgende:
temp proj ::= teer temp pred temp elem proj
temp elem proj ::= temp elem | true time | "(" get time ")"
Der Bezeichner teer repräsentiert ein syntaktisch korrektes TEER-Diagramm.
Die Syntax der Unteranfrage get time ist auf Seite 82 zu finden.
4.1.2
Anfrageeditor
Das TEER–Diagramm, auf dem die TEER–Anfragesprache basiert, repräsentiert eine
Mini–Welt. Bei Anfragen diese Mini–Welt betreffend sind nicht unbedingt alle Entity–,
Relationship– und Attributtypen von Interesse, so daß eine Auswahlmöglichkeit bestehen
muß. Die zur Verfügung stehenden Operatoren werden in diesem Abschnitt vorgestellt.
Der Remove–Operator
Durch Löschen von Attribut–, Relationship– und Entitytypen, an denen der Benutzer
nicht interessiert ist, wird aus dem TEER–Diagramm ein Arbeitsdiagramm erzeugt.
72
4.1. Eine graphische temporale Anfragesprache
Der Duplicate–Operator
Ausschnitte des Arbeitsdiagramms können mit Hilfe des Duplicate–Operators kopiert
werden.
4.1.3
TEER–Datenbank–Anfragesprache
Die TEER–Anfragesprache ermöglicht nach Modellierung eines TEER–Diagramms im
Editor die graphische Formulierung von zeitlichen und nichtzeitlichen Bedingungen sowie
von Unteranfragen.
Ein TEER–Diagramm wird, falls nötig, zunächst durch wiederholtes Anwenden des
Remove–Operators in ein Arbeitsdiagramm umgewandelt. Wenn die Anfrage Unteranfragen enthalten soll, so muß der Duplicate–Operator auf den minimalen Teil des Diagramms
angewendet werden, der die betroffenen Entity–, Relationship– und Attributtypen enthält.
Als nächstes wird die Unteranfrage formuliert. Dieses entspricht der Formulierung einer
Anfrage, wie unten beschrieben, an den kopierten Diagrammteil. Da das Ergebnis dieser Unteranfrage für die Formulierung der übergeordneten Anfrage benötigt wird, muß
der sogenannte Query–result–link benutzt werden. Zunächst werden aber der Get– und
der Restrict–Operator eingeführt, mit deren Hilfe Elemente für eine Ergebnismenge ausgewählt und durch Bedingungen eingeschränkt werden können.
Der Restrict–Operator
Der Restrict–Operator ermöglicht es, boolesche Bedingungen für Attribute von Entity–
und Relationshiptypen anzugeben. Die Bedingungen werden in einer sogenannten condition box formuliert. Die logische UND–Verknüpfung der condition boxes ergibt den
Restrict–Operator. Dabei dürfen in einer condition box nur Bedingungen an die Attribute eines gemeinsamen Entity– oder Relationshiptyps formuliert werden. Durch eine
ungerichtete Kante ist die condition box mit dem zugehörigen Typ verbunden.
E
bool_expr
....
Abbildung 4.1: Beispiel einer condition box
Lineare Syntax des Restrict–Operators:
restrict attr ::= "(" bool expr ")" [ "and"
"(" bool expr")" ]∗
Der Get–Operator
Alle Attributtypen, deren Attributwerte als Anfrageergebnis ausgegeben werden sollen,
werden mit einem Stern (*) markiert. Die Zugehörigkeit der Attributtypen zu ein und
73
Kapitel 4. Die TEER–Anfragesprache
demselben Entity– oder Relationshiptyp wird hier nicht gefordert. Diese Operation entspricht somit einem linearen Befehl
get op ::= "get" attr list "from" teer
attr list ::= attr name [ "," attr name ]∗
Beispiel 4.5
Welche Produkte werden von der Abteilung ’Montage’ der Firma ’Prima’ produziert ?“
”
FIRMA
Firmenname = ’Prima’
gehört
zu
AbtName = ’Montage’
ABTEILUNG
produziert
*
ChargenNr
PRODUKT
*
ProdName
Der Query–result–link–Operator
Der Query–result–link kombiniert eine Anfrage mit einer Unteranfrage. Das Ergebnis der
Unteranfrage wird an eine explizit anzugebende Variable gebunden. Der Typ dieser Variablen ist entsprechend dem Typ des Unteranfrageergebnisses. Damit kann das Unteranfrageergebnis an die übergeordnete Anfrage weitergeleitet werden. Das Unteranfrageergebnis
kann aus einer Menge von Werten desselben Attributtyps bestehen. Die Variable wird in
der übergeordneten Anfrage direkt demjenigen Attributtyp der übergeordneten Anfrage
zugeordnet, der mit dem Ergebnis der Unteranfrage verglichen werden soll. Die Attributtypen der beiden Anfragen müssen dabei sortenmäßig zusammenpassen. Der anzugebende
Vergleichsoperator Θ setzt sich aus einem Operator θ ∈ {<, >, =, ≤, ≥, =} und einem der
Wörter all oder any zusammen. Bei der Verwendung von Θ = θall muß ein Ergebniswert
74
4.1. Eine graphische temporale Anfragesprache
den Vergleich θ mit allen Mengenelementen erfüllen. Bei der Benutzung von Θ = θany
reicht aus, wenn der Ergebniswert den Vergleich θ bezüglich eines Mengenelements erfüllt.
Graphisch wird die Weiterleitung des Unteranfrageergebnisses durch eine gerichtete Kante
zwischen den sortenmäßig passenden Attributtypen der Unteranfrage und der übergeordneten Anfrage dargestellt. Die Kante ist mit der Variablen beschriftet. Die Variable wird
dann in der Anfrage zur Formulierung von Bedingungen unter der Verwendung des Vergleichsoperators Θ weiterbenutzt.
Ej
Aj Θx
x
x := Ai
Ei
....
....
Unteranfrage
übergeordnete Anfrage
Abbildung 4.2: Der Query–result–link bzgl. Entity–Attributen
Die lineare Syntax des Query–result–link–Operators ist gegeben durch:
result link ::= attr name pred all any choice "(" get result ")"
all any choice ::= "all " | "any "
get result ::= get result op [ "restrict" restrict attr ]
get result op ::= "get" attr name "from" teer
Beispiel 4.6
Welche Personen verdienen mehr, als das Produkt ’Rennrad’ kostet ?“
”
AngName
PersNr
PRODUKT
StPreis =: x
x
*
*
*
ANGESTELLTER
Gehalt >all x
ProdName = ’Rennrad’
Der temporale Projektionsoperator
Der temporale Projektionsoperator ermöglicht die Einschränkung aller temporaler Zuordnungen (Attribute und Relationships) eines Entities auf einen bestimmten Zeitraum.
75
Kapitel 4. Die TEER–Anfragesprache
Dieser Operator wird auf ein TEER–Diagramm, also eine Gruppe von Entities, angewendet.
Entity–, Relationship– und Attributtypen, auf die eine temporale Projektion ausgeführt
werden soll, werden mit Hilfe eines gestrichelten Kastens umrandet. Ein Pfeil ordnet diesem Kasten das temporale Element temp elem proj zu. Dieser Pfeil wird mit dem Namen
des Prädikats temp pred beschriftet.
teer
temp_pred
temp_elem_proj
Abbildung 4.3: Die temporale Projektion temp projtemp
pred temp elem proj (teer)
Temporale Projektionen auf Unteranfragen oder Teile des Arbeitsdiagramms sind nicht
erlaubt. Das Verbot der temporalen Projektion auf Unteranfragen stellt sicher, daß die
durch die Projektion beschriebene temporale Einschränkung nur auf bereits durch den
Get–Operator ausgewählte Entities ausgeführt wird. Diese ausgewählten Entities erfüllen
bereits die mit Hilfe des Restrict–Operators formulierten Bedingungen. Die Aufgabe der
temporalen Projektion ist somit die Ausgabemenge auf einen Zeitraum einzuschränken.
Desweiteren muß sichergestellt sein, daß eine in teer formulierte Anfrage komplett innerhalb eines Zeitraums ausgewertet wird. Ansonsten ist es möglich, daß zwei durch ein
Relationship verbundene Entities in einem Ergebnistupel ausgegeben werden, aber nicht
im selben Zeitraum gültig sind. Projektionen auf Teile des Arbeitsdiagramms sind daher
nicht zulässig. Eine Projektion wird also immer auf das TEER–Schema teer angewendet,
auf das der Get–Operator angewendet wird. Die Angabe teer ist daher in der linearen
Syntax optional.
Die lineare Syntax einer temporalen Projektion ist gegeben durch:
temp proj ::= [ "(" teer ")" ] temp pred temp elem proj
76
4.1. Eine graphische temporale Anfragesprache
Beispiel 4.7
Wie teuer waren die Vorprodukte der Firma ’Prima’, die genau innerhalb des Zeitraums
”
vom 1/1/91 bis 31/12/91 produziert wurden ?“
Firmenname = ’Prima’
FIRMA
⊇
ZULIEFERFIRMA
during
[1/1/91, 31/12/91]
liefert
VORPRODUKT
⊇
PRODUKT
*
ChargenNr
*
*
ProdName
StPreis
Das Anfrageergebnis besteht aus denjenigen Datensätzen, die die Bedingungen des
Restrict–Operators zu bestimmten Zeitpunkten erfüllen. Ein solcher Zeitpunkt muß innerhalb des Zeitraums liegen, der durch das Prädikat temp pred und das temporale Element
temp elem proj spezifiziert wird.
Soll an Stelle eines festen, vom Benutzer angegebenem Zeitraums das Anfrageergebnis auf
einen von einer Bedingung abhängigen Zeitraum eingeschränkt werden, dem Gültigkeitszeitraum eines booleschen Ausdrucks, so ist dieses mit Hilfe des True–time–Operators
77
Kapitel 4. Die TEER–Anfragesprache
möglich. Die zu berechnenden Zeiträume werden mittels des temporalen Projektionsoperators in die Anfrage eingebunden. Dafür wird die dortige Zeitangabe durch den die
True–time bestimmenden Kasten ersetzt.
Der True–time–Operator
Der True–time–Operator ermöglicht die Bestimmung von Gültigkeitszeiträumen von booleschen Ausdrücken. Die Bedingungen dürfen dabei nur an einen einzelnen Entity– oder
Relationshiptyp gestellt werden. Daher sind die berechneten Zeiträume für jedes Entity
oder Relationship verschieden. Die Formulierung der Bedingungen geschieht in einem Kasten mit doppelten Seitenstrichen. Die lineare Syntax des True–time–Operators ist, wie
bereits definiert:
true time ::= "[[" bool expr "]]"
Zur Bestimmung von Zeiträumen, in denen Bedingungen von verschiedenen Entity– oder
Relationshiptypen erfüllt sein sollen, steht der Time–link–Operator (siehe S. 81) zur
Verfügung. Der True–time–Operator ist eine Abkürzung des Time–link–Operators für den
Fall, daß sich die zu erfüllenden Bedingungen nur auf einen Entity– oder Relationshiptyp
beziehen.
temp_pred
teer
bool_expr
Abbildung 4.4: Der True–time–Operator in Verbindung mit einer temporalen Projektion
Beispiel 4.8
Welche Produkte werden von welcher Abteilung genau in den Zeiträumen produziert, in
”
denen die Auslastung mindestens einer Abteilung über 80% liegt ?“
PRODUKT
ABTEILUNG
produziert
*
ProdName
during
Auslastung > 80
78
*
AbtName
4.1. Eine graphische temporale Anfragesprache
Bei der Bearbeitung dieser Anfrage wird auf jeden selektierten Datensatz eine Menge
von Zeitintervall projiziert. Diese Menge besteht aus denjenigen Zeiträumen, in denen
die Auslastung einer beliebigen Abteilung bei der Produktion eines beliebigen Produkts
größer als 80% ist.
Eine zeitliche Auswahl kann aber auch aufgrund temporaler Bedingungen an Attribute
getroffen werden. Dieses ermöglicht der temporale Selektionsoperator.
Der temporale Selektionsoperator
Mit Hilfe des temporalen Selektionsoperators werden Entities aufgrund temporaler Bedingungen an Attribute ausgewählt. Eine temporale Selektion wird nicht auf das gesamte
Arbeitsdiagramm angewendet, sondern nur auf einen Teil: denjenigen Entity– oder Relationshiptyp, zu dem die Attribute, auf die der True–time–Operator angewendet wird,
gehören. Graphisch hat eine temporale Selektion die Form:
temp_pred
E
bool_expr
cal_temp_pred
....
Abbildung 4.5: Die temporale Selektion temp seltrue
time temp pred cal temp elem (E)
Die lineare Syntax einer temporalen Selektion ist, wie bereits definiert:
temp sel ::= true time temp pred cal temp elem
79
Kapitel 4. Die TEER–Anfragesprache
Beispiel 4.9
Welche Angestellten arbeiten für wieviel Gehalt in derjenigen Abteilung, die innerhalb
”
des Zeitraums vom 1/1/91 bis 30/6/91 ’Montage’ hieß ?“
AngName
PersNr
*
*
*
ANGESTELLTER
Gehalt
AbtLeiter:
ABTEILUNG
Mitarbeiter: set
during
AbtName = ’Montage’
[1/1/91, 30/6/91]
Diese Anfrage liefert die Personalnummer, den Namen sowie das Gehalt aller Angestellten,
die jemals in der entsprechenden Abteilung gearbeitet haben, bzw. arbeiten werden. Soll
die Ergebnismenge auf einen bestimmten Zeitraum eingeschränkt werden, muß auf die
obige Anfrage 4.9 eine temporale Projektion angewendet werden.
80
4.1. Eine graphische temporale Anfragesprache
Beispiel 4.10
Welche Angestellten arbeiteten innerhalb des Zeitraums vom 1/1/95 bis 31/1/95 für wie”
viel Gehalt in derjenigen Abteilung, die innerhalb des Zeitraums vom 1/1/91 bis 30/6/91
’Montage’ hieß ?“
AngName
PersNr
*
*
*
ANGESTELLTER
Gehalt
AbtLeiter:
ABTEILUNG
Mitarbeiter: set
during
AbtName = ’Montage’
[1/1/91, 30/6/91]
during
[1/1/95, 31/1/95]
In der TEER–Anfragesprache existiert die Möglichkeit, Zeiträume als Anfrageergebnis auszugeben. Dieses ermöglicht der Time–link–Operator. Seine zweite Anwendungsmöglichkeit findet dieser Operator im Rahmen einer temporalen Projektion oder
Selektion. Hierbei wird das berechnete temporale Element nicht ausgegeben, sondern an
einer weitere Datenbankanfrage weitergeleitet.
Der Time–link–Operator
Mit Hilfe des Time–link–Operators wird ein temporales Element berechnet. Es wird entweder als Eingabe an eine übergeordnete Anfrage weitergeleitet oder direkt als Anfrageergebnis ausgegeben. Graphisch besteht dieser Operator aus einem gestrichelten Kasten,
der das gesamte Arbeitsdiagramm umfaßt, sowie einer gerichteten Kante. Diese Kante,
die vom Kasten ausgeht, ist an ihrem Startpunkt mit der Vorschrift "get time" beschriftet. Die gerichtete Kante endet entweder graphisch im Nichts oder an einem temporalen
Vergleichsoperator. Das graphische Nichts bewirkt die Ausgabe des berechneten temporalen Elements. Der temporaler Vergleichsoperator bewirkt, daß das berechnete temporale
81
Kapitel 4. Die TEER–Anfragesprache
Element an eine weitere Anfrage geleitet wird. Dazu wird das Kantenende mit einem
Prädikatnamen beschriftet, der die gewünschte temporale Projektion oder Selektion angibt.
get_time
teer
Abbildung 4.6: Time–link
teer
get_time
temp_pred
teer’
Abbildung 4.7: Time–link im Rahmen einer temporalen Projektion
Da der Time–link–Operator eine Unteranfrage darstellt, ist eine temporale Projektion auf
das TEER–Schema teer nicht zugelassen.
Die lineare Syntax des Time–Links get time ist gegeben durch:
get time ::=
"get time" "from" teer
[ "restrict" restrict attr ] [ temp sel expr ]
temp sel expr ::= "time condition of" ent rel name "is" temp sel
Der Bezeichner ent rel name repräsentiert einen Entity– oder Relationshiptypnamen.
82
4.1. Eine graphische temporale Anfragesprache
Beispiel 4.11
Wann ist Müller Leiter der Abteilung ’Montage’ ?“
”
ANGESTELLTER
AngName = ’Müller’
get time
AbtLeiter:
ABTEILUNG
AbtName = ’Montage’
83
Kapitel 4. Die TEER–Anfragesprache
Die nächste Anfrage enthält zusätzlich zum Time–link noch einen Vergleichsoperator. Der
Time–link–Operator liefert in diesem Beispiel das temporale Element für eine Projektion.
Beispiel 4.12
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem Müller
”
Leiter der Abteilung ’Montage’ ist ?“
AngName = ’Müller’
ANGESTELLTER
AbtLeiter:
ABTEILUNG
AbtName = ’Montage’
get time
during
ANGESTELLTER
*
AngName
*
PersNr
*
Position
Syntax einer Anfrage
Die Syntax einer Anfrage query an ein TEER–Modell teer ist gegeben durch:
query ::= get attr | get time
get attr ::=
get op [ restrict expr ]
[ temp sel expr ] [temp proj expr ]
restrict expr ::= "restrict" "(" restrict attr ")" |
"restrict" result link |
"restrict" "(" restrict attr "and" result link ")"
temp proj expr ::= "project" temp proj
Die Syntax der TEER–Datenbank–Anfragesprache ist zusammengefaßt im Anhang B zu
finden.
84
4.1. Eine graphische temporale Anfragesprache
Es folgen als Beispiele die obigen in graphischer Form gegebenen Anfragen in linearer
Schreibweise:
Beispiel 4.13
1. Beispiel 4.5:
Welche Produkte werden von der Abteilung ’Montage’ der Firma ’Prima’ produ”
ziert ?“
get ChargenNr, ProdName
from FIRMA, ABTEILUNG, PRODUKT, gehört zu, produziert
restrict ((Firmenname = ’Prima’) and (AbtName = ’Montage’))
2. Beispiel 4.6:
Welche Personen verdienen mehr, als das Produkt ‘Rennrad’ kostet ?“
”
get AngName, PersNr, Gehalt
from ANGESTELLTER
restrict Gehalt > all (get StPreis
from PRODUKT
restrict (ProdName = ’Rennrad’))
3. Beispiel 4.7:
Wie teuer waren die Vorprodukte der Firma ’Prima’, die genau innerhalb des Zeit”
raums vom 1/1/91 bis 31/12/91 produziert wurden ?“
get ChargenNr, ProdName, StPreis
from FIRMA, ZULIEFERFIRMA, VORPRODUKT, PRODUKT, liefert, ⊇, ⊇
restrict ((Firmenname = ’Prima’))
project during [1/1/91, 31/12/91]
4. Beispiel 4.8:
Welche Produkte werden von welcher Abteilung genau in den Zeiträumen produ”
ziert, in denen die Auslastung mindestens einer Abteilung über 80% liegt ?“
get ProdName, AbtName
from PRODUKT, ABTEILUNG, produziert
project during [[ Auslastung > 80 ]]
5. Beispiel 4.9:
Welche Angestellten arbeiten für wieviel Gehalt in derjenigen Abteilung, die inner”
halb des Zeitraums vom 1/1/91 bis 30/6/91 ’Montage’ hieß ?“
get PersNr, AngName, Gehalt
from ANGESTELLTER, ABTEILUNG, AbtLeiter, Mitarbeiter
time condition of ABTEILUNG is [[ AbtName = ’Montage’ ]]
during [1/1/91, 30/6/91]
85
Kapitel 4. Die TEER–Anfragesprache
6. Beispiel 4.10:
Welche Angestellten arbeiteten innerhalb des Zeitraums vom 1/1/95 bis 31/1/95
”
für wieviel Gehalt in derjenigen Abteilung, die innerhalb des Zeitraums vom 1/1/91
bis 30/6/91 ’Montage’ hieß ?“
get PersNr, AngName, Gehalt
from ANGESTELLTER, ABTEILUNG, AbtLeiter, Mitarbeiter
time condition of ABTEILUNG is [[ AbtName = ’Montage ]]
during [1/1/91, 30/6/91]
project during [1/1/95, 31/1/95]
7. Beispiel 4.11:
Wann ist Müller Leiter der Abteilung ’Montage’ ?“
”
get time from ABTEILUNG, ANGESTELLTER, AbtLeiter
restrict ((AbtName = ’Montage’) and (AngName = ’Müller’))
8. Beispiel 4.12:
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem
”
Müller Leiter der Abteilung ’Montage’ ist ?“
get AngName, PersNr, Position
from ANGESTELLTER ang
project during (get time from ABTEILUNG, ANGESTELLTER a
restrict ((a.AbtName = ’Montage’) and
(a.AngName = ’Müller’)))
4.2
Der TEER–Kalkül
Der TEER–Kalkül ist ein temporal erweiterter EER–Kalkül (Kapitel 2.5). Die temporale
Erweiterung besteht darin, daß sich die Kalkülausdrücke auf einen Zeitpunkt beziehen
können. Eine Umwandlung dieser Zeitpunkte in temporale Elemente wird nicht betrachtet. Daher ist die Menge der zugelassenen umgangssprachlichen temporalen Prädikate
einzuschränken. Dieser Punkt wird unten ausführlich diskutiert.
Die Begriffe Term, Atomare Formel und Formel (Definitionen 2.7, 2.9, 2.12) werden vollständig übernommen. Das Grundgerüst des Kalküls, das Alphabet, ist zu
verändern. Die Grundlage dazu bildet die TEER–Standarddatentyp–Signatur TDT =
(SORTTDT , OPNSTDT , PREDTDT ). Analog zum EER–Kalkül werden auch im TEER–
Kalkül Datentyp–anzeigende Indizes bei Operatoren und Prädikaten der Mengen
OPNSTDT und PREDTDT nicht angegeben. Die entscheidenden Erweiterungen bilden Funktionen, die den Datenbankinhalt in Abhängigkeit von der Zeit auswerten. Da der TEER–
Kalkül das Ergebnis einer temporalen Anfrage liefert, wird die Ausgabe um die Angabe
des Zeitpunkts erweitert, zu dem das Ergebnistupel gültig ist.
Es sei ein TEER-Schema mit den zugehörigen temporalen Datentypen der Menge SORTTDT gegeben.
Datentypen haben eine feste Interpretation. Die Operato Die
m m m
,
,
, TE , firstTE , lastTE , min durationTE , max durationTE } ⊆
ren der Menge { m
int
int
TE
OPNSTDT sind nicht zugelassen, da sie in der TEER–Anfragesprache nicht verfügbar sind.
86
4.2. Der TEER–Kalkül
4.2.1
Die umgangssprachlichen temporalen Prädikate
Die Prädikate superior, equivalent, adjacent und overlap der Menge PREDTDT sind im
temporal erweiterten EER–Kalkül nicht ausdrückbar. Die die Begründung dafür ist, daß
sich der TEER–Kalkül ausschließlich auf Zeitpunkte bezieht. Eine graphische TEER–
Anfrage, die auf der Basis temporaler Elemente formuliert wird, entspricht einer Menge
von Kalkülanfragen. Die mit jeder Anfrage ermittelten Zeitpunkte bilden ein temporales
Element. An diese temporalen Elemente stellen die obigen Prädikate spezielle Bedingungen: Es müssen sich ein temporales Element in einer bestimmten temporalen Ausbildung
bilden. Diese Ausbildung ist an Hand von Beispielen im Beispiel 3.1 graphisch dargestellt.
In den folgenden Erklärungen zu den Prädikaten, die von der Form π(τ1 , τ2 ), τi ∈ TE type,
sind, wird angenommen, daß das temporale Element τ2 gegeben ist und τ1 sich aus berechneten Zeitpunkten zusammensetzen soll.
1. superior:
Das sich aus den einzelnen Zeitpunkten bildende temporale Element muß ganz über
dem gegebenen temporalen Element liegen, d.h. alle Teilintervalle des gegebenen
temporalen Elementes müssen vollständig überdeckt werden.
2. equivalent:
Das sich aus den einzelnen Zeitpunkten bildende temporale Element muß in allen
Zeitpunkten mit dem gegebenen temporalen Element übereinstimmen.
3. adjacent:
Das sich aus den einzelnen Zeitpunkten bildende temporale Element muß neben
dem gegebenen temporalen Element liegen, d.h. es müssen sich Intervalle bilden, so
daß jedes Intervall des gegebenen Elements einen Nachbarn besitzt.
4. overlap:
Das sich aus den einzelnen Zeitpunkten bildende temporale Element muß das gegebene Element überschneiden.
Es ist aber nicht möglich, an einen gerade berechneten Zeitpunkt Bedingungen zu stellen,
die andere noch unbekannte, zu berechnende Zeitpunkte einschließen. Es ist unbekannt, ob
dieser Zeitpunkt einzeln oder in einem sich bildenden Intervall liegt, oder ob im Fall von
overlap außerhalb des gegebenen Elements liegende Zeitpunkte in das zu berechnende
Element aufgenommen werden dürfen, da vielleicht noch nicht sicher ist, daß es auch
Überschneidungen gibt.
Die Prädikate during, before und after sind in Kapitel 3.3 so für temporale Elemente
definiert, daß diese Definitionen auch für einzelne Zeitpunkte richtig sind. Ob ein vor, nach
oder innerhalb eines temporalen Elements liegender Zeitpunkt innerhalb eines Intervalls
oder einzeln liegt, ist nicht wichtig. Die Menge endlich vieler berechneter Zeitpunkte bildet
ein temporales Element, das das Prädikat in Bezug auf das gegebene temporale Element
erfüllt.
Die umgangssprachlichen Prädikate sind allesamt nicht direkt im TEER–Kalkül anzugeben. Die Prädikate during, before und after sind aber mit Hilfe der mathematischen
Prädikate {<d , >d , ≤d , ≥d , =d , =d , ∈TE } ⊆ PREDTDT ausdrückbar.
87
Kapitel 4. Die TEER–Anfragesprache
4.2.2
Syntax
In der folgenden Definition des Alphabets des TEER–Kalküls werden an passenden Stellen, innerhalb der Definition der Prädikate und Operatoren, gleich Beispiele angegeben.
Zu diesem unüblichen Mittel wird gegriffen, um die gemachten Unterscheidungen zu veranschaulichen.
Definition 4.14
Das Alphabet des TEER–Kalküls ist gegeben durch:
• Trennzeichen
• Klammern
, (Komma)
(, )
• Doppelpunkt
:
• Verbindungszeichen
• Quantoren
¬, ∧, ∨, ⇒, ⇔
∀, ∃
• Individuenvariablen
• Zeitvariablen
• Zeitkonstanten
x, y, z . . .
t, t , t , . . .
t0 , tnow , t∞
• Sorten
– Datensorten SORTTDT
– Entitytypen E-TYPE
– Relationshiptypen R-TYPE
• Sortenausdrücke
– Jede Sorte ist ein Sortenausdruck.
– Ist s ein Sortenausdruck, so sind list(s), set(s) und bag(s) Sortenausdrücke.
• Die Menge der Prädikatsymbole π(τ1 , . . . , τn ) läßt sich in drei Gruppen einteilen.
Die erste Gruppe besteht aus Prädikaten, die nicht temporal erweitert werden. Die
zweite Gruppe enthält alle Prädikate, die temporal erweitert werden und die dritte Gruppe umfaßt die auf temporale Datentypen anwendbaren Prädikate. Für die
Prädikate der ersten beiden Gruppen gilt, daß sie auf temporal abhängige oder
unabhängige Terme anwendbar sind. Wenn eine temporale Abhängigkeit der Argumentterme besteht, sind alle diese temporal abhängigen Terme von demselben festen
Zeitpunkt t abhängig. Diese Abhängigkeit wird mit Hilfe der speziellen Schreibweise .t (unten als Operator definiert) ausgedrückt. In der unten folgenden Auflistung
der Prädikate wird in allgemeinen Formeln diese temporale Abhängigkeit der Argumentterme angenommen, sie muß aber nicht für alle Terme bestehen.
88
4.2. Der TEER–Kalkül
Die erste Menge besteht aus den Datentyp–Prädikaten der Menge PREDDT ⊆
PREDTDT . Diese Prädikate werden nicht temporal erweitert:
π(τ1 , . . . , τn ) ≡ π̂(τ̂1 .t, . . . , τ̂n .t),
wobei τi ein Term des TEER–Kalküls und τ̂i ein Term des EER–Kalküls ist.
π̂ ≡ π ∈ PREDDT ist ein Prädikat des EER–Kalküls.
Beispiel 4.15
Die Variable pr sei vom Typ produziert.
pr.Auslastung.t > 80
ist eine atomare Formel des TEER–Kalküls. Sie ist von der Form
π(τ1 , τ2 )
mit
π ≡ π̂ = >, π, π̂ ∈ PREDDT ,
τ1 ≡ τ̂1 .t = pr.Auslastung.t,
τ2 ≡ τ̂2 = 80.
Da 80 eine Konstante ist, ist τ2 nicht temporal abhängig.
Beispiel 4.16
Die Variable ang sei vom Typ ANGESTELLTER, die Variable ab vom Typ ABTEILUNG.
ang = ab.AbtLeiter.t
ist eine atomare Formeln der Form
τ1 = τ2
mit
τ1 ≡ τ̂1 = ang,
τ2 ≡ τ̂2 .t = ab.AbtLeiter.t .
Da ang eine Individuenvariable ist, ist τ1 nicht temporal abhängig.
Die nächste Gruppe der Prädikatsymbole besteht aus den Relationshiptypen sowie den is–Prädikaten. Diese Prädikate werden temporal abhängig gemacht. Für
Prädikate π ∈ PREDTDT gilt:
π(τ1 , . . . , τn ) ≡ π̂.t(τ̂1 .t, . . . , τ̂n .t),
wobei π̂, π̂ ∈ PREDTDT , ein Prädikat des EER–Kalküls ist, für das gilt: π ≡ π̂.t. τi
ist ein Term des TEER–Kalküls, τ̂i ist ein Term des EER–Kalküls. Zu den Relationshiptypen und Prädikatfunktionen im einzelnen:
Ein Relationshiptyp wird in Abhängigkeit eines Zeitpunkts t ausgewertet. Der Relationshiptyp R = R(n1 : E1 , . . . , nm : Em ) (ohne Berücksichtigung von Relationship–
Attributtypen) mit partizipierenden Entitytypen Ei und zugehörigen Rollennamen
ni ist als Prädikat dann wie folgt definiert:
R.t(τ1 .t, . . . , τm .t) := ∃ (xR : R) (n1 .t(xR ) = τ1 .t ∧ . . . ∧ nm .t(xR ) = τm .t).
Der Rollenname ni .t ist dabei ein Operator im Sinne der unten gegebenen Definition.
89
Kapitel 4. Die TEER–Anfragesprache
Beispiel 4.17
Die Variable p sei vom Typ PRODUKT, die Variable ab vom Typ ABTEILUNG
und der Relationshiptyp R sei produziert. Der Ausdruck
produziert.t(p, ab)
ist eine atomare Formel der Form
π(τ1 , τ2 )
π ≡ π̂.t = produziert.t,
τ1 ≡ τ̂1 = p,
τ2 ≡ τ̂2 = ab.
mit
π, π̂ ∈ PREDTDT ,
Das is–Prädikat wird temporal erweitert. Die Funktion is Ak .t : Ej prüft, ob ein
Entity des Eingangstyps Ej auch Entity des Ausgangstyps Ak zum Zeitpunkt t ist.
Das Prädikat is Ej .t : Ak ist analog definiert.
Beispiel 4.18
Die Variable v sei vom Typ VORPRODUKT. Der Ausdruck
is PRODUKT.t(v)
ist eine atomare Formel der Form
π(τ )
mit
π ≡ π̂.t = is PRODUKT.t,
τ ≡ τ̂ = v.
π, π̂ ∈ PREDTDT ,
Die dritte Gruppe bilden die auf temporale Datentypen anwendbaren Prädikate
der Menge PREDTEMP ⊆ PREDTDT , wobei die umgangssprachlichen Prädikate im
TEER–Kalkül nicht zugelassen sind.
PREDTEMP := {<d , >d , ≤d , ≥d , =d , =d , ∈TE } ⊆ PREDTDT .
Diese Prädikate dürfen auf Zeitvariablen sowie temporale Elemente bzw. die Datumsangaben, aus denen sich die Angabe eines solchen Elements zusammensetzt,
angewendet werden. Ausdrücke, die ein Prädikat der Menge PREDTEMP beinhalten,
sind von der Form:
π(τ1 , . . . , τn ) ≡ π̂(τ̂1 , . . . , τ̂n ),
π ≡ π̂, τi ≡ τ̂i .
Beispiel 4.19
1. t ∈ [1/1/91, 30/6/91]
2. t < 1/1/91
3. t = t
• Die Menge der Operatorsymbole ω(τ1 , . . . , τn ) läßt sich ebenfalls in drei Gruppen
aufteilen. Auch hier wird die Unterscheidung nach der temporalen Abhängigkeit getroffen. Die Operatoren der ersten Gruppe werden temporal erweitert. Die zweite
90
4.2. Der TEER–Kalkül
Gruppe enthält alle Operatoren, die nicht temporal erweitert werden, und die dritte
Gruppe umfaßt die auf temporale Datentypen anwendbaren Operatoren. Für die
Operatoren der ersten beiden Gruppen gilt, daß sie auf temporal abhängige oder
unabhängige Terme anwendbar sind. Wenn eine temporale Abhängigkeit der Argumentterme besteht, sind alle diese temporal abhängigen Terme von demselben festen
Zeitpunkt t abhängig. In der unten folgenden Auflistung der Operatoren wird in allgemeinen Formeln diese temporale Abhängigkeit der Argumentterme angenommen,
sie muß aber nicht für alle Terme bestehen.
Die erste Gruppe besteht aus den Datentyp–Operationen der Menge OPNSDT ⊆
OPNSTDT . Diese Operationen werden nicht temporal erweitert:
ω(τ1 , . . . , τn ) ≡ ω̂(τ̂1 .t, . . . , τ̂n .t),
wobei ω ≡ ω̂ ∈ OPNSDT ein Operator des EER–Kalküls ist. Die Terme τi sind
Terme des TEER–Kalküls, die Terme τ̂i sind Terme des EER–Kalküls.
Beispiel 4.20
Der Ausdruck
StPreis.t + 50
ist ein Term der Form
ω(τ1 , τ2 )
mit
ω ≡ ω̂ = +, ω, ω̂ ∈ OPNSDT ,
τ1 ≡ τ̂1 .t = StPreis.t,
τ2 ≡ τ2 = 50.
Die zweite Gruppe der Operatorsymbole besteht aus Datenbankschema–Operatoren
sowie dem as–Operator. Diese Operatoren werden temporal abhängig gemacht:
ω(τ1 , . . . , τn ) ≡ ω̂.t(τ̂1 , . . . , τ̂n ),
wobei ω, ω ∈ OPNSTDT , ein Operator des TEER–Kalküls und ω̂, ω̂ ∈ OPNSTDT ,
ein Operator des EER–Kalküls ist, für den ω ≡ ω̂.t gilt. τi ist ein Term des TEER–
Kalküls, τ̂i ein Term des EER–Kalküls. Die Operatoren im einzelnen:
Ist x eine Variable der Sorte E ∈ E-TYPE oder R ∈ R-TYPE und A ∈ ATTR
ein Attribut, so bezeichnet x.A.t eine Variable für das Attribut A zum Zeitpunkt
t, das zum Typ E oder R gehört. Diese Verknüpfung gilt auch für Komponenten
C ∈ COMP oder Rollennamen n ∈ ROLE : x.C.A.t entspricht einer Variablen für
das Attribut A der Komponente C, die objektwertiges Attribut des Typs x ist, zum
Zeitpunkt t. n.t(x) drückt die Rolle des Typs E zum Zeitpunkt t aus (x kann in
diesem Fall nur Variable eines Entitytyps sein).
Beispiel 4.21
Die Variable ab sei vom Typ ABTEILUNG. Der Ausdruck
ab.AbtName.t
ist ein Term der Form
ω(τ )
mit
ω ≡ ω̂.t = AbtName.t,
τ ≡ τ̂ = ab.
91
ω, ω̂ ∈ OPNSTDT ,
Kapitel 4. Die TEER–Anfragesprache
Die partielle Konversion as Ak : Ej → Ak wird ebenfalls temporal erweitert:
as Ak .t : Ej → Ak . Sie liefert diejenigen Entities des Ausgangstyps Ak , die zum
Zeitpunkt t Entities des Eingangstypen Ej sind. Das Prädikat as Ej .t : Ak ist analog definiert.
Beispiel 4.22
Die Variable f sei vom Typ FIRMA. Der Ausdruck
as ZULIEFERFIRMA.t(f )
ist von der Form
ω(τ )
mit
ω ≡ ω̂.t = as ZULIEFERFIRMA.t,
τ ≡ τ̂ = f.
ω, ω̂ ∈ OPNSTDT ,
Die dritte Gruppe der Operatoren bilden die auf temporale Datentypen anwendbaren Operatoren der Menge OPNSTEMP ⊆ OPNSTDT , wobei die umgangssprachlichen
Operatoren nicht zugelassen sind.
OPNSTEMP := {−d , +d , −TE , +TE } ⊆ OPNSTDT .
Ausdrücke, die einen Operator der Menge OPNSTDT enthalten, sind von der Form:
ω(τ1 , . . . , τn ) ≡ ω̂(τ̂1 , . . . , τ̂n ),
ω ≡ ω̂, τi ≡ τ̂i .
Beispiel 4.23
1. t + 5
2. [12/1/97, 12/2/97] − [31/1/97, 31/12/97]
Bemerkung: Konstanten
Die nullstelligen Funktionen k :→ s, als welche Konstanten k der spezifizierten
Datentypen s aufgefaßt werden, bleiben unverändert, werden also temporal nicht
erweitert. Für Konstanten ist die Angabe eines Zeitpunkts t irrelevant.
Bemerkung: Quantoren
Der All-Quantor ∀ und der Existenz–Quantor ∃ sind auf Zeitvariablen anwendbar.
Definition 4.24
Eine Anfrage im TEER–Kalkül ist ein Term ohne freie Variablen und Zeitvariablen der
Form
{τ1 , . . . , τn , t | δ1 ∧ . . . ∧ δk ∧ ϕ ∧ ϕt } ≡ {τ̂1 .t, . . . , τ̂n .t, t | δ1 ∧ . . . ∧ δk ∧ ϕ ∧ ϕt },
wobei τ1 , . . . , τn , n ≥ 0, Terme des TEER–Kalküls und τ̂1 , . . . , τ̂n Terme des EER–Kalküls
sind. t ist eine Zeitvariable, ϕ eine Formel und ϕt eine Formel, in der t gebunden wird.
92
4.2. Der TEER–Kalkül
ϕt drückt die temporale Projektion aus, mit der der Zeitraum, in dem die ausgegebenen
Daten gültig sind, festgelegt wird. Beinhaltet eine Anfrage keine temporale Projektion,
wird der Gültigkeitszeitraum auf die gesamte Lebensdauer der Datenbank gesetzt. Ein
Gültigkeitszeitraum wird mit Hilfe eines temporalen Elements TE angegeben.
Es folgen als Beispiele die obigen in graphischer und linearer Form gegebenen Anfragen
im TEER–Kalkül:
Beispiel 4.25
Zu beachten ist, daß Anfragen, die keine temporale Projektion beinhalten, über die gesamte Lebensdauer der Datenbank ausgewertet werden. Mit jeder Kalkülanfrage wird,
zusätzlich zu den gewünschten Werten, auch der Gültigkeitszeitpunkt dieser Werte ausgegeben.
1. Beispiel 4.5:
Welche Produkte werden von der Abteilung ’Montage’ der Firma ’Prima’ produ”
ziert ?“
{p.ChargenNr.t, p.ProdName.t, t | (p : PRODUKT)
∧ ∃ (ab : ABTEILUNG)(ab.AbtName.t = ’Montage’ ∧ produziert.t(p, ab)
∧ ∃ (f : FIRMA)(f.Firmenname.t = ’Prima’ ∧ gehört zu.t(f, ab)))
∧ t ∈ [t0 , t∞ ]}
2. Beispiel 4.6:
Welche Personen verdienen mehr, als das Produkt ’Rennrad’ kostet ?“
”
{ang. AngName.t, ang.PersNr.t, ang.Position.t, t | (ang : ANGESTELLTER)
∧ ang.Gehalt.t >max
{p.StPreis.t | (p : PRODUKT) (p.ProdName.t = ’Rennrad’)
∧ t ∈ [t0 , t∞ ]}
∧ t ∈ [t0 , t∞ ]}
3. Beispiel 4.7:
Wie teuer waren die Vorprodukte der Firma ’Prima’, die genau innerhalb des Zeit”
raums vom 1/1/91 bis 31/12/91 produziert wurden ?“
{p.ChargenNr.t, p.ProdName.t, p.StPreis.t, t | (p : PRODUKT)
∧ ∃ (f : FIRMA)(f.Firmenname.t = ’Prima’
∧ ∃ (v : VORPRODUKT)(liefert.t(v,as ZULIEFERFIRMA.t(f ))
∧ as PRODUKT.t(v) = p)) ∧ t ∈ [1/1/91, 31/12/91]}
4. Beispiel 4.8:
Welche Produkte werden von welcher Abteilung genau in den Zeiträumen produ”
ziert, in denen die Auslastung mindestens einer Abteilung über 80% liegt ?“
{p.ProdName.t, ab.AbtName.t, t | (p : PRODUKT ∧ ab : ABTEILUNG)
∧ ∃ (pr : produziert)(pr.Auslastung.t > 80) ∧ produziert.t(p, ab)
∧ t ∈ [t0 , t∞ ]}
93
Kapitel 4. Die TEER–Anfragesprache
5. Beispiel 4.9:
Welche Angestellten arbeiten für wieviel Gehalt in derjenigen Abteilung, die inner”
halb des Zeitraums vom 1/1/91 bis 30/6/91 ’Montage’ hieß ?“
{ang.PersNr.t, ang.AngName.t, ang.Gehalt.t, t |
(ang : ANGESTELLTER) ∧ ∃ (ab : ABTEILUNG) ((∀ t ∈ [1/1/91,30/6/91])
⇒ (ab.AbtName.t = ’Montage’)
∧ (ang = ab.AbtLeiter.t ∨ ang ∈ ab.Mitarbeiter.t)) ∧ t ∈ [t0 , t∞ ]}
6. Beispiel 4.10:
Welche Angestellten arbeiteten innerhalb des Zeitraums vom 1/1/95 bis 31/1/95
”
für wieviel Gehalt in derjenigen Abteilung, die innerhalb des Zeitraums vom 1/1/91
bis 30/6/91 ’Montage’ hieß ?“
{ang.PersNr.t, ang.AngName.t, ang.Gehalt.t, t | (ang : ANGESTELLTER)
∧ ∃ (ab : ABTEILUNG) ((∀ t ∈ [1/1/91,30/6/91]) ⇒ (ab.AbtName.t = ’Montage’)
∧ (ang = ab.AbtLeiter.t ∨ ang ∈ ab.Mitarbeiter.t) ∧ t ∈ [1/1/95,31/1/95])}
7. Beispiel 4.11:
Wann ist Müller Leiter der Abteilung ’Montage’ ?“
”
{t | ∃(ang : ANGESTELLTER)(ang.AngName.t = ’Müller’
∧ ∃(ab : ABTEILUNG)(ab.AbtName.t = ’Montage’
∧ ang = ab.AbtLeiter.t)) ∧ t ∈ [t0 , t∞ ]}
8. Beispiel 4.12:
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem
”
Müller Leiter der Abteilung ’Montage’ ist ?“
{ang.AngName.t, ang.PersNr.t, ang.Position.t, t | (ang : ANGESTELLTER)
∧ ∃(a : ANGESTELLTER)(a.AngName.t = ’Müller’
∧ ∃(ab : ABTEILUNG)(ab.AbtName.t = ’Montage’
∧ a = ab.AbtLeiter.t)) ∧ t ∈ [t0 , t∞ ]}
4.2.3
Semantik
Die für den EER–Kalkül definierte Semantik der Terme, atomaren Formeln und Formeln
(Definitionen 2.15, 2.16, 2.17) ist im TEER–Kalkül gültig. Die Semantik des TEER–
Kalküls wird mit Hilfe dieser zugrunde liegenden Semantik definiert. Terme, Operatoren
und Prädikate des EER–Kalküls werden mit der im vorherigen Abschnitt eingeführten
ˆ–Notation kenntlich gemacht.
Die folgenden neuen Notationen werden verwendet:
[σt , β](τ ) bezeichne den Wert des Terms τ im Zustand σt unter der Belegung β.
[σt , β] |= ϕ bedeutet: Eine Formel ϕ ist im Zustand σt unter der Belegung β gültig.
Ein Zustand σt einer temporalen Datenbank ist eine Menge von Entities, Relationships
und Attributen, die zu den in der Datenbank modellierten Entity– und Relationshiptypen sowie Attributtypen passen (vgl. Kapitel 3.1). Diese Menge ist zeitabhängig, da eine
94
4.2. Der TEER–Kalkül
Menge gleicher Entities, Relationships und Attribute zu verschiedenen Zeitpunkten t unterschiedliche Werte enthalten kann. σt bezeichnet somit den Zustand einer (temporalen)
Datenbank zu einem Zeitpunkt t.
Die Belegung einer Zeitvariablen t ist ein fester Zeitpunkt. Eine Anfrage des TEER–
Kalküls entwickelt sich daher zu einer Menge von Anfragen des EER–Kalküls, da β(t) alle
innerhalb dieses Zeitraums liegenden Zeitpunkte durchlaufen muß. In Kalkülkonstrukten,
in denen t eine freie Variable ist, sei der Wert von t außerhalb dieses Konstrukts festgelegt.
Von dieser Festlegung des Zeitpunkts t ist der Datenbank–Zustand, in dem die Anfrage
ausgewertet wird, abhängig. Die Semantik einzelner Kalkülkonstrukte, in denen t frei ist,
ist daher nicht festgelegt. Für die im folgenden behandelten Konstrukte sei eine feste
Belegung β(t) gegeben, sofern t sonst eine freie Zeitvariable wäre.
Definition 4.26
Die Semantik des TEER–Kalküls ist gegeben durch:
• [σ, β](t) := β(t)
• ω ∈ OPNSDT ⊆ OPNSTDT :
[σ, β](ω(τ1 , . . . , τn )) ≡ [σ, β](ω̂(τ̂1 .t, . . . , τ̂n .t)), ω̂ ∈ OPNSDT
:= [σβ(t) , β](ω̂(τ̂1 , . . . , τ̂n ))
• ω ∈ OPNSTDT :
[σ, β](ω(τ1 , . . . , τn )) ≡ [σ, β](ω̂.t(τ̂1 .t, . . . , τ̂n .t)), ω̂ ∈ OPNSTDT
:= [σβ(t) , β](ω̂(τ̂1 , . . . , τ̂n ))
• ω ∈ OPNSTEMP ⊆ OPNSTDT :
[σ, β](ω(τ1 , . . . , τn )) ≡ [σ, β](ω̂(τ̂1 , . . . , τ̂n )), ω̂ ∈ OPNSTEMP
:= [σβ(t) , β](ω̂(τ̂1 , . . . , τ̂n ))
• [σ, β]({τ1 , . . . , τn , t | δ1 ∧ . . . ∧ δk ∧ ϕ ∧ ϕt })
≡ [σ, β]({τ̂1 .t, . . . , τ̂n .t, t | δ1 ∧ . . . ∧ δk ∧ ϕ ∧ ϕt })
:= {[σβ(t) , β]({τ̂1 , . . . , τ̂n , β(t) | δ1 ∧ . . . ∧ δk ∧ ϕ}) | β(t) ist ein Zeitpunkt, der in
dem in der Formel ϕt spezifizierten Gültigkeitszeitraum liegt. }
• [σ, β]({{τ1 , . . . , τn , t | δ1 ∧ . . . ∧ δk ∧ ϕ ∧ ϕt }})
≡ [σ, β]({{τ̂1 .t, . . . , τ̂n .t, t | δ1 ∧ . . . ∧ δk ∧ ϕ ∧ ϕt }})
:= {[σβ(t) , β]({{τ̂1 , . . . , τ̂n , β(t) | δ1 ∧ . . . ∧ δk ∧ ϕ}}) | β(t) ist ein Zeitpunkt, der in
dem in der Formel ϕt spezifizierten Gültigkeitszeitraum liegt. }
• [σ, β] |= τ1 = τ2 ≡ τ̂1 .t = τ̂2 .t gdw. [σβ(t) , β] |= τ̂1 = τ̂2
• π ∈ PREDDT ⊆ PREDTDT :
[σ, β] |= π(τ1 , . . . , τn ) ≡ π̂(τ̂1 .t, . . . , τ̂n .t), π̂ ∈ PREDDT
gdw. [σβ(t) , β] |= π̂(τ̂1 , . . . , τ̂n )
• π ∈ PREDTDT :
[σ, β] |= π(τ1 , . . . , τn ) ≡ π̂.t(τ̂1 .t, . . . , τ̂n .t), π̂ ∈ PREDTDT
gdw. [σβ(t) , β] |= π̂(τ̂1 , . . . , τ̂n )
95
Kapitel 4. Die TEER–Anfragesprache
• π ∈ PREDTEMP ⊆ PREDTDT :
[σ, β] |= π(τ1 , . . . , τn ) ≡ π̂(τ̂1 , . . . , τ̂n ), π̂ ∈ PREDTEMP
gdw. [σβ(t) , β] |= π̂(τ̂1 , . . . , τ̂n )
4.2.4
Auswertung
In diesem Abschnitt wird die Vorgehensweise bei der Auswertung einer Anfrage des
TEER–Kalküls an Hand eines einfachen Beispiels vorgestellt.
Gegeben sei die TEER–Kalkül–Anfrage
{p.ChargenNr.t, t | (p : PRODUKT) ∧ p.StPreis.t > 1000 ∧ t ∈ [t0 , t∞ ]}.
Diese Anfrage gibt die Chargennummer aller Produkte, die teurer als 1000 DM sind, aus.
Die Kalkülanfrage ist ein korrekter Anfrageterm der Form
τ1 = {τ2 , t | δ1 ∧ ϕ ∧ ϕt }
mit
τ2 = τ̂2 .t = p.ChargenNr.t
δ1 = (p : PRODUKT)
ϕ = p.StPreis.t > 1000
ϕt = t ∈ [t0 , t∞ ]
Die Sorten sort der Terme lassen sich wie folgt bestimmen:
sort(p) = type(p) = PRODUKT
sort(τ̂2 ) = integer, da ChargenNr: PRODUKT → integer
sort(τ1 ) = set(tuple(integer, date))
Der Anfrageterm τ1 muß nun zu allen Zeitpunkten t, die zwischen t0 und t∞ liegen,
ausgewertet werden. O.B.d.A. sei t0 = t∞ , so daß die Auswertung nur zu dem festen
Zeitpunkt β(t) = t0 erfolgen muß. Der Datenbank–Zustand σβ(t) sei durch die Tabelle 4.1
festgelegt.
Surrogat ChargenNr
p1
1
p2
2
p3
3
p4
4
ProdName StPreis
Rennrad
1200
Herrenrad
1100
Damenrad
900
Kinderrad
400
Tabelle 4.1: σβ(t) (PRODUKT) = {p1 , p2 , p3 , p4 }
96
4.3. Transformation in den TEER–Kalkül
Die Auswertung:
[σβ(t) , β](τ1 ) = {[σβ(t) , β ](τ̂2 ), β(t) |
β ist eine Belegung mit β (x) = β(x) f ür alle x = p,
so daß [σβ(t) , β ](p : PRODUKT) und [σβ(t) , β ](p.StPreis > 1000)}
= {[σβ(t) , β ](τ̂2 ), β(t) |
β ist eine Belegung mit β (x) = β(x) f ür alle x = p,
so daß β (p) ∈ σβ(t) (PRODUKT) und
([σβ(t) , β ](p.StPreis), [σβ(t) , β ](1000)) ∈ σβ(t) (>)}
= {σβ(t) (ChargenNr)([σβ(t) , β ](p)), β(t) |
β ist eine Belegung mit β (p) = pi (i ∈ 1, . . . , 4) und
σβ(t) (StPreis)([σβ(t) , β ](p)) > 1000}
= {σβ(t) (ChargenNr)(β (p)), β(t) |
β ist eine Belegung mit β (p) = pi (i ∈ 1, . . . , 4) und
σβ(t) (StPreis)(β (p)) > 1000}
= {σβ(t) (ChargenNr)(pi ), β(t) | i ∈ 1, . . . , 4 und σβ(t) (StPreis)(pi ) > 1000}
= {(1, t0 ), (2, t0 )}
4.3
Transformation in den TEER–Kalkül
Nachdem neben der Syntax der TEER–Anfragesprache auch deren Interpretation umgangssprachlich in Kapitel 4.1.3 gegeben wurde, soll die Semantik jetzt eindeutig festgelegt werden. Dazu wird der im Abschnitt 4.2.2 definierte TEER–Kalkül verwendet. Eine
Konsequenz davon ist, daß die umgangssprachlichen temporalen Prädikate superior, equivalent, adjacent und overlap in zu transformierenden Anfragen nicht verwendet werden
dürfen.
Die Familie von Funktionen T F = {T , Tt , Tt,t } transformiert eine graphische TEER–
Anfrage, die in linearer Schreibweise vorliegt, in den TEER–Kalkül. Das geschieht, indem
die einzelnen Syntaxkonstrukte transformiert werden. Die Transformation ist Syntax–
orientiert. Die jeweilige Transformationsfunktion ist danach festgelegt, ob der transformierte Ausdruck temporal abhängig ist.
Die Funktion T ist temporal unabhängig. Das bedeutet, daß keine Zeitvariablen in dem
erzeugten Kalkülkonstrukt verwendet werden. Die Funktionen Tt , Tt,t sind dagegen temporal abhängig. Die Funktion Tt wird benutzt, um eine gebundene Zeitvariable t dem zu
transformierenden Ausdruck zu übergeben. t wird damit in dem erzeugten Ausdruck verwendet. Die Funktion Tt,t übergibt die Zeitvariable t analog zur Funktion Tt . Die Variable
t dagegen wird erst durch den Funktionsaufruf erzeugt. t wird in dem transformierten
Ausdruck gebunden und kann in der folgenden zu erzeugenden Kalkülanfrage weiterverwendet werden.
97
Kapitel 4. Die TEER–Anfragesprache
Bei der Formulierung der Transformation wird, wie in der linearen Syntax (vgl. Anhang
B), die erweiterte Backus–Naur–Form verwendet. Damit soll verdeutlicht werden, welche
Zeichen geschrieben werden müssen. Optionale Klammern sind dann sooft zu bearbeiten,
wie der zu transformierende Ausdruck in der linearen Anfrage vorkommt. In Ausnahmefällen sind spezielle Regeln angegeben.
Um eine fehlerfreie Transformation zu gewährleisten, müssen die linearen Anfragen eine bestimmte Form besitzen, die über die syntaktische Korrektheit hinausgeht, wie im
folgenden zu sehen ist.
4.3.1
Voraussetzungen und Einschränkungen
• Alle Anfragen und Unteranfragen müssen explizit deklarierte Variablen beinhalten.
Eine Anfrage, inklusive ihrer Unteranfragen, darf sich nur auf ein einziges (syntaktisch korrektes) TEER–Schema beziehen. Dieses sei in einer TEER–Signatur formalisiert (damit sind die beschreibenden Mengen und Hilfsfunktionen aus Kapitel
2.4.1 definiert und vorhanden).
Die Form des Anfragekopfs sei
"get" attr list "from" teer
mit
teer ::=
ent name abbrev [ "," ent name abbrev ]∗
[ "," rel name abbrev ]∗
[ "," typ name ]∗
[ "," comp name ]∗
Für die in attr list und teer enthaltenen Namen muß gelten:
1. Alle Attributnamen attr name müssen in der Menge ATTR enthalten sein,
2. alle Entitytypnamen ent name müssen in der Menge E-TYPE enthalten sein,
3. alle Relationshiptypnamen rel name müssen in der Menge R-TYPE enthalten
sein,
4. alle Typkonstruktionsnamen typ name müssen in der Menge
CONSTRUCTION enthalten sein,
5. alle Komponentennamen comp name müssen in der Menge COMP enthalten
sein.
• Die Namen der Variablen abbrev müssen in der Anfrage eindeutig sein und genau
einmal deklariert werden.
• Es sind nur Anfragen zugelassen, die sich auf Diagramme beziehen, deren Relationships alle zweistellig sind.
• Alle in eine Anfrage einbezogenen Typkonstruktionen dürfen nur einen Eingangs–
und einen Ausgangstyp besitzen.
98
4.3. Transformation in den TEER–Kalkül
Das Vorgehen bei der Transformation einer Anfrage ist nicht linear, d.h. die in einem Konstrukt enthaltenen Informationen reichen nicht immer zu seiner Transformation aus. Bei
der Transformation solcher Konstrukte wird immer wieder auf die in dem Konstrukt teer
enthaltenen Informationen zurückgegriffen. Es findet eine sogenannte seitliche Weitergabe
von Informationen statt. Der Baum in Abbildung 4.8 soll das Vorgehen bei einer Transformation verdeutlichen. Dabei ist die jeweilig benutzte Transformationsfunktion nicht
angegeben. Der Ableitungsast eines Konstrukts, also eines Nichtterminals, ist soweit nach
unten verfolgt, bis sich eine Zeichenfolge, nur aus Terminalen bestehend, gebildet hat.
Wegen der enormen Größe des Baums sind die Ableitungen von Datentypen und Prädikaten jedoch nicht dargestellt. Besitzen mehrere Nichtterminale eines Ausdrucks dieselbe
Ableitung, werden die Äste an einem gemeinsamen Knoten zusammengeführt. Kommt ein
Nichtterminal dabei mehrfach in diesem Ausdruck vor, so wird nur für eines die Ableitung
weiter dargestellt. Durch diese unkonventionelle Darstellungsform soll die Breite des Baumes beschränkt werden. Die seitliche Weitergabe von Informationen ist aus eben diesem
Grund nicht dargestellt. Dieser Ableitungsbaum“ ist nicht vollständig, oftmals wird auf
”
die Wiederholung von Ableitungsästen von Nichtterminalen verzichtet. Der entsprechende Ast ist in diesen Fällen an anderer Stelle im Baum zu finden. Aus diesem Grund sind
sämtliche temporalen Ausdrücke in Abhängigkeit von t aufgeführt. Ob t eventuell durch
eine andere Zeitvariable zu ersetzen ist, ist den unten aufgeführten Transformationsregeln zu entnehmen. Der Sinn der Abbildung ist, einen Weg durch die unten angegebenen
Transformationsregeln zu zeigen. Die Regeln zur Transformation der Datentypen sind
in diesem Abschnitt nicht angegeben, da sie offensichtlich sind. In Anhang C sind die
Transformationsregeln vollständig zusammengefaßt.
99
Kapitel 4. Die TEER–Anfragesprache
Abbildung 4.8: Ableitungsbaum“
”
100
4.3. Transformation in den TEER–Kalkül
4.3.2
Die Transformation
Die im TEER–Kalkül ausdrückbaren Anfragen sind in zwei Gruppen eingeteilt:
1. Die Ausgabe von Tupeln zusammen mit dem Gültigkeitszeitpunkt:
{τ1 , . . . , τn , t | δ1 . . .∧ δk ∧ ϕ ∧ ϕt } = {τ̂1 .t, . . . , τ̂n .t, t | δ1 ∧. . .∧ δk ∧ ϕ ∧ ϕt }, n > 0.
2. Die Ausgabe eines Zeitpunkts:
{t | ϕ ∧ ϕt }, n = 0.
Dieses ist analog zu der linearen Syntax der TEER–Anfragesprache. Eine Anfrage query
ist dort entweder als ein get attr oder ein get time–Konstrukt definiert. Deshalb liefert
die Transformation einer query ::= get attr einen Kalkülausdruck der ersten Gruppe,
eine Transformation von query ::= get time einen Ausdruck der zweiten Gruppe. Nach
diesem Schema, sich an der Syntax orientierend, sind alle Transformationsregeln aufgebaut. Die kontextfreien Syntaxregeln reichen zu einer fehlerfreien Transformation jedoch
nicht immer aus. Es gibt zusätzlich kontextsensitive Regeln, die von den Mengen und
Hilfsfunktionen aus Kapitel 2.4.1 Gebrauch machen.
Ein TEER–Diagramm wird durch das Konstrukt teer beschrieben. In teer werden sämtliche Entitytyp–, Relationshiptyp–, Typkonstruktions– und Komponentennamen angegeben, auf die sich eine Anfrage bezieht.
Im folgenden wird die Beispielanfrage 4.5
Welche Produkte werden von der Abteilung ’Montage’ der Firma ’Prima’ produziert ?“
”
betrachtet. Die zugehörige lineare Anfrage ist (vgl. Beispiel 4.13.1):
get ChargenNr, ProdName
from FIRMA, ABTEILUNG, PRODUKT, gehört zu, produziert
restrict ((Firmenname = ’Prima’) and (AbtName = ’Montage’))
Das TEER–Diagramm ist somit angegeben durch
teer ::=
FIRMA f, ABTEILUNG ab, PRODUKT p, gehört zu gz,
produziert pr
wobei, um den oben gestellten Voraussetzungen zu entsprechen, alias–Bezeichner für die
Entity– und Relationshiptypen eingeführt worden sind. In dem Deklarationsteil einer
Kalkülanfrage sollen aber nur diejenigen Entity– und Relationshiptypen deklariert werden,
deren Attributwerte ausgegeben werden sollen. Welche Namen in teer zu welchem EER–
Konzept gehören, liefert ein Vergleich eines jeden Namens mit den Elementen der Mengen
E-TYPE, R-TYPE, CONSTRUCTION und COMP. Im obigen Beispiel liefert dieser
Vergleich
FIRMA, ABTEILUNG, PRODUKT ∈ E-TYPE,
gehört zu, produziert ∈ R-TYPE.
Die Attribute, deren Werte ausgegeben werden sollen, sind in attr list angegeben. In
Beispiel 4.5 hat diese das folgende Aussehen:
ChargenNr, ProdName
101
Kapitel 4. Die TEER–Anfragesprache
Die Transformation von attr list sieht vor, daß jeder Attributname der Liste um einen
alias–Bezeichner sowie die Endung .t erweitert wird. Der alias–Bezeichner ist die in teer
angegebene Abkürzung des zu diesem Attribut gehörenden Entity– oder Relationshiptyps.
Diesen Typ liefert die Funktion type als Ergebnis. So ist für das obige Beispiel
type(ChargenNr) = PRODUKT
und type(ProdName) = PRODUKT.
Der zugehörige alias–Bezeichner für PRODUKT ist p. attr list wird daher zu
p.ChargenNr.t, p.ProdName.t
(4.1)
abgeleitet. Damit ist auch die Transformation von teer festgelegt:
T (teer) = (p : PRODUKT),
(4.2)
da nur Attribute des Entitytyps PRODUKT ausgegeben werden.
4.3.3
Die Transformation von restrict expr und restrict attr
Das in der linearen Syntax folgende Konstrukt restrict expr ist dort optional. Diese Optionalität wird bei der Transformation einer Anfrage verworfen. Im Rahmen der
Transformation dieses Konstrukts wird eine Funktion aufgerufen“, die die Beziehungen,
”
die zwischen verschiedenen Entitytypen existieren, im Kalkül zum Ausdruck bringt. Diese
Funktion namens relationt erzeugt für das obige Beispiel unter Verwendung der beiden
in teer angegebenen Relationshiptypnamen und der dort angegebenen Abkürzungen die
Ausdrücke
gehört zu.t(f, ab)
und produziert.t(p, ab)
(4.3)
(4.4)
Zur Bildung dieser Ausdrücke wird die Funktion participants benutzt. Sie liefert zu einem
Relationshiptyp die daran beteiligten Entitytypen:
participants(gehört zu) =
participants(produziert) =
{FIRMA, ABTEILUNG}
{PRODUKT, ABTEILUNG}
Die Ausdrücke (4.3) und (4.4) setzen sich aus den Relationshiptypnamen, der .t–Notation
und den in teer angegebenen alias–Bezeichnern für die beteiligten Entitytypen zusammen. Bei der Transformation von restrict expr wird für das obige Beispiel die Transformation von restrict attr durchgeführt, da dieses Konstrukt in der linearen Schreibweise dieser Beispielanfrage gegeben ist. An Stelle von restrict attr kann aber auch
ein result link oder eine Kombination von beiden Konstrukten stehen. Während der
Transformation von restrict attr werden zuerst die noch nicht deklarierten, in teer
aufgeführten, Entitytypen deklariert:
∃ (f : FIRMA) ∧ ∃ (ab : ABTEILUNG)
(4.5)
Im Anschluß daran werden eventuelle boolesche Bedingungen bool expr transformiert.
Dabei werden die Attributnamen wie bei der Transformation von attr list behandelt,
102
4.3. Transformation in den TEER–Kalkül
Konstanten und Vergleichsprädikate bleiben unverändert. Die Bedingungen bool expr
sind in Beispiel 4.5 gegeben durch:
bool expr ::= Firmenname = ’Prima’
bool expr ::= AbtName = ’Montage’
Die Transformation dieser Bedingungen ergibt die Ausdrücke
f.Firmenname.t = ”Prima”
ab.AbtName.t = ”Montage”
(4.6)
(4.7)
Die Ausdrücke (4.3) – (4.7) werden durch Und– und Klammersymbole zu dem
folgenden Ausdruck zusammengesetzt, der Transformation von restrict expr ::=
"restrict" restrict attr:
∃ (f : FIRMA) ∧ ∃ (ab : ABTEILUNG)(f.Firmenname.t = ”Prima” ∧
ab.AbtName.t = ”Montage” ∧ gehört zu.t(f, ab) ∧ produziert.t(p, ab)
(4.8)
Die übrig gebliebene offene Klammer wird erst am Ende des gesamten Kalkülausdrucks
geschlossen. Eine schließende Klammer an dieser Stelle würde den Geltungsbereich der
Variablen f und ab womöglich vorzeitig beenden.
4.3.4
Die Transformation von temp sel expr
Das nächste zu transformierende Konstrukt einer Anfrage ist das optionale
temp sel expr–Konstrukt. Bei der Transformation von temp sel expr werden neue Zeitvariablen eingeführt. Diese sollen eine Unterscheidung zwischen einer Selektion und
einer temporalen Projektion in einer Anfrage sicher stellen. Die Transformation von
temp sel expr hält sich nicht streng an die Syntax. Um die Abhängigkeit der in true time
beschriebenen Bedingungen von dem durch temp pred und cal temp elem angegebenen
Zeitraum in Kalkülschreibweise auszudrücken, ist eine Vertauschung der linearen Syntaxkonstrukte während der Transformation notwendig.
Im folgenden wird die Beispielanfrage 4.9
Welche Angestellten arbeiten für wieviel Gehalt in derjenigen Abteilung, die innerhalb
”
des Zeitraums vom 1/1/91 bis 30/6/91 ’Montage’ hieß ?“
betrachtet. Die zugehörige lineare Anfrage ist (vgl. Beispiel 4.13.5):
get PersNr, AngName, Gehalt
from ANGESTELLTER, ABTEILUNG, AbtLeiter, Mitarbeiter
time condition of ABTEILUNG is [[ AbtName = ’Montage’ ]]
during [1/1/91, 30/6/91]
Die temporale Selektion ist diesem Beispiel angegeben durch
temp sel expr ::= time condition of ABTEILUNG is [[ AbtName = ”Montage”]]
during [1/1/91, 30/6/91]
(4.9)
In diesem konkreten Beispiel wird die true time ::= [[ AbtName = ’Montage’ ]] auf den
Entitytyp ABTEILUNG angewendet. Der Zeitraum, in dem die Bedingung AbtName =
”
’Montage’“ gelten soll, ist angegeben durch
103
Kapitel 4. Die TEER–Anfragesprache
temp pred ::= "during"
und cal temp elem ::= [1/1/91, 30/6/91]
Die Transformation von temp sel expr wird folgendermaßen durchgeführt:
Das Konstrukt temp sel expr wird in Abhängigkeit von der Zeitvariablen t nach der
Regel transformiert:
Tt (temp sel expr) := ∧ (( ∀ t ∈ [t0 , t∞ ] ∃ t ∈ Tt (cal temp elem) t = t )
⇒ (Tt (true time))),
da das verwendete Prädikat temp pred during ist.
Bei der Transformation des Intervalls cal temp elem bleibt dieses unverändert:
Tt (cal temp elem) = [1/1/91, 30/6/91]
(4.10)
Innerhalb der Transformation des Konstrukts true time wird der Entitytyp ABTEILUNG deklariert, falls dieser bisher noch undeklariert ist. Es wird angenommen, daß
ABTEILUNG bisher nicht deklariert wurde. An dieser Stelle muß, um ABTEILUNG
deklarieren zu können, wieder auf Informationen, die in teer enthalten sind, zurückgegriffen werden. Im Anschluß an die Deklaration wird die Bedingung AbtName = ’Mon”
tage’“ transformiert:
Tt (true time) = ∃ (ab : ABTEILUNG)(ab.AbtName.t = ”Montage”)
(4.11)
Das Einsetzen der Ausdrücke (4.10) – (4.11) in (4.3.4) ergibt die Transformation des
temp sel expr–Ausdrucks (4.9):
Tt (temp sel expr) := ∧ ((∀ t ∈ [t0 , t∞ ] ∃ t ∈ [1/1/91, 30/6/91] t = t )
⇒ (∃ (ab : ABTEILUNG)(ab.AbtName.t = ”Montage”)))
4.3.5
Die Transformation von temp proj expr
Das letzte zu transformierende Konstrukt ist temp proj expr. Dieses Konstrukt ist in der
linearen Syntax optional, bei der Transformation dagegen nicht. Der Grund dafür ist die
Festlegung, daß der Gültigkeitszeitraum auf die Lebensdauer der Datenbank zu setzen ist,
falls kein Gültigkeitszeitraum, d.h. eine temporale Projektion, in der Anfrage angegeben
ist. Im Fall der Anfrage 4.5, die keine Projektion enthält, ergibt die Transformation daher
den Ausdruck
∧ t ∈ [t0 , t∞ ]
(4.12)
Die Zusammensetzung der Ausdrücke (4.1), (4.2), (4.8) und (4.12) zusammen mit im
Rahmen der Transformation von rstrict attr zu setzenden Klammern ergibt für die
Anfrage 4.9 die transformierte Anfrage
{p.ChargenNr.t, p.ProdName.t, t | (p : PRODUKT)
∧ ∃ (f : FIRMA) ∧ ∃ (ab : ABTEILUNG)
(f.Firmenname.t = ’Prima’ ∧ ab.AbtName.t = ’Montage’
∧ gehört zu.t(f, ab) ∧ produziert.t(p, ab) ∧ t ∈ [t0 , t∞ ])}
Eine angegebene temporale Projektion wird in Abhängigkeit von dem verwendeten Prädikat temp pred transformiert.
104
4.3. Transformation in den TEER–Kalkül

 ∀ t ∈ Tt (temp elem proj) t < t , falls temp pred ::= before
∀ t ∈ Tt (temp elem proj) t > t , falls temp pred ::= after
Tt (temp proj) :=

∃ t ∈ Tt (temp elem proj) t = t , falls temp pred ::= during
Die Transformation des Konstrukts temp elem proj richtet sich nach dem in der Anfrage
verwendeten Konstrukt. So kann temp elem proj entweder ein konstantes temporales
Element, ein Gültigkeitszeitraum true time oder eine Unteranfrage get time sein.
Die Transformation einer Anfrage vom Typ get time unterscheidet sich in der Vorgehensweise unwesentlich von der oben beschriebenen Transformation einer Anfrage get attr.
Als Ergebnis erhält man einen Kalkülausdruck der zweiten Gruppe:
{t | ϕ ∧ ϕt }
Es wird ebenfalls Syntax–orientiert vorgegangen, die Ausnahmen, die bei den Konstrukten
restrict attr und temp proj expr gemacht werden, sind im Rahmen der Transformationsregeln erklärt.
4.3.6
Die Transformationsregeln
Die Transformation einer Anfrage query ist gegeben durch die Abbildung Tt (query).
Tt (get attr), falls query ::= get attr
Tt (query) :=
Tt (get time), falls query ::= get time
Die Abbildungen der übrigen Konstrukte sind in alphabetischer Reihenfolge angegeben.
Die Transformation der Datentypen ist in Anhang C zu finden.
T (abbrev) := T (string)
T ("all") := "max"
T (all any choice) :=
T ("all"), falls all any choice ::= "all"
Tt ("any"), falls all any choice ::= "any"
T ("and") := " ∧ "
T ("any") := "min"
Tt (attr expr) := [ T ("not") ] Tt (attr cond)
Tt (attr cond) := Tt (attr name) T (pred) T (value)
Tt (attr list) := Tt (attr name) [ "," Tt (attr name) ]∗
105
Kapitel 4. Die TEER–Anfragesprache
Tt (attr name) := T (abbrev)"."T (string)".t"
Es muß gelten:
abbrev gehört zu demjenigen Entity ent name für das gilt: type(attr name) = ent name
und ent name ist in teer enthalten.
Tt (bool expr) := Tt (attr expr) [ T (bool op) Tt (attr expr) ]∗
T (bool op) :=
T ("and "), falls bool op ::= "and"
T ("or "), falls bool op ::= "or"
Tt (cal temp elem) :=
Tt (temp elem), falls cal temp elem ::= temp elem
Tt (get time), falls cal temp elem ::= get time
T (comp name) := T (string)
T (ent name) := T (string)
T (ent rel name) :=
Tt (get attr) :=
T (ent name), falls ent rel name ::= ent name
T (rel name), falls ent rel name ::= rel name
"{" Tt (get op) Tt (restrict expr)
[ Tt (temp sel expr) ] Tt (temp proj expr) [ ) ]! "}"
Im Gegensatz zur Syntax einer Anfrage sind die Transformationen der Konstrukte
restrict expr und temp proj expr nicht optional. Mit der Transformation des Konstrukts restrict expr werden eventuelle Verbindungen zwischen Entity– und Relationshiptypen, an die eine Anfrage gestellt wird, in Kalkülschreibweise ausgedrückt. Die Transformation des Konstrukts temp proj expr erzeugt die Einschränkung der Daten auf einen
Gültigkeitszeitraum. Ist keine Projektion in der Anfrage angegeben, wird die Lebensdauer
der Datenbank als Gültigkeitszeitraum genommen.
Die optionale runde schließende Klammer wird dann benötigt, wenn in einer Kalkülanfrage an dieser Stelle noch offene Klammern kein schließendes Gegenstück besitzen. Die
nicht zur erweiterten Backus–Naur–Form gehörige Hilfsnotation [ ) ]! soll bedeuten, daß
nicht beliebig viele schließende Klammern gesetzt werden dürfen, sondern ihre Anzahl
muß genau der Anzahl noch offener Klammern entsprechen. Im Rahmen der Formulierung
von booleschen Bedingungen oder Gültigkeitszeiträumen werden Klammern geöffnet,
können aber dort nicht wieder geschlossen werden, da sonst der Gültigkeitsbereich von
Deklarationen vorzeitig beendet werden könnte.
Tt (get op) := Tt (attr list) ", t |" T (teer)
106
4.3. Transformation in den TEER–Kalkül
Tt (get result) := "{" Tt (get result op) Tt (restrict attr) Tt (temp proj expr) [ ) ]! "}"
Es gelten dieselben Erklärungen wie für das Konstrukt get attr. Die Transformation
des in einer Unteranfrage nicht zugelassenen Konstrukts temp proj expr erzeugt die in
dem Kalkül nötige Einschränkung der Variablen t auf die Lebensdauer der Datenbank.
Da das get result–Konstrukt eine Unteranfrage darstellt, dürfen nur diejenigen runden
Klammern geschlossen werden, die während der Transformation dieser Unteranfrage
geöffnet wurden und bisher kein schließendes Gegenstück besitzen. Das bedeutet insbesondere, daß offene runde Klammern, die bei der Transformation der übergeordneten
Anfrage geöffnet wurden, nicht geschlossen werden dürfen.
Tt (get result op) := Tt (attr name) "|" T (teer)
Tt (get time) := "{ t |" Tt (restrict att) [ Tt (temp sel expr) ] Tt (temp proj expr) [ ) ]! "}"
Es gelten dieselben Erklärungen wie für das Konstrukt get attr. Die Transformation
des in einer Unteranfrage nicht zugelassenen Konstrukts temp proj expr erzeugt die in
dem Kalkül nötige Einschränkung der Variablen t auf die Lebensdauer der Datenbank.
Auch in diesem Fall drückt die Hilfsnotation [ ) ]! aus, daß nur soviele runde schließende
Klammern gesetzt werden dürfen, wie noch offene vorhanden sind. Wird das get time–
Konstrukt als Unteranfrage im Rahmen einer temporalen Selektion oder Projektion
verwendet, ist die Betrachtung der Klammern nur auf die innerhalb der Transformation
dieser Unteranfrage gesetzten Klammern beschränkt.
T ("not") := "¬"
T ("or") := " ∨ "
T (rel name) := T (string)
Tt (restrict attr) := [ " ∧ " ] [ "∃ (" T (abbrev) " : " T (ent rel name) ")" ]
[ " ∧ ∃ (" T (abbrev) " : " T (ent rel name) ")" ]∗
"(" Tt (bool expr) [ " ∧ " Tt (bool expr) ]∗
[ " ∧ " relationt ]∗
Die ersten drei optionalen Klammern ermöglichen die Deklaration aller bisher nicht deklarierten Entitytypen, die in teer aufgeführt sind. Als Variablen werden dabei die zugehörigen alias–Bezeichner abbrev aus teer benutzt. Relationshiptypen werden nur dann
deklariert, wenn eine boolesche Bedingung bool expr an ein zugehöriges Attribut gestellt
107
Kapitel 4. Die TEER–Anfragesprache
ist. Das erste optionale ∧ wird nicht benötigt, falls Tt (restrict attr) im Rahmen einer
Transformation des Konstrukts get result oder get time aufgerufen wird.
Als nächstes werden alle booleschen Bedingungen nacheinander transformiert. Die letzte
optionale Klammer beinhaltet einen Aufruf der Funktion relationt . Diese Funktion
stellt Verbindungen zwischen Entitytypen her. relationt ist sooft aufzurufen, bis alle
Relationshiptyp–, Typkonstruktions– und Komponentennamen, die in teer vorkommen,
benutzt sind. Beinhaltet eine Anfrage nur einen Entitytyp, ist der Funktionsaufruf zu
übergehen.
Für das Funktion relationt gilt:

T (rel name)".t" (abbrev,abbrev),
falls Fall 1



falls Fall 2
T (abbrev) " = as "T (ent name)".t ("T (abbrev)")",
relationt :=
"(" T (abbrev) " ∈ " T (abbrev)"."T (comp name)".t"


, falls Fall 3

[ " ∨ " T (abbrev) " ∈ " T (abbrev)"."T (comp name)".t" ] ")"
Fall 1:
1. rel name ist in teer enthalten.
2. participants(rel name) = {ent name,ent name}. Die alias–Bezeichner abbrev
dieser beiden Entitytypen werden verwendet.
Fall 2:
1. Es gibt eine Typkonstruktion typ name in teer, wobei
output(typ name), input(typ name) in teer enthalten sind.
2. Die erste Abkürzung abbrev eines Entitynamens gehört zu
ent name = output(typ name).
3. Die zweite Abkürzung abbrev eines Entitynamens gehört zu
ent name = input(typ name).
4. In relationt ist der verwendete ent name = output(typ name).
Fall 3:
1. comp name ist in teer enthalten.
2. Der Ausdruck in der optionalen Klammer, wird für den Fall gebraucht, daß
es mehrere Komponenten zwischen den beiden Entitytypen type(comp name) und
domain(comp name) gibt.
3. Die erste Abkürzung abbrev gehört zu ent name = domain(typ name).
4. Die zweite Abkürzung abbrev gehört zu ent name = type(typ name).
108
4.3. Transformation in den TEER–Kalkül
5. Eine Unterscheidung zwischen ein– und mehrwertigen Komponenten findet nicht
statt.

Tt (restrict attr),




T

t (result link),


Tt (restrict attr) " ∧ " Tt (result link),
Tt (restrict expr) :=
 [ " ∧ ∃ (" T (abbrev) " : " T (ent name) ")" ]∗



"(" relationt [ " ∧ " relationt ]∗ ,



" ",
falls Fall 1
falls Fall 2
falls Fall 3
falls Fall 4
sonst
Fall 1:
restrict expr ::= "restrict" "(" restrict attr ")"
Fall 2:
restrict expr ::= "restrict" result link
Fall 3:
restrict expr ::= "restrict" "(" result attr "and" result link ")"
Fall 4:
Fall 1 und Fall 2 sind nicht erfüllt und es gibt mehr als einen Namen ent name in teer.
Erklärung der Formel:
Mit Hilfe der ersten Klammer werden alle bisher nicht deklarierten Entitytypen, die in
teer aufgelistet sind, deklariert. Die folgenden Aufrufe der Funktion relationt bewirken,
daß die Verbindungen zwischen den einzelnen Typen ausgedrückt werden.
Tt (result link) :=
[ " ∧ ∃ (" T (abbrev) " : " T (ent name) ")" ]∗
"(" relationt [ " ∧ " relationt ]∗
"(" Tt (attr name) T (pred) T (all any choice)
Tt (get result)
Mit Hilfe der ersten Klammer werden alle bisher nicht deklarierten Entitytypen, die in
teer aufgelistet sind, deklariert. Die folgenden Aufrufe der Funktion relationt bewirken,
daß die Verbindungen zwischen den einzelnen Typen ausgedrückt werden. Der Rest der
Transformationsregel ist streng Syntax–orientiert.
T (teer) :=
"(" T (abbrev) " : " T (ent name)
[ " ∧ " T (abbrev) " : " T (ent rel name) ]∗ ")"
wobei abbrev die zu dem Entitytypnamen ent name oder Entity– bzw. Relationshiptypnamen ent rel name gehörige alias–Bezeichner ist. Es werden nur diejenigen Namen
ent name bzw. ent rel name aufgezählt, deren Abkürzung abbrev in Tt (attr list)
vorkommt. Jeder Entity– oder Relationshiptyp wird dabei jedoch nur einmal deklariert,
auch wenn seine Abkürzung in Tt (attr list) mehrfach vorkommt.
109
Kapitel 4. Die TEER–Anfragesprache
Tt (temp elem) :=
Tt (interval),
falls temp elem ::= interval
Tt (interval union), falls temp elem ::= interval union

falls temp elem proj ::= temp elem
 Tt (temp elem),
"[t0 , t∞ ]" Tt (true time) " ∧ ”, falls temp elem proj ::= true time
Tt (temp elem proj) :=

falls temp elem proj ::= get time
Tt (get time),

 ∀ t ∈ Tt (temp elem proj) t < t , falls temp pred ::= before
∀ t ∈ Tt (temp elem proj) t > t , falls temp pred ::= after
Tt (temp proj) :=

∃ t ∈ Tt (temp elem proj) t = t , falls temp pred ::= during
Eine temporale Projektion wird in Abhängigkeit des verwendeten temporalen Prädikats
temp pred transformiert.
Tt (temp proj expr) :=
" ∧ " Tt (temp proj), falls temp proj expr gegeben ist
sonst
" ∧ t ∈ [t0 , t∞ ]",

"(( ∀ t ∈ [t0 , t∞ ] ∀ t ∈ " Tt (cal temp elem) "t < t )"




falls temp pred ::= before
" ⇒ (" Tt (true time) "))"



"(( ∀ t ∈ [t0 , t∞ ] ∀ t ∈ "Tt (cal temp elem) "t > t )"
Tt (temp sel) :=
falls temp pred ::= after
" ⇒ (" Tt (true time) "))"




"(( ∀ t ∈ [t0 , t∞ ] ∃ t ∈ "Tt (cal temp elem) "t = t )"



" ⇒ (" Tt (true time) "))"
falls temp pred ::= during
Eine temporale Selektion wird in Abhängigkeit des verwendeten temporalen Prädikats
temp pred transformiert.
Tt (temp sel expr) := " ∧ " Tt (temp sel)
wobei der in temp sel expr vorkommende Name ent rel name in Tt (true time)
innerhalb von Tt (temp sel) verwendet wird.

"t0 ",



"tnow ",
Tt (time expr) :=
"t∞ ",



T (date),
falls
falls
falls
falls
time
time
time
time
expr
expr
expr
expr
::=
::=
::=
::=
null
now
infinity
date
Tt (true time) := [ "∃ (" T (abbrev) " : " T (ent rel name) ")" ] "(" Tt (bool expr) ")"
wobei der optionale Ausdruck benutzt wird, falls sich die Bedingung auf das Attribut
eines Entity– Relationshiptyps bezieht und ent rel name im bisherigen Ausdruck noch
nicht deklariert worden ist.
110
4.3. Transformation in den TEER–Kalkül
4.3.7
Beispieltransformationen
Als Beispiele werden die linearen Anfragen 4.13 in den TEER–Kalkül transformiert. Dazu
müssen die Anfragen teilweise verändert werden, um den Voraussetzungen zu entsprechen.
Die transformierten Anfragen stimmen mit den Anfragen 4.25 im TEER–Kalkül nicht in
allen Einzelheiten überein. Die Anfragen 4.25 sind optimierte Versionen der hier hergeleiteten.
Um die einzelnen Schritte zu verdeutlichen, werden für jede Anfrage die einzelnen Anfragekonstrukte herausgestellt und transformiert. Wiederholende Transformationen werden
nur beim erstenmal ausführlich erläutert. Auf die Verwendung der EBNF wird dabei
verzichtet.
Beispiel 4.27
Es wird die Beispielanfrage 4.5 betrachtet:
Welche Produkte werden von der Abteilung ’Montage’ der Firma ’Prima’ produziert ?“
”
get ChargenNr, ProdName
from FIRMA f, ABTEILUNG ab, PRODUKT p, gehört zu gz, produziert pr
restrict ((Firmenname = ’Prima’) and (AbtName = ’Montage’))
Für diese Anfrage gilt:
query ::= get attr
get attr ::= get op restrict expr
Die Ableitung des Konstrukts get op:
get op ::= "get" attr list "from" teer
attr list ::= ChargenNr, ProdName
teer ::= FIRMA f, ABTEILUNG ab, PRODUKT p, gehört zu gz,
produziert pr
Die Ableitung des Konstrukts restrict expr:
restrict expr ::= "restrict" "(" restrict attr ")"
restrict attr ::= "(" bool expr1 ")" "and" "(" bool expr2 ")"
bool expr1 ::= Firmenname = ’Prima’
bool expr2 ::= AbtName = ’Montage’
Die Transformation:
Tt (query) = Tt (get attr)
= { Tt (get op) Tt (restrict expr) Tt (temp proj expr) [ ) ]! }
111
Kapitel 4. Die TEER–Anfragesprache
Im einzelnen ergeben diese Transformationen:
Die Transformation des Konstrukts get op:
Tt (get op) = Tt (attr list), t | T (teer)
Die Transformation der Attributliste attr list:
Tt (attr list) = p.ChargenNr.t, p.ProdName.t,
da beide Attribute zu dem Entitytyp PRODUKT gehören und p die zugehörige Abkürzung
ist (siehe teer).
Die Transformation des TEER–Schemas teer:
T (teer) = (p : PRODUKT),
da p die einzige in Tt (attr list) verwendete Abkürzung ist.
Die Transformation des Konstrukts restrict expr:
Tt (restrict expr) = Tt (restrict attr)
= ∧ ∃ (f : FIRMA) ∧ ∃ (ab : ABTEILUNG)
(f.Firmenname.t = ’Prima’ ∧ ab.AbtName.t = ’Montage’
∧ gehört zu.t(f, ab) ∧ produziert.t(p, ab)
Die Entitytypen FIRMA und ABTEILUNG sind diejenigen Entitytypen in teer, die bisher in keiner Deklaration benutzt wurden. Da sich die booleschen Bedingungen nicht auf
Attribute von Relationshiptypen beziehen, besteht der Deklarationsteil nur aus der Deklaration der beiden Entitytypen FIRMA und ABTEILUNG. Es folgt die Transformation
der beiden booleschen Bedingungen. Mit Hilfe der Funktion relationt werden die beiden in
teer aufgeführten Relationshiptypen gehört zu und produziert, in Abhängigkeit ihrer
zugehörigen Entitytypen, hinzugefügt.
Die Transformation des Konstrukts temp proj expr:
Tt (temp proj expr) = ∧ t ∈ [t0 , t∞ ],
da keine temporale Projektion in der Anfrage angegeben ist.
Insgesamt ergibt sich die folgende Kalkülanfrage:
Tt (query) =
{p.ChargenNr.t, p.ProdName.t, t | (p : PRODUKT)
∧ ∃ (f : FIRMA) ∧ ∃ (ab : ABTEILUNG)
(f.Firmenname.t = ’Prima’ ∧ ab.AbtName.t = ’Montage’
∧ gehört zu.t(f, ab) ∧ produziert.t(p, ab) ∧ t ∈ [t0 , t∞ ])}
Bei dieser Anfrage ist eine geöffnete runde Klammer am Ende zu schließen und zwar die,
die vor f.Firmenname.t geöffnet wurde.
112
4.3. Transformation in den TEER–Kalkül
Beispiel 4.28
Es wird die Beispielanfrage 4.6 betrachtet:
Welche Personen verdienen mehr, als das Produkt ’Rennrad’ kostet ?“
”
get AngName, PersNr, Gehalt
from ANGESTELLTER ang
restrict Gehalt >all (get StPreis
from PRODUKT p
restrict (ProdName = ’Rennrad’))
Für diese Anfrage gilt:
query ::= get attr
get attr ::= get op restrict expr
Die Ableitung des Konstrukts get op:
get op ::= "get" attr list "from" teer
attr list ::= AngName, PersNr, Gehalt
teer ::= ANGESTELLTER ang
Die Ableitung des Konstrukts restrict expr:
restrict expr ::= "restrict" result link
result link ::= attr name pred all any choice "(" get result ")"
attr name ::= Gehalt
pred ::= ">"
all any choice ::= "all"
Die Ableitung des Konstrukts get result:
get result ::= get result op "restrict" "(" restrict attr ")"
get result op ::= "get" StPreis "from" PRODUKT p
restrict attr ::= "(" bool expr ")"
bool expr ::= ProdName = ’Rennrad’
Die Transformation:
Tt (query) = Tt (get attr)
= { Tt (get op) Tt (restrict expr) Tt (temp proj expr) [ ) ]! }
Im einzelnen ergeben diese Transformationen:
Die Transformation des Konstrukts get op:
Tt (get op) = Tt (attr list), t | T (teer)
= ang.AngName.t, ang.PersNr.t, ang.Position.t, t | (ang : ANGESTELLTER)
113
Kapitel 4. Die TEER–Anfragesprache
Die Transformation des Konstrukts restrict expr:
Tt (restrict expr) = Tt (result link)
= ( Tt (attr name) T (pred) T (all any choice) Tt (get result)
Tt (attr name) = ang.Gehalt.t
T (pred) = >
T (all any choice) = max
Die Transformation des Konstrukts get result:
Tt (get result) =
{Tt (get result op) Tt (restrict attr) Tt (temp proj expr) [ ) ]! }
Die Transformation des Konstrukts get result op:
Tt (get result op) = Tt (attr name), | T (teer)
Tt (attr name) = p.StPreis.t
T (teer) = (p : PRODUKT)
Die Transformation des Konstrukts restrict attr innerhalb der Unteranfrage
get result:
Tt (restrict attr) = (p.ProdName.t = ’Rennrad’
Die Transformation des Konstrukts temp proj expr innerhalb der Unteranfrage
get result:
Tt (temp proj expr) = ∧ t ∈ [t0 , t∞ ],
da keine Projektion explizit angegeben ist.
Die Transformation des Konstrukts temp proj expr der übergeordneten Anfrage:
Tt (temp proj expr) = ∧ t ∈ [t0 , t∞ ]
da ebenfalls keine temporale Projektion angegeben ist.
Insgesamt ergibt sich die folgende Kalkülanfrage:
Tt (query) =
{ang.AngName.t, ang.PersNr.t, ang.Position.t, t | (ang : ANGESTELLTER)
(ang.Gehalt.t >
{p.StPreis.t | (p : PRODUKT) (p.ProdName.t = ’Rennrad’
∧ t ∈ [t0 , t∞ ])}
∧ t ∈ [t0 , t∞ ])}
Innerhalb der Anfrage und der Unteranfrage ist am Ende jeweils eine Klammer zu schließen. Diese Klammern wurden während der Transformation des Konstrukts restrict expr
114
4.3. Transformation in den TEER–Kalkül
der übergeordneten Anfrage bzw. des Konstrukts restrict attr der Unteranfrage geöffnet.
Beispiel 4.29
Es wird die Beispielanfrage 4.7 betrachtet:
Wie teuer waren die Vorprodukte der Firma ’Prima’, die genau innerhalb des Zeitraums
”
vom 1/1/91 bis 31/12/91 produziert wurden ?“
get ChargenNr, ProdName, StPreis
from FIRMA f, ZULIEFERFIRMA z, VORPRODUKT v, PRODUKT p, liefert l,
⊇, ⊇
restrict ((Firmenname = ’Prima’))
project during [1/1/91, 31/12/91]
Für diese Anfrage gilt:
query ::= get attr
get attr ::= get op restrict expr temp proj expr
Die Ableitung des Konstrukts get op:
get op ::= "get" attr list "from" teer
attr list ::= ChargenNr, ProdName, StPreis
teer ::= FIRMA f, ZULIEFERFIRMA z, VORPRODUKT v, PRODUKT p,
liefert l, ⊇, ⊇
Die Ableitung des Konstrukts restrict expr:
restrict expr ::= "restrict" "(" restrict attr")"
restrict attr ::= "(" bool expr ")"
bool expr ::= Firmenname = ’Prima’
Die Ableitung des Konstrukts temp proj expr:
temp
temp
temp
temp
temp
proj
proj
pred
elem
elem
expr ::= "project" temp proj
::= temp pred temp elem proj
::= "during"
proj ::= temp elem
::= [1/1/91, 31/12/91]
115
Kapitel 4. Die TEER–Anfragesprache
Die Transformation:
Tt (query) = Tt (get attr)
= { Tt (get op) Tt (restrict expr) Tt (temp proj expr) [ ) ]! }
Im einzelnen ergeben diese Transformationen:
Die Transformation des Konstrukts get op:
Tt (get op) = Tt (attr list), t | T (teer)
= p.ChargenNr.t, p.ProdName.t, p.StPreis.t, t | (p : PRODUKT)
Die Transformation des Konstrukts restrict expr:
Tt (restrict expr) = Tt (restrict attr)
= ∧ ∃ (f : FIRMA) ∧ ∃ (z : ZULIEFERFIRMA) ∧ ∃ (v : VORPRODUKT)
(f.Firmenname.t = ’Prima’ ∧ liefert.t(z, v) ∧ z = as ZULIEFERFIRMA.t(f )
∧ v = as VORPRODUKT.t(p)
Die Transformation des Konstrukts temp proj expr:
Tt (temp proj expr) = ∧ Tt (temp proj)
= ∧ ∃ t ∈ Tt (temp elem proj) t = t
= ∧ ∃ t ∈ [1/1/91, 31/12/91] t = t
Insgesamt ergibt sich die folgende Kalkülanfrage:
Tt (query) =
{p.ChargenNr.t, p.ProdName.t, p.StPreis.t, t | (p : PRODUKT)
∧ ∃ (f : FIRMA) ∧ ∃ (z : ZULIEFERFIRMA) ∧ ∃ (v : VORPRODUKT)
(f.Firmenname.t = ’Prima’ ∧ liefert.t(z, v) ∧ z = as ZULIEFERFIRMA.t(f )
∧ v = as VORPRODUKT.t(p) ∧ ∃ t ∈ [1/1/91, 31/12/91] t = t )}
Bei dieser Anfrage ist eine geöffnete Klammer am Ende zu schließen. Diese wurde während
der Transformation des Konstrukts restrict expr geöffnet, vor dem transformierten Attributnamen f.Firmenname.t.
Beispiel 4.30
Es wird die Beispielanfrage 4.8 betrachtet:
Welche Produkte werden von welcher Abteilung genau in den Zeiträumen produziert, in
”
denen die Auslastung mindestens einer Abteilung über 80% liegt ?“
get ProdName, AbtName
from PRODUKT p, ABTEILUNG ab, produziert pr
project during [[ Auslastung > 80 ]]
116
4.3. Transformation in den TEER–Kalkül
Für diese Anfrage gilt:
query ::= get attr
get attr ::= get op temp proj expr
Die Ableitung des Konstrukts get op:
get op ::= "get" attr list "from" teer
attr list ::= ProdName, AbtName
teer ::= PRODUKT p, ABTEILUNG ab, produziert pr
Die Ableitung des Konstrukts temp proj expr:
temp
temp
temp
temp
true
bool
proj
proj
pred
elem
time
expr
expr ::= "project" temp proj
::= temp pred temp elem proj
::= "during"
proj ::= true time
::= [[ bool expr ]]
::= Auslastung > 80
Die Transformation:
Tt (query) = Tt (get attr)
= { Tt (get op) Tt (restrict expr) Tt (temp proj expr) [ ) ]! }
Im einzelnen ergeben diese Transformationen:
Die Transformation des Konstrukts get op:
Tt (get op) = Tt (attr list), t | T (teer)
= p.ProdName.t, ab.AbtName.t, t | (p : PRODUKT ∧ ab : ABTEILUNG)
Die Transformation des Konstrukts restrict expr:
Tt (restrict expr) = (relationt = (rel name.t (abbrev,abbrev)
= (produziert.t(p, ab),
da in der Anfrage kein restrict expr–Konstrukt enthalten ist und in teer genau zwei
Entitytypen enthalten sind.
Die Transformation des Konstrukts temp proj expr:
Tt (temp proj expr) = ∧ Tt (temp proj)
= ∧ ∃ t ∈ Tt (temp elem proj) t = t
= ∧ ∃ t ∈ [t0 , t∞ ] Tt (true time) ∧ t = t
= ∧ ∃ t ∈ [t0 , t∞ ] ∃ (pr : produziert)(pr.Auslastung.t > 80) ∧ t = t
Der Relationshiptyp produziert ist innerhalb der Transformation von true time zu deklarieren, da dieser noch undeklariert ist.
117
Kapitel 4. Die TEER–Anfragesprache
Insgesamt ergibt sich die folgende Kalkülanfrage:
Tt (query) =
{p.ProdName.t, ab.AbtName.t, t | (p : PRODUKT ∧ ab : ABTEILUNG)
(produziert.t(p, ab)
∧ ∃ t ∈ [t0 , t∞ ] ∃ (pr : produziert)(pr.Auslastung.t > 80) ∧ t = t )}
Bei dieser Anfrage ist eine geöffnete Klammer am Ende zu schließen. Diese offene Klammer
wurde während der Transformation des Konstrukts restrict expr gesetzt.
Beispiel 4.31
Es wird die Beispielanfrage 4.9 betrachtet:
Welche Angestellten arbeiten für wieviel Gehalt in derjenigen Abteilung, die innerhalb
”
des Zeitraums vom 1/1/91 bis 30/6/91 ’Montage’ hieß ?“
get PersNr, AngName, Gehalt
from ANGESTELLTER ang, ABTEILUNG ab, AbtLeiter, Mitarbeiter
time condition of ABTEILUNG is [[ AbtName = ’Montage’ ]]
during [1/1/91, 30/6/91]
Für diese Anfrage gilt:
query ::= get attr
get attr ::= get op temp sel expr
Die Ableitung des Konstrukts get op:
get op ::= "get" attr list "from" teer
attr list ::= PersNr, AngName, Gehalt
teer ::=ANGESTELLTER ang, ABTEILUNG ab, AbtLeiter, Mitarbeiter
Die Ableitung des Konstrukts temp sel expr:
temp sel expr ::= "time condition of" ent rel name "is" temp sel
ent rel name ::= ABTEILUNG
temp sel ::= true time temp pred cal temp pred
true time ::= [[ bool expr ]]
bool expr ::= AbtName = ’Montage’
temp pred ::= "during"
cal temp elem ::= temp elem
temp elem ::= [1/1/91, 30/6/91]
Die Transformation:
Tt (query) = Tt (get attr)
= { Tt (get op) Tt (restrict expr) Tt (temp sel expr)
Tt (temp proj expr) [ ) ]! }
118
4.3. Transformation in den TEER–Kalkül
Im einzelnen ergeben diese Transformationen:
Die Transformation des Konstrukts get op:
Tt (get op) = Tt (attr list), t | T (teer)
= ang.PersNr.t, ang.AngName.t, ang.Gehalt.t, t | (ang : ANGESTELLTER)
Die Transformation des Konstrukts restrict attr:
Tt (restrict expr) = ∧ ∃ (T (abbrev) : T (ent name)) (relationt
∧ ∃ (T (abbrev) : T (ent name)) ((T (abbrev) ∈ T (abbrev). T (comp name).t)
∨ T (abbrev) ∈ T (abbrev).T (comp name).t)
= ∧ ∃ (ab : ABTEILUNG) ((ang ∈ ab.AbtLeiter.t ∨ ang ∈ ab.Mitarbeiter.t)
Die Transformation von restrict expr ergibt den angegebenen Ausdruck, da die Entitytypen ANGESTELLTER und ABTEILUNG durch die zwei Komponenten AbtLeiter und
Mitarbeiter miteinander verbunden sind.
Die Transformation des Konstrukts temp sel expr:
Tt (temp sel expr) = ∧ Tt (temp sel)
= ∧ ((∀ t ∈ [t0 , t∞ ] ∃ t ∈ Tt (cal temp elem) t = t ) ⇒ (Tt (true time)))
= ∧ ((∀ t ∈ [t0 , t∞ ] ∃ t ∈ [1/1/91, 30/6/91] t = t
⇒ ((ab.AbtName.t = ’Montage’)))
Die Transformation des Konstrukts temp proj expr:
Tt (temp proj expr) = ∧ t ∈ [t0 , t∞ ],
da keine Projektion explizit angegeben ist.
Insgesamt ergibt sich die folgende Kalkülanfrage:
Tt (query) =
{ang.PersNr.t, ang.AngName.t, ang.Gehalt.t, t |
(ang : ANGESTELLTER)
∧ ∃ (ab : ABTEILUNG) ((ang ∈ ab.AbtLeiter.t ∨ ang ∈ ab.Mitarbeiter.t)
∧ ((∀ t ∈ [t0 , t∞ ] ∃ t ∈ [1/1/91, 30/6/91] t = t ) ⇒ ((ab.AbtName.t = ’Montage’)))
∧ t ∈ [t0 , t∞ ])}
Bei dieser Anfrage ist eine geöffnete Klammer am Ende zu schließen. Sie wurde innerhalb
der Transformation von restrict expr geöffnet.
Beispiel 4.32
Es wird die Beispielanfrage 4.10 betrachtet:
Welche Angestellten arbeiten im Zeitraum vom 1/1/95 bis 31/1/95 für wieviel Gehalt in
”
derjenigen Abteilung, die zwischen 1/1/91 und 30/6/91 ’Montage’
hieß ?“
119
Kapitel 4. Die TEER–Anfragesprache
get PersNr, AngName, Gehalt
from ANGESTELLTER ang, ABTEILUNG ab, AbtLeiter, Mitarbeiter
time condition of ABTEILUNG is [[ AbtName = ’Montage’ ]]
during [1/1/91, 30/6/91]
project during [1/1/95, 31/1/95]
Für diese Anfrage gilt:
query ::= get attr
get attr ::= get op temp sel expr temp proj expr
Die Ableitung des Konstrukts get op:
get op ::= "get" attr list "from" teer
attr list ::= PersNr, AngName, Gehalt
teer ::=ANGESTELLTER ang, ABTEILUNG ab, AbtLeiter, Mitarbeiter
Die Ableitung des Konstrukts temp sel expr:
temp sel expr ::= "time condition of" ent rel name "is" temp sel
ent rel name ::= ABTEILUNG
temp sel ::= true time temp pred cal temp pred
true time ::= [[ bool expr ]]
bool expr ::= AbtName = ’Montage’
temp pred ::= "during"
cal temp elem ::= temp elem
temp elem ::= [1/1/91, 30/6/91]
Die Ableitung des Konstrukts temp proj expr:
temp
temp
temp
temp
proj
proj
pred
elem
expr ::= "project" temp proj
::= temp pred temp elem proj
::= "during"
proj ::= [1/1/95, 31/1/95]
Die Transformation dieser Anfrage unterscheidet sich in der Vorgehensweise nicht von
der vorherigen Transformation der Anfrage 4.9. Der Unterschied zwischen den beiden
Anfragen besteht darin, daß für diese Anfrage ein Gültigkeitszeitraum angegeben ist.
Tt (query) =
{ang.PersNr.t, ang.AngName.t, ang.Gehalt.t, t |
(ang : ANGESTELLTER)
∧ ∃ (ab : ABTEILUNG) ((ang ∈ ab.AbtLeiter.t ∨ ang ∈ ab.Mitarbeiter.t)
∧ ((∀ t ∈ [t0 , t∞ ] ∃ t ∈ [1/1/91, 30/6/91] t = t ) ⇒ ((ab.AbtName.t = ’Montage’)))
∧ ∃ t ∈ [1/1/95, 31/1/95] t = t )}
120
4.3. Transformation in den TEER–Kalkül
Beispiel 4.33
Es wird die Beispielanfrage 4.11 betrachtet:
Wann ist Müller Leiter der Abteilung ’Montage’ ?“
”
get time from ABTEILUNG ab, ANGESTELLTER ang, AbtLeiter
restrict ((AbtName = ’Montage’) and (AngName = ’Müller’))
Für diese Anfrage gilt:
query ::= get time
get time ::= "get time" "from" teer "restrict" "(" restrict attr ")"
teer ::= ABTEILUNG ab, ANGESTELLTER ang, AbtLeiter
Die Ableitung des Konstrukts restrict attr:
restrict attr ::= "(" bool expr1 ")" "and" "(" bool expr2 ")"
bool expr1 ::= AbtName = ’Montage’
bool expr2 ::= AngName = ’Müller’
Die Transformation:
Tt (query) = Tt (get time)
= { t | Tt (restrict attr) Tt (temp proj expr) [ ) ]! }
Im einzelnen ergeben diese Transformationen:
Die Transformation des Konstrukts restrict attr:
Tt (restrict attr)
= ∃(ab : ABTEILUNG) ∧ ∃(ang : ANGESTELLTER)
(ab.AbtName.t = ’Montage’ ∧ ang.AngName.t = ’Müller’
∧ (ang ∈ ab.AbtLeiter.t)
Die Transformation des Konstrukts temp proj expr:
Tt (temp proj expr) = ∧ t ∈ [t0 , t∞ ]
da keine Projektion explizit angegeben ist.
Insgesamt ergibt sich die folgende Kalkülanfrage:
Tt (query) =
{t | ∃(ab : ABTEILUNG) ∧ ∃(ang : ANGESTELLTER)
(ab.AbtName.t = ’Montage’ ∧ ang.AngName.t = ’Müller’
∧ (ang = ab.AbtLeiter.t) ∧ t ∈ [t0 , t∞ ])}
Bei dieser Anfrage ist eine geöffnete Klammer am Ende zu schließen.
121
Kapitel 4. Die TEER–Anfragesprache
Beispiel 4.34
Es wird die Beispielanfrage 4.12 betrachtet:
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem Müller
”
Leiter der Abteilung ’Montage’ ist ?“
get AngName, PersNr, Position
from ANGESTELLTER ang
project during (get time from ABTEILUNG ab, ANGESTELLTER a
restrict ((a.AbtName = ’Montage’) and (a.AngName = ’Müller’)))
Für diese Anfrage gilt:
query ::= get attr
get attr ::= get op temp proj expr
Die Ableitung des Konstrukts get op:
get op ::= "get" attr list "from" teer
attr list ::= AngName, PersNr, Position
teer ::= ANGESTELLTER ang
Die Ableitung des Konstrukts temp proj expr:
temp
temp
temp
temp
proj
proj
pred
elem
expr ::= "project" temp proj
::= temp pred temp elem proj
::= "during"
proj ::= "(" get time ")"
Die Ableitung des Konstrukts get time:
get time ::= "get time" "from" teer "restrict" "(" restrict attr ")"
teer ::= ABTEILUNG ab, ANGESTELLTER a
Die Ableitung des Konstrukts restrict attr:
restrict attr ::= "(" bool expr1 ")" "and" "(" bool expr2 ")"
bool expr1 ::= a.AbtName = ’Montage’
bool expr2 ::= a.AngName = ’Müller’
Die Transformation:
Tt (query) = Tt (get attr)
= { Tt (get op) Tt (restrict expr) Tt (temp proj expr) [ ) ]! }
122
4.3. Transformation in den TEER–Kalkül
Im einzelnen ergeben diese Transformationen:
Die Transformation des Konstrukts get op:
Tt (get op) = Tt (attr list), t | T (teer)
= ang.AngName.t, ang.PersNr.t, ang.Position.t, t | (ang : ANGESTELLTER)
Die Transformation des Konstrukts restrict expr:
Tt (restrict expr) = " ",
da die Anfrage kein restrict expr–Konstrukt enthält und teer nur einen Entitytypnamen enthält.
Die Transformation des Konstrukts temp proj expr:
Tt (temp proj expr) = ∧ Tt (temp proj)
= ∧ ∃ t ∈ Tt (temp elem proj) t = t
= ∧ ∃ t ∈ Tt (get time) t = t
Die zu transformierende get time–Anfrage stimmt mit der obigen get time–Anfrage überein (vgl. 4.11), es muß nur t an Stelle von t gesetzt werden sowie der in der linearen
Anfrage verwendete alias–Bezeichner a für ANGESTELLTER an Stelle von ang verwendet werden.
Insgesamt ergibt sich die folgende Kalkülanfrage:
Tt (query) =
{ang.AngName.t, ang.PersNr.t, ang.Position.t, t | (ang : ANGESTELLTER)
∧ ∃ t ∈
{t | ∃(ab : ABTEILUNG) ∧ ∃(a : ANGESTELLTER)
(ab.AbtName.t = ’Montage’ ∧ a.AngName.t = ’Müller’
∧ (a = ab.AbtLeiter.t ) ∧ t ∈ [t0 , t∞ ])} t = t }
123
Kapitel 4. Die TEER–Anfragesprache
124
Kapitel 5
Exemplarische Implementierung in
SQL
Dieser Abschnitt handelt von der Realisierung der graphischen
TEER–Anfragesprache für das ORACLE–Datenbankmanagementsystem (DBMS).
Dazu werden exemplarisch die graphischen Beispielanfragen
4.5 – 4.12 aus Kapitel
4.1.3 in SQL–Anfragen übersetzt. Ein allgemein
gültiger Algorithmus wird nicht gegeben.
5.1
Voraussetzungen in ORACLE
SQL
SQL, die Structured Query Language, ist die von ORACLE–DBMS
verwendete Datenbankanfragesprache. Zunächst wird die Struktur des
select–Kommandos vorgestellt, mit dem Anfragen in SQL formuliert
werden. Die Syntax dieses Befehls ist in [KL95] angegeben.
select distinct
from
where
Attribute
( Ausgabe“)
”
Relation(en) ( Eingabe“)
”
Bedingung ;
Die select–Klausel gibt an, für welche Attribute Werte
ausgegeben werden sollen. Die Anweisung distinct sorgt dafür,
daß kein Ergebnistupel doppelt ausgegeben wird. In der
from–Klausel werden diejenigen Relationen spezifiziert, aus denen
Attribute zu entnehmen sind. Ist ein Verbund zu bilden, d.h. bezieht
sich eine Anfrage auf mehr als eine Tabelle, so sind an dieser Stelle
mindestens zwei Tabellennamen anzugeben. Die where–Klausel gibt
125
Kapitel 5. Exemplarische Implementierung in SQL
Funktionsaufruf
add months(date,count)
greatest(date1,date2,date3,. . . )
least(date1,date2,date3,. . . )
last day(date)
months between(date1,date2)
next day(date,’day’)
new time(date,’this’,’other’)
round(date,’format’)
trunc(date,’format’)
to char(date,’format’)
to date(string,’format’)
Aufgabe
addiert count–viele Monate auf date
gibt das späteste Datum aus der Liste von Daten
zurück
gibt das früheste Datum aus der Liste von Daten
zurück
gibt das Datum des letzten Tages des Monats aus,
in dem date liegt
berechnet die Differenz date1 – date2 in Monaten
gibt das Datum des nächsten Tages namens ’day’
aus, der auf date folgt
rechnet die Angabe date von this Zeitzone1 in other
Zeitzone um
rundet einen date–Wert auf 00:00:00 des Tages date
ab, wenn date vor 12:00:00 liegt, sonst
auf den nächsten Tag 00:00:00 auf 2
setzt date auf 00:00:00 des Tages date 2
wandelt date in das Format format um
konvertiert eine Zeichenkette string in ein
ORACLE–Datum mit Format format
Tabelle 5.1: date–Funktionen in ORACLE
eine Selektionsbedingung an bzw. im Fall eines Verbunds außerdem eine
Bedingung, nach welcher dieser Verbund zu bilden ist. Die weiteren, hier
nicht angegebenen Klauseln group by, having und order by werden
nicht benötigt und daher nicht betrachtet. Eine SQL–Anweisung wird
mit einem Semikolon abgeschlossen.
Der Datentyp date
Datumsangaben werden von ORACLE in Spalten vom Datentyp
date in einem speziellen Format abgespeichert. Ein Datum besteht
für ORACLE nicht nur aus der Angabe von Tag, Monat und Jahr
sondern auch aus den zusätzlichen Angaben von Stunde, Minute und
Sekunde. Welche dieser Angaben in einer Tabelle sichtbar sind, ist
mit Hilfe eines speziellen SQL–Befehls einstellbar. Dieser
wird weiter unten vorgestellt, nachdem die Möglichkeiten zur
Formatangabe vorgestellt wurden.
1
Eine Zeitzone wird durch eine dreistellige
Buchstabenabkürzung angegeben, siehe [KL95].
2
Mit Hilfe von format können auch andere
126
5.1. Voraussetzungen in ORACLE
Auf date–Werte sind sowohl arithmetische als auch speziell
definierte Funktionen anwendbar. Die Addition von 1 auf einen
date–Wert z.B. liefert den auf dieses Datum folgenden Tag. Die
in ORACLE verfügbaren speziellen Funktionen sind in der
Tabelle 5.1 aufgeführt. Die Funktion to date wird
zur Erzeugung von Datumsangaben benötigt. Eine Zeichenkette der
Form ’1-1-1991’ wird von ORACLE nicht als Datum
erkannt. Um dies zu erreichen, ist die Zeichenkette
mit Hilfe der Funktion to date
in ein Datum umzuwandeln, wobei neben der Zeichenkette auch das
Eingabeformat
anzugeben ist. Die Zeichenkette hat dann diesem Format zu
entsprechen und wird in diesem Format gespeichert. Im Rahmen der
Erzeugung der Testdatenbank und der Beispiel–SQL–Anfragen
ist das Format ’DD-MM-YYYY’ gewählt worden. Ein Datum besteht
aus einer zweistelligen numerischen Angabe für Tag und Monat und einer
vierstelligen numerischen Angabe für das Jahr. Es gibt eine
Reihe von Möglichkeiten, das Datumsformat zu definieren, so sind auch
buchstabliche Abkürzungen oder die Verwendung vollständiger Monatsnamen
erlaubt. Eine vollständige Auflistung der date–Formate ist
in [KL95] zu finden.
Das Standard–Ausgabeformat von date–Spalten ist in
ORACLE von der Form ’DD--MMM-YY’. Das bedeutet, daß
unabhängig vom Eingabeformat Datumsangaben durch eine zweistellige
numerische Abkürzung für Tag und Jahr sowie eine dreistellige
buchstabliche Abkürzung für den Monat repräsentiert werden.
Mit Hilfe der folgenden SQL–Anweisung wird das Ausgabeformat
auf das oben gewählte Eingabeformat gesetzt:
alter session set NLS_DATE_FORMAT = ’DD-MM-YYYY’;
Der aktuelle Zeitpunkt tnow kann in ORACLE durch eine einfache
SQL–Anweisung erzeugt werden. Die Funktion sysdate gibt
das aktuelle Datum mit der aktuellen Zeit zurück. sysdate wird
in Anfragen wie ein numerisch angegebenes Datums verwendet.
Zeitpunkte, auf die auf– oder abgerundet werden soll, spezifiziert
werden, siehe [KL95].
127
Kapitel 5. Exemplarische Implementierung in SQL
5.2
Übersetzung der Beispielanfragen
Bei der Übersetzung der TEER–Beispielanfragen wird von der in
Kapitel 3.5 beschriebenen temporalen Testdatenbank
ausgegangen. Der Inhalt dieser Datenbank ist in den Tabellen
3.4 – 3.13 angegeben. Das bedeutet
insbesondere, daß sich die temporale Hierarchie der Schemaobjekte in den
Tabelleneinträgen widerspiegelt. Diese Voraussetzung macht eine
temporale Kontrolle in der Anfrage unnötig, wodurch sich
die Anfragen verkürzen. Dieses optimiert somit die Erstellung und
Bearbeitung der Anfragen. Konstrukte und Bezeichner werden in den allgemeinen
Erklärungen mit
dem Index SQL versehen, um bei Namensgleichheiten eine Verwechslung
mit den Konstrukten und Bezeichnern der linearen Schreibweise aus
Kapitel 4.1.3 zu vermeiden.
Ausgegangen wird im folgenden von einer im TEER–Anfrage–Editor
modellierten Anfrage.
5.2.1
Übersetzung des Get–Operators
Sämtliche im Editor markierten Attribute werden mit Hilfe der
select–Klausel ausgegeben:
select
attr listSQL ,
greatest(ent rel comp abbrevSQL .vt from
[ , ent rel comp abbrevSQL .vt from ]∗ )
least(ent rel comp abbrevSQL .vt to
[ , ent rel comp abbrevSQL .vt to ]∗ )
from ent nameSQL [ , ent rel nameSQL ]∗ [ ,
comp nameSQL ]∗
[ where join condSQL ]
wobei die Attributnamen in attr listSQL aus den
Attributnamen attr nameSQL und dem zugehörigen
Entitytyp– oder Relationshiptypnamen ent rel nameSQL
gebildet werden:
attr listSQL = ent rel nameSQL .attr nameSQL
[ , ent rel nameSQL .attr nameSQL ]∗
128
5.2. Übersetzung der Beispielanfragen
Dieses sichert die Eindeutigkeit der Attributnamen
bei Anfragen ab, die einen Join über mehrere Tabellen beinhalten.
Sind alle Attributnamen von vornherein eindeutig, oder bezieht sich
eine Anfrage nur auf eine Tabelle, so kann auf die Angabe des Typnamens
innerhalb des Attributnamens verzichtet werden. Ist die Angabe des
Typnamens erforderlich, kann
die Attributliste durch die Verwendung von alias–Bezeichnern
abbrevSQL für die Namen ent rel nameSQL
verkürzt werden:
attr listSQL = abbrevSQL .attr nameSQL
[ , abbrevSQL .attr nameSQL ]∗
Die Bezeichner abbrevSQL sind in der from–Klausel zu
deklarieren. Sie werden dort direkt hinter dem jeweilig zugehörigen
Namen angegeben.
Zusätzlich zu den Attributen werden Anfang und Ende des
Gültigkeitszeitraums für jedes Ergebnistupel mit ausgegeben. Dieser
läßt sich aus dem spätesten vt from–Eintrag und dem
frühesten vt to–Eintrag der Tabellen
ent rel comp nameSQL berechnen. Mit den in den
Funktionsaufrufen von greatest und least verwendeten
alias–Bezeichnern ent rel comp abbrevSQL sind solche
Tabellen gemeint, die für Ausgangstypen von Typkonstruktionen,
Relationships und mehrwertige Komponenten angelegt wurden. In den
Aufrufen dieser beiden Funktionen werden dieselben Tabellen angesprochenen.
Da nach der temporalen Hierarchie die temporalen Elemente
von Ausgangstypen von Typkonstruktionen, Relationships und Komponenten
kleiner als die der zugehörigen Entities sind, reicht es aus nur diese zu
betrachten. Bezieht sich eine Anfrage jedoch nur auf ein einziges,
allein stehendes Entity oder beinhaltet eine Anfrage nur ein
Relationship, eine Komponente oder Typkonstruktion, so reicht es aus, die
vt from– und vt to–Werte der entsprechenden Tabelle
auszugeben. Die Funktionen greatest und least brauchen nicht
benutzt zu werden.
Eine besondere Ausnahme bei der Angabe der Komponentennamen ist
gegeben, falls zwischen zwei Entitytypen mehr als eine Komponente
129
Kapitel 5. Exemplarische Implementierung in SQL
existiert. In einem solchen Fall werden die Funktionen greatest
und least auf vt from– und
vt to–Tabelleneinträge angewendet, die für das selektierte Tupel
nicht existieren müssen. Jedes Tupel wird auf Grund einer der
Komponenten ausgewählt, und es ist nicht zwingend notwendig, daß auch
eine Verbindung über die anderen Komponenten vorhanden ist. Die
Beispiele 4.9 und 4.10 beinhalten diesen
Fall. Einträge zu AbtLeiter müssen nicht unbedingt in der Tabelle
Mitarbeiter enthalten sein. Daher sind in solchen Fällen mehrere
Anfragen zu formulieren. Diese Problematik wird später bei der
Übersetzung der Anfragen 4.9 und 4.10
neu aufgegriffen.
Das im Editor befindliche TEER–Schema sei minimal, d.h. es befinden
sich keine unnötigen Elemente im Editor. In die from–Klausel
werden daher alle im Editor dargestellten Entities und Relationships
namentlich aufgenommen. Sie sind in der Datenbank durch eigene Tabellen
dargestellt. Mehrwertige Komponenten sind ebenfalls durch eigene
Tabellen dargestellt, und nur Namen solcher Komponenten werden der
from–Klausel hinzugefügt. Die Verwendung von
alias–Bezeichnern ist für sämtliche in der from–Klausel
angegebenen Tabellennamen erlaubt und, falls sie bei der Bildung von
Attributnamen verwendet werden, nötig.
from
ent rel nameSQL abbrevSQL
[ , ent rel nameSQL abbrevSQL ]∗
[ , comp nameSQL abbrevSQL ]∗
Das in der where–Klausel enthaltene Konstrukt
join condSQL beinhaltet die Bedingungen, nach denen ein
eventueller Verbund mehrerer Tabellen zu bilden ist. Dazu werden die
Surrogate einer jeden Tabellen benutzt, die nach dem Tabellennamen benannt
sind:
where
ent rel comp nameSQL $ = ent rel comp nameSQL $
[ and ent rel comp nameSQL $ = ent rel comp nameSQL $ ]∗
Eine Übersetzung der Standard–Projektion ist nicht nötig, da alle
in den Spalten vt from und vt to abgespeicherten Daten
in der geordneten Menge aller Zeitpunkte T und somit zwischen
t0 und t∞ liegen.
130
5.2. Übersetzung der Beispielanfragen
5.2.2
Übersetzung des Restrict–Operators
Jede in einer condition box formulierte Bedingung wird mit
and an die where–Klausel angefügt. Gibt es eine solche in
der bisherigen Anfrage noch nicht, wird sie jetzt eingeführt:
[ where | and ]
bool exprSQL
[ and bool exprSQL ]∗
wobei die boolesche Bedingung bool exprSQL direkt aus der
condition box übernommen wird. Der in der Formulierung von
bool expr verwendete Attributname ist um
den zugehörigen alias–Bezeichner zu erweitern.
Beispiel 5.1
Die zu der graphischen Anfrage 4.5 auf Seite
74 äquivalente SQL–Anfrage ist somit:
select distinct ChargenNr, ProdName,
greatest(g.vt_from, pr.vt_from),
least(g.vt_to, pr.vt_to)
from Produkt p, Abteilung ab, Firma f, produziert pr, gehoert_zu g
where f.Firma$ = g.Firma$ and
ab.Abteilung$ = g.Abteilung$ and
pr.Abteilung$ = ab.Abteilung$ and
p.Produkt$ = pr.Produkt$ and
ab.AbtName = ’Montage’ and
f.Firmenname = ’Prima’;
Das Ergebnis dieser Anfrage ist die folgende Tabelle:
CHARGENNR PRODNAME
FROM
TO
---------- ------------------------- ---------- ---------131
Kapitel 5. Exemplarische Implementierung in SQL
55778 Rennrad
01-01-1985 31-12-1986
56889 Rennrad
01-01-1990 30-06-1990
57911 Rennrad
01-01-1990 31-12-1990
57911 Rennrad
01-01-1991 30-04-1991
57911 Rennrad
01-05-1991 31-05-1991
57911 Rennrad
01-06-1991 31-12-1992
98102 Rennrad
01-09-1989 31-12-1990
98102 Rennrad
01-01-1991 30-04-1991
98102 Rennrad
01-05-1991 31-05-1991
98102 Rennrad
01-06-1991 31-12-1995
Die ausgegebenen Tupel besitzen die gewünschten Eigenschaften:
Das Surrogat der Firma Prima“ ist 1000, die der Abteilung
”
Montage“ haben die Werte 5000, 5012, 5034 und 5222. Der Tabelle
”
gehört zu sind die folgenden Beziehungen zwischen der Firma
”
Prima“ und der Abteilung Montage“ zu entnehmen:
”
FIRMA$ ABTEILUNG$ VT_FROM
VT_TO
-------- ---------- ---------- ---------1000
5000 01-01-1985 31-12-1990
1000
5012 01-01-1991 30-04-1991
1000
5034 01-06-1991 31-12-1995
1000
5222 01-05-1991 31-05-1991
Die von der Abteilung Montage“ produzierten Produkte sind
”
der Tabelle produziert zu finden:
132
5.2. Übersetzung der Beispielanfragen
PRODUKT$ ABTEILUNG$ VT_FROM
VT_TO
---------- ---------- ---------- ----------4000
5000
01-01-1985 31-12-1986
4005
5000
01-01-1990 30-06-1990
4010
5000
01-01-1990 31-12-1990
4010
5012
01-01-1991 30-04-1991
4010
5222
01-05-1991 31-05-1991
4010
5034
01-06-1991 31-12-1992
4015
5000
01-09-1989 31-12-1990
4015
5012
01-01-1991 30-04-1991
4015
5222
01-05-1991 31-05-1991
4015
5034
01-06-1991 31-12-1995
Da die Intervallangaben der Tabelle produziert kleiner als die der
Tabelle gehoert zu sind, werden die Zeitangaben der Tabelle
produziert zusammen mit den zu den Surrogaten Produkt$ gehörigen
Angaben der Chargennummer und dem Produktnamen aus der Tabelle
Produkt als Ergebnis ausgegeben.
5.2.3
Übersetzung des Query–result–link–Operators
Mit Hilfe eines Query–result–link–Operators wird eine boolesche Bedingung
für ein Attribut formuliert. Das betreffende Attribut soll mit dem Ergebnis
einer Unteranfrage verglichen werden. Nach der Definition des
Query–result–link–Operators besteht das Ergebnis der Unteranfrage aus
einem oder einer Menge von Werten desselben Attributs. Die von der
Unteranfrage selektierten Werte müssen keine temporalen Bedingungen
erfüllen. Nach der durch den TEER–Kalkül festgelegten Semantik,
muß auf die Ausgabewerte einer Query–result–link–Unteranfrage die
133
Kapitel 5. Exemplarische Implementierung in SQL
Standard–Projektion ausgeführt werden.
Diese erfüllen, wie bereits oben erklärt, alle in der temporalen
Datenbank enthaltenen Werte automatisch. Die durch den
Query–result–link formulierte Bedingung wird in einer SQL–Anfrage
in die where–Klausel mit aufgenommen.
Beispiel 5.2
Die Beispielanfrage 4.6 auf Seite
75 vergleicht mit Hilfe des
Query–result–link–Operators das Gehalt aller Angestellten mit dem
Preis des Produkts Rennrad“. Das in der übergeordneten
”
Anfrage verwendete Vergleichsprädikat >all ist auch in SQL
definiert. An Stelle der in der graphischen Anfrage darauf folgenden
Variable x wird in SQL direkt die Unteranfrage gesetzt. Die
Unteranfrage wird in folgende SQL–Anweisung übersetzt:
select distinct StPreis
from Produkt
where ProdName = ’Rennrad’;
Die Ausgabe von Gültigkeitszeiträumen ist nicht notwendig und
würde den direkten Vergleich mit den Gehältern der Angestellten
unmöglich machen. Da die Unteranfrage dann eine Menge von
Ergebnistupeln liefern würde. Der Gültigkeitszeitraum des
Unteranfrageergebnisses ist auch nicht von Interesse. Für den Fall,
daß das Ergebnis einer Anfrage von Gültigkeitszeiträumen abhängig sein soll,
steht der Time–link–Operator zur Verfügung.
Die zur Anfrage 4.6 äquivalente SQL–Anfrage ist
somit:
select distinct PersNr, AngName, Gehalt, vt_from, vt_to
from Angestellter
where Gehalt > all (select distinct StPreis
134
5.2. Übersetzung der Beispielanfragen
from Produkt
where ProdName =’Rennrad’);
Das Ergebnis dieser Anfrage besteht aus der ganzen Relation
Angestellter, da alle Angestellten mehr als das teuerste Rennrad
verdienen. Auf die Verwendung von alias–Bezeichnern kann verzichtet
werden, da sich sowohl die übergeordnete Anfrage als auch die
Unteranfrage jeweils nur auf ein Entity beziehen. Die Attributnamen
sind daher eindeutig.
Die Ergebnisrelation:
PERSNR ANGNAME
GEHALT VT_FROM
VT_TO
---------- --------------- ---------- ---------- ---------234 Mueller
5800 01-01-1985 31-12-1990
234 Mueller
6400 01-01-1991 31-12-1995
312 Hinz
5300 01-03-1987 31-12-1989
312 Hinz
6300 01-01-1990 31-12-9999
654 Schulz
6400 01-04-1989 31-12-9999
717 Kunz
8000 01-07-1990 31-12-1995
717 Kunz
8500 01-01-1996 31-12-9999
789 Vogel
3800 01-01-1990 31-12-9999
813 Schmidt
4000 01-01-1985 31-12-1987
877 Gross
5000 01-01-1985 31-12-9999
909 Klein
4500 01-01-1987 31-12-1990
921 Schiller
4000 01-01-1985 31-12-1995
987 Maier
7500 01-04-1990 30-09-1995
135
Kapitel 5. Exemplarische Implementierung in SQL
5.2.4
Übersetzung des temporalen Projektionsoperators
Eine temporale Projektion schränkt die Menge der
selektierten Daten auf einen Gültigkeitszeitintervall ein (sofern nicht die
Standard–Projektion angewendet wird). Die Attribute vt from
und vt to der Tabellen, die Datenabhängigkeiten
repräsentieren, müssen jetzt zusätzlich Bedingungen erfüllen. Das
projizierte temporale Element sei ein konstantes Intervall.
Entsprechend dem in der graphischen Anfrage verwendetem Prädikat
werden mehrere Bedingungen an die where–Klausel mit and
angefügt. Es müssen alle vt from– und vt to–Werte
derjenigen Tabellen, die in der Liste der Namen
ent rel comp nameSQL beim Aufruf der Funktionen
greatest und least angegeben sind, mit dem projizierten
Intervall verglichen werden.
Übersetzung der Prädikate
Das konstante Intervall sei [d from,d to], das
Vergleichsprädikat der Tabelle [vt from,vt to]. Die
umgangssprachlichen temporalen Prädikate der Menge PREDTDT werden zu
folgenden SQL–Anweisungen übersetzt:
1. Anfrage:
[vt from, vt to] before
[d from,d to]
SQL:
2. Anfrage:
vt to < to date(’d from’,’DD-MM-YYYY’)
[vt from, vt to] after
[d from,d to]
SQL:
3. Anfrage:
vt from > to date(’d to’,’DD-MM-YYYY’)
[vt from, vt to] during
[d from,d to]
SQL:
vt from >= to date(’d from’,’DD-MM-YYYY’)
and
vt to <= to date(’d to’,’DD-MM-YYYY’)
136
5.2. Übersetzung der Beispielanfragen
4. Anfrage:
[vt from, vt to] superior
[d from,d to]
SQL:
vt from <= to date(’d from’,’DD-MM-YYYY’)
and
vt to >= to date(’d to’,’DD-MM-YYYY’)
5. Anfrage:
[vt from, vt to] equivalent
[d from,d to]
SQL:
vt from = to date(’d from’,’DD-MM-YYYY’)
and
vt to = to date(’d to’,’DD-MM-YYYY’)
6. Anfrage:
[vt from, vt to] adjacent
[d from,d to]
SQL:
to date(’d from’,’DD-MM-YYYY’) −
vt to = 1 or
vt from −
to date(’d to’,’DD-MM-YYYY’) = 1
7. Anfrage:
[vt from, vt to] overlap
[d from,d to]
SQL:
vt from <= to date(’d to’,’DD-MM-YYYY’)
and
vt to >= to date(’d from’,’DD-MM-YYYY’)
Obwohl im Kalkül nicht alle diese Prädikate zugelassen waren, wurden
hier SQL–Anweisungen für alle gegeben, da sie alle in der
TEER–Anfragesprache zugelassen sind.
Beispiel 5.3
Die Beispielanfrage 4.7 von Seite
77 ist äquivalent zu der folgenden SQL–Anfrage.
137
Kapitel 5. Exemplarische Implementierung in SQL
select distinct ChargenNr, ProdName, StPreis,
greatest(l.vt_from, z.vt_from, p.vt_from),
least(l.vt_to, z.vt_to, p.vt_to)
from Produkt p, Vorprodukt v, Zulieferfirma z, Firma f, liefert l
where f.Firma$ = z.Firma$ and
z.Zulieferfirma$ = l.Zulieferfirma$ and
l.Vorprodukt$ = v.Vorprodukt$ and
v.Produkt$ = p.Produkt$ and
f.Firmenname = ’Prima’ and
l.vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
z.vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
p.vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
l.vt_to <= to_date(’31-12-1991’,’DD-MM-YYYY’) and
z.vt_to <= to_date(’31-12-1991’,’DD-MM-YYYY’) and
p.vt_to <= to_date(’31-12-1991’,’DD-MM-YYYY’);
Die Ergebnisrelation dieser Anfrage ist leer, da es keine Tupel gibt,
die die temporale Projektion erfüllen.
Es gibt zwar Produkte, die während des projizierten
Intervalls [01-01-1991,31-12-1991] von der Firma
Prima“ produziert wurden, aber nicht innerhalb. Das ist
”
augenscheinlich dasselbe, aber das during–Prädikat gibt den
Wert true nur dann zurück, wenn ein Intervall ganz innerhalb
eines anderen liegt.
Wird das Intervall [1/1/91,31/12/92] projiziert,
select distinct ChargenNr, ProdName, StPreis,
138
5.2. Übersetzung der Beispielanfragen
greatest(l.vt_from, z.vt_from, p.vt_from),
least(l.vt_to, z.vt_to, p.vt_to)
from Produkt p, Vorprodukt v, Zulieferfirma z, Firma f, liefert l
where f.Firma$ = z.Firma$ and
z.Zulieferfirma$ = l.Zulieferfirma$ and
l.Vorprodukt$ = v.Vorprodukt$ and
v.Produkt$ = p.Produkt$ and
f.Firmenname = ’Prima’ and
l.vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
z.vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
p.vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
l.vt_to <= to_date(’31-12-1992’,’DD-MM-YYYY’) and
z.vt_to <= to_date(’31-12-1992’,’DD-MM-YYYY’) and
p.vt_to <= to_date(’31-12-1992’,’DD-MM-YYYY’);
enthält das Ergebnis ein Tupel:
CHARGENNR PRODNAME
STPREIS FROM
TO
---------- ------------------------- ---------- ---------- ---------57911 Rennrad
5.2.5
1000 01-01-1991 31-12-1992
Übersetzung des True–time–Operators
Graphische Anfragen, die den True–time–Operator beinhalten, werden zu
geschachtelten SQL–Anfragen übersetzt. Eine True–Time ist der
Gültigkeitszeitraum einer booleschen Bedingung. Dieser Zeitraum wird
139
Kapitel 5. Exemplarische Implementierung in SQL
mit Hilfe einer einfachen select . . . from . . . where–Anfrage
ermittelt. Als Ergebnis liefert diese Anfrage eine Menge von Intervallen.
Beispiel 5.4
Der Gültigkeitszeitraum der Bedingung Auslastung > 80“ aus
”
Beispiel 4.8 von Seite 78 wird mit
Hilfe der Anfrage
select distinct vt_from, vt_to
from produziert
where Auslastung > 80;
bestimmt. Die Ergebnisrelation:
VT_FROM
VT_TO
---------- ---------01-01-1990 30-06-1990
01-01-1990 31-12-1990
01-01-1996 31-12-9999
Diese Intervallergebnisse führen zu drei Anfragen. In Beispiel
4.8 liefert der True–time–Operator das zu
projizierende Element einer temporalen Projektion.
So entstehen nach der oben beschriebenen
Übersetzung des Projektionsoperators drei Anfragen. Bei der ersten
Anfrage wird das Intervall [01-01-1990,30-06-1990], der zweiten das
Intervall [01-01-1990,31-12-1990] und der dritten das Intervall
[01-01-1996,31-12-9999] projiziert. Ein direkter Vergleich der
vt from– und
vt to–Werte derjenigen Tabellen, die von den Funktionen
greatest und least zur Bestimmung des Gültigkeitszeitraums
betrachtet werden, mit der Unteranfrage ist nicht möglich. Ein
solcher Vergleich hätte die Form:
140
5.2. Übersetzung der Beispielanfragen
vt_from >= any (select distinct vt_from
from produziert
where Auslastung > 80) and
vt_to <= any (select distinct vt_to
from produziert
where Auslastung > 80);
Dieser Vergleich führt aber dazu, daß nicht die obigen
Intervalle projiziert werden, sondern das sich aus den Unteranfragen
größte bildende Intervall; d.h. das Intervall [01-01-1990,31-12-9999] wird
projiziert. Damit werden aber auch Produkte selektiert, die in dem
Intervall [01-01-1991,31-12-1995] liegen. Dieses Intervall ist nicht
in dem zu projizierenden Zeitraum enthalten, aber in dem sich größten
bildenden Intervall. Um die richtigen Zeiträume zu projizieren, sind
somit drei Anfragen zu formulieren, in denen jeweils eines der
berechneten Intervalle projiziert wird.
1.
select distinct ChargenNr, ProdName, AbtName, pr.vt_from, pr.vt_to
from Produkt p, produziert pr, Abteilung a
where p.Produkt$ = pr.Produkt$ and
pr.Abteilung$ = a.Abteilung$ and
pr.vt_from >= to_date(’01-01-1990’,’DD-MM-YYYY’) and
pr.vt_to <= to_date(’30-06-1990’,’DD-MM-YYYY’);
2.
select distinct ChargenNr, ProdName, AbtName, pr.vt_from, pr.vt_to
from Produkt p, produziert pr, Abteilung a
where p.Produkt$ = pr.Produkt$ and
141
Kapitel 5. Exemplarische Implementierung in SQL
pr.Abteilung$ = a.Abteilung$ and
pr.vt_from >= to_date(’01-01-1990’,’DD-MM-YYYY’) and
pr.vt_to <= to_date(’31-12-1990’,’DD-MM-YYYY’);
3.
select distinct ChargenNr, ProdName, AbtName, pr.vt_from, pr.vt_to
from Produkt p, produziert pr, Abteilung a
where p.Produkt$ = pr.Produkt$ and
pr.Abteilung$ = a.Abteilung$ and
pr.vt_from >= to_date(’01-01-1996’,’DD-MM-YYYY’) and
pr.vt_to <= to_date(’31-12-9999’,’DD-MM-YYYY’);
Auf die Verwendung der Funktionen greatest und least in
der select–Klausel kann
in diesem Beispiel verzichtet werden, da das Relationship
produziert das einzige in diese Anfrage einbezogene TEER–Konzept ist,
das in eine Datenabhängigkeit darstellende Tabelle transformiert
worden ist. Die vt from– und vt to–Werte der Tabelle
produziert können somit direkt ausgegeben werden.
Diese drei Anfragen können zu einer einzigen Anfrage mit Hilfe der
SQL–Anweisung union kombiniert werden. Die
union–Anweisung ist auf zwei Anfragen anwendbar, deren
Ausgabeformate identisch sind. Das Ausgabeformat ist durch
die Anzahl der ausgegebenen Werte zusammen mit der Reihenfolge der Datentypen
festgelegt.
Die union–Anweisung kombiniert die Ausgabetabellen solch
passender Anfragen zu einer gemeinsamen, wobei Duplikate eliminiert
werden.
select distinct ChargenNr, ProdName, AbtName, pr.vt_from, pr.vt_to
142
5.2. Übersetzung der Beispielanfragen
from Produkt p, produziert pr, Abteilung a
where p.Produkt$ = pr.Produkt$ and
pr.Abteilung$ = a.Abteilung$ and
pr.vt_from >= to_date(’01-01-1990’,’DD-MM-YYYY’) and
pr.vt_to <= to_date(’30-06-1990’,’DD-MM-YYYY’)
union
(select distinct ChargenNr, ProdName, AbtName, pr.vt_from, pr.vt_to
from Produkt p, produziert pr, Abteilung a
where p.Produkt$ = pr.Produkt$ and
pr.Abteilung$ = a.Abteilung$ and
pr.vt_from >= to_date(’01-01-1990’,’DD-MM-YYYY’) and
pr.vt_to <= to_date(’31-12-1990’,’DD-MM-YYYY’)
union
select distinct ChargenNr, ProdName, AbtName, pr.vt_from, pr.vt_to
from Produkt p, produziert pr, Abteilung a
where p.Produkt$ = pr.Produkt$ and
pr.Abteilung$ = a.Abteilung$ and
pr.vt_from >= to_date(’01-01-1996’,’DD-MM-YYYY’) and
pr.vt_to <= to_date(’31-12-9999’,’DD-MM-YYYY’));
Das Ergebnis dieser Anfrage ist die folgende Tabelle. Alle
vt from– und vt to–Werte liegen in dem durch die boolesche
Bedingung Auslastung >80“ bestimmten Zeitraum.
”
CHARGENNR
PRODNAME
ABTNAME
143
FROM
TO
Kapitel 5. Exemplarische Implementierung in SQL
---------- ------------------------- --------------- ---------- ---------98102 Rennrad
Lackiererei
01-01-1996 31-12-9999
56889 Rennrad
Montage
01-01-1990 30-06-1990
57911 Rennrad
Montage
01-01-1990 31-12-1990
5.2.6
Übersetzung des temporalen Selektionsoperators
Der temporale Selektionsoperator besteht aus einem
True–time–Operator, einem temporalen Prädikat und einem
Gültigkeitszeitraum, die auf einen Entity– oder Relationshiptyp
angewendet werden. Dieser Selektionsoperator wird zu einer
SQL–Unteranfrage übersetzt. Die Unteranfrage liefert als Ergebnis
das zeitinvariante Surrogat t inv$.
Beispiel 5.5
Die Selektion aus Beispiel 4.9 auf Seite 80
wird in die SQL–Anweisung
select distinct t_inv$
from Abteilung
where AbtName = ’Montage’ and
vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
vt_to <= to_date(’30-06-1991’,’DD-MM-YYYY’);
übersetzt. Diese Unteranfrage wird in einer where–Klausel einer
übergeordneten Anfrage aufgerufen. Über das Surrogat t inv$
werden alle Mitarbeiter und Abteilungsleiter, die jemals in der
entsprechenden Abteilung gearbeitet haben, arbeiten oder arbeiten werden,
selektiert. Die obige Anfrage liefert das zeitinvariante Surrogat
t inv$ = 995000. Die zu diesem Surrogat t inv$ gehörigen
Surrogate Abteilung$ sind 5000, 5012, 5034 und 5222. Alle
Mitarbeiter und Abteilungsleiter, die zu diesen Abteilungen gehören,
144
5.2. Übersetzung der Beispielanfragen
werden als Ergebnis ausgegeben.
Wie bereits oben erwähnt ist eine graphische Anfrage, die zwei
Komponenten zwischen zwei Entitytypen beinhaltet, nicht in eine SQL–
Anfrage übersetzbar. Es müssen zwei Anfragen formuliert werden,
wobei sich die eine auf die Komponente AbtLeiter, die andere auf die
Komponente Mitarbeiter bezieht. Da beide Anfragen dasselbe
Ausgabeformat besitzen, können sie über die union–Anweisung
zu einer einzigen Anfrage zusammengesetzt werden. Die SQL–Anfrage
für Beispiel 4.9 lautet:
select distinct PersNr, AngName, Gehalt, mit.vt_from, mit.vt_to
from Angestellter ang, Abteilung ab, Mitarbeiter mit
where ab.Abteilung$ = mit.Abteilung$ and
mit.Mitarbeiter = ang.Angestellter$ and
ab.t_inv$ = (select distinct t_inv$
from Abteilung
where AbtName = ’Montage’ and
vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
vt_to <= to_date(’30-06-1991’,’DD-MM-YYYY’))
union
select distinct PersNr, AngName, Gehalt, ab.vt_from, ab.vt_to
from Angestellter ang, Abteilung ab
where ab.AbtLeiter = ang.Angestellter$ and
ab.t_inv$ = (select distinct t_inv$
from Abteilung
where AbtName = ’Montage’ and
vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
145
Kapitel 5. Exemplarische Implementierung in SQL
vt_to <= to_date(’30-06-1991’,’DD-MM-YYYY’));
Die Ergebnisrelation:
PERSNR ANGNAME
GEHALT VT_FROM
---------- --------------- ---------- ---------
VT_TO
----------
234 Mueller
5800 01-01-1985 31-12-1990
312 Hinz
6300 01-06-1991 31-12-1995
654 Schulz
6400 01-05-1991 31-05-1991
789 Vogel
3800 01-01-1990 31-12-1999
813 Schmidt
4000 01-01-1985 31-12-1987
877 Gross
5000 01-01-1985 31-12-1987
909 Klein
4500 01-01-1987 31-12-1990
921 Schiller
4000 01-01-1985 31-12-1990
921 Schiller
4000 01-01-1991 30-04-1991
921 Schiller
4000 01-05-1991 31-05-1991
921 Schiller
4000 01-06-1991 31-12-1994
987 Maier
7500 01-01-1991 30-04-1991
Beispiel 5.6
Die graphische Anfrage 4.10 auf Seite
81 entspricht der Anfrage 4.9,
erweitert um eine temporale Projektion. Es wird das Zeitintervall
[1/1/95,31/1/95] projiziert. Die Anfrage hat, nach dem bisherigen
Übersetzungsschema vorgehend, unter Verwendung der SQL–Anfrage
5.5 die Form:
146
5.2. Übersetzung der Beispielanfragen
select distinct PersNr, AngName, Gehalt,
mit.vt_from, mit.vt_to
from Angestellter ang, Abteilung ab, Mitarbeiter mit
where ab.Abteilung$ = mit.Abteilung$ and
mit.Mitarbeiter = ang.Angestellter$ and
ab.t_inv$ = (select distinct t_inv$
from Abteilung
where AbtName = ’Montage’ and
vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
vt_to <= to_date(’30-06-1991’,’DD-MM-YYYY’)) and
mit.vt_from >= to_date(’01-01-1995’,’DD-MM-YYYY’) and
mit.vt_to <= to_date(’31-01-1995’,’DD-MM-YYYY’)
union
select distinct PersNr, AngName, Gehalt, ab.vt_from, ab.vt_to
from Angestellter ang, Abteilung ab, Mitarbeiter mit
where ab.AbtLeiter = ang.Angestellter$ and
ab.t_inv$ = (select distinct t_inv$
from Abteilung
where AbtName = ’Montage’ and
vt_from >= to_date(’01-01-1991’,’DD-MM-YYYY’) and
vt_to <= to_date(’30-06-1991’,’DD-MM-YYYY’)) and
ab.vt_from >= to_date(’01-01-1995’,’DD-MM-YYYY’) and
ab.vt_to <= to_date(’31-01-1995’,’DD-MM-YYYY’);
147
Kapitel 5. Exemplarische Implementierung in SQL
Wie der Ergebnisrelation der Anfrage 4.9 zu entnehmen
ist, gibt es keine Angestellten, die die temporale Projektion
erfüllen. Es gibt zwar Personen, die während des projizierten
Intervalls [01-01-1995,31-01-1995] in der Abteilung
”
Montage“ gearbeitet haben, aber nicht innerhalb. Daher ist die
Ergebnisrelation der SQL–Anfrage zu Beispiel 4.10 leer.
5.2.7
Übersetzung des Time–link–Operators
Das Vorgehen bei der Übersetzung des Time–link–Operators unterscheidet
sich kaum vom bisher beschriebenen. Das Ergebnis einer
Time–link–Anfrage ist ein temporales Element. Dieses Element gibt
denjenigen Zeitraum an, in dem die selektierten Tupel gültig sind. Die
select–Klausel der SQL–Anweisung beinhaltet somit keine
Attributliste attr listSQL sondern besteht aus der
Angabe der Zeitfunktionen greatest und least, sofern der
Time–link–Operator nicht im Rahmen einer temporalen Projektion oder
Selektion benutzt wird.
select distinct greatest(ent rel comp abbrevSQL .vt from
[ , ent rel comp abbrevSQL .vt from ]∗ )
least(ent rel comp abbrevSQL .vt to
[ , ent rel comp abbrevSQL .vt to ]∗ )
Beispiel 5.7
Die Anfrage 4.11 von Seite 83
repräsentiert den Fall, daß ein temporales Element als Endergebnis
ausgegeben werden soll. Die zu dieser graphischen Anfrage
äquivalente SQL–Anweisung ist demnach:
select distinct ab.vt_from, ab.vt_to
from Abteilung ab, Angestellter ang
where ab.AbtLeiter = ang.Angestellter$ and
AbtName = ’Montage’ and
AngName = ’Mueller’;
148
5.2. Übersetzung der Beispielanfragen
Da die Anfrage 4.11 keine Relationshiptypen oder
Typkonstruktionen beinhaltet, sondern sich nur auf eine einzige
Komponente bezieht, kann auf die Verwendung der Funktionen
greatest und least verzichtet werden.
Das Ergebnis dieser Anfrage besteht aus einem Tupel, da der
Angestellter Müller“ nur einmal Leiter der
”
Abteilung Montage“ war.
”
VT_FROM
VT_TO
---------- ---------01-01-1985 31-12-1990
Beispiel 5.8
Die Beispielanfrage 4.12 von Seite
84 ist aus einem Time–link und einer temporalen
Projektion zusammengesetzt. Bei der Übersetzung einer solchen Projektion
bestehen dieselben Schwierigkeiten wie bei der Übersetzung einer
projizierten True–time. Um den Gültigkeitszeitraum korrekt zu
projizieren, muß der projizierte Zeitraum bekannt sein. Besteht der
Gültigkeitszeitraum aus mehreren Intervallen, ist eine
Anfrage, die das Ergebnis eines Time–links projiziert, nicht in eine
einzige SQL–Anfrage übersetzbar. Die Anfragen können jedoch durch
die union–Anweisung zu einer Anfrage zusammengefügt werden.
Dieses ist bei der Beispielanfrage 4.12 nicht
notwendig, da die get time–Unteranfrage nur ein einziges
Intervall als Ergebnis zurückgibt. Die verwendete Unteranfrage ist
identisch der Anfrage 4.11.
Die Fortsetzung der der Anfrage 4.12 entsprechenden SQL–Anfrage ist
folglich:
select distinct PersNr, AngName, Position, ang.vt_from, ang.vt_to
from Angestellter ang
149
Kapitel 5. Exemplarische Implementierung in SQL
where ang.vt_from >= to_date(’01-01-1985’,’DD-MM-YYYY’) and
ang.vt_to <= to_date(’31-12-1990’,’DD-MM-YYYY’);
Das Ergebnis der obigen SQL–Anfrage ist die folgende Tabelle:
PERSNR ANGNAME
POSITION
VT_FROM
VT_TO
---------- --------------- -------------------- ---------- ---------234 Mueller
AbtLeiter
01-01-1985 31-12-1990
312 Hinz
AbtLeiter
01-05-1987 31-12-1989
813 Schmidt
Monteur
01-01-1985 31-12-1987
909 Klein
Techniker
01-01-1987 31-12-1990
150
Kapitel 6
Kritik und Ausblick
In diesem Kapitel werden kritische Anmerkungen zum Entwurf der vorgestellten TEER–
Anfragesprache sowie des TEER–Kalküls gemacht. Desweiteren werden mögliche Spracherweiterungen vorgestellt.
Kritik
Im Rahmen dieser Diplomarbeit ist es gelungen, eine eindeutige Syntax und Semantik für
eine graphische temporale Anfragesprache, die TEER–Anfragesprache, zu definieren. Zur
Festlegung der Semantik wurde zwar die Syntax der der TEER–Anfragesprache sowie des
zugehörigen TEER–Schemas eingeschränkt, aber auch diese eingeschränkte Sprache ist
sehr mächtig. Beleg dafür sind die Beispielanfragen aus Kapitel 4.1. Das Konzern–Schema,
an das alle Beispielanfragen gestellt werden, erfüllt die in dem Abschnitt Transformation
”
in den TEER–Kalkül“ getroffenen Voraussetzungen. Die im Rahmen der Transformation
nicht zugelassenen Syntaxkonstrukte sind ebenfalls in keiner der Beispielanfragen verwendet worden. Dennoch lassen sich so komplexe Anfragen stellen, daß es Schwierigkeiten
bereitet diese Anfragen umgangssprachlich auszudrücken.
Beim Entwurf des TEER–Kalküls wurde die naheliegende Erweiterung des EER–Kalküls
um einen Zeitpunkt gewählt. Diese Abhängigkeit der TEER–Kalkülausdrücke von einem
festen Zeitpunkt ermöglicht die Definition der Semantik des Kalküls. Die Semantik eines
Kalküls kann nur in Abhängigkeit von einem festen Datenbank–Zustand definiert werden.
Der Datenbank–Zustand einer temporalen Datenbank wiederum ist von festen Zeitpunkten abhängig. Der allgemeine Begriff des temporalen Elements erschien für diesen Zweck
zu variabel, da es sich bei einem temporalen Element um eine große Menge von Zeitpunkten handeln kann. Für eine diesbezügliche Verallgemeinerung des TEER–Kalküls war der
zeitliche Rahmen dieser Diplomarbeit zu klein. Die Definition der Semantik der TEER–
Anfragesprache und die damit verbundene Definition des TEER–Kalküls sowie der gegebenen Transformationsregeln haben sich als sehr aufwendig erwiesen. Das Hauptanliegen
dieser Arbeit war die eindeutige Definition der Semantik für eine graphische temporale
Anfragesprache, was auf Kosten von Aussagen über die Ausdrucksfähigkeit der Sprache
und einer allgemeinen SQL–Implementierung realisiert wurde. Diese Themen haben sich
als zu aufwendig im Rahmen dieser Diplomarbeit erwiesen.
Die vorgestellte TEER–Anfragesprache basiert auf dem Sprachvorschlag [KG95]. Einige
151
Kapitel 6. Kritik und Ausblick
der dort getroffenen, nicht übernommenen Konventionen sind jedoch inpraktikabel und
verkomplizieren die Formulierung von Anfragen. Solche Konventionen sind nicht übernommen sondern durch neue Bestimmungen ersetzt worden. In [KG95] ist festgelegt, daß
eine nicht temporale Anfrage nur zum aktuellen Zeitpunkt ausgewertet wird. Im Gegensatz dazu erfolgt in der TEER–Anfragesprache die Auswertung einer solchen Anfrage zu
jedem Schnappschuß des Datenbankinhalts. Die Interpretation in [KG95] bewirkt, daß auf
Grund einer temporalen Projektion historische, gegenwärtige oder zukünftige Datensätze
ausgegeben werden, die im aktuellen Datenbankzustand gültig sind und eventuell formulierte Bedingungen erfüllen. Die Selektion historischer, gegenwärtige oder zukünftige
Daten ist somit vom aktuellen Datenbank–Zustand abhängig. Die ausgegebenen Daten
müssen diese Bedingungen nicht erfüllen. Datensätze, die im Gegensatz dazu in dem projizierten Zeitraum gültig sind und die Selektionsbedingungen erfüllen, aber nicht zum
aktuellen Zeitpunkt Gültigkeit haben, werden nicht mit ausgegeben. Damit die Sprache
[KG95] dasselbe Ergebnis wie die TEER–Anfragesprache ausgibt, ist eine Anfrage, die
eine temporale Selektion mit einer anschließenden Projektion beinhaltet, zu formulieren.
Die temporalen Elemente der Selektion und der Projektion müssen dabei identisch sein.
Das bedeutet, daß eine Projektion in der TEER–Anfragesprache einer Selektion mit anschließender Projektion in der Sprache [KG95] entspricht.
Eine weitere entscheidende Änderung ist für den Query–result–link–Operator getroffen
worden. Der Sprachvorschlag [KG95] sieht vor, daß ein erweiterter Vergleichsoperator
Θall oder Θany nur dann zu verwenden ist, wenn der Benutzer weiß“, daß die Unteran”
frage eine Menge von Werten zurückgibt; ansonsten ist die Angabe von Θ ausreichend.
Diese syntaktische Regel der graphischen Anfragesprache [KG95] setzt voraus, daß der
Benutzer den Inhalt der Datenbank, an die er eine Anfrage stellen will, genau kennt.
In den seltensten Fällen wird dieses der Realität entsprechen, so daß schnell semantisch
falsche Anfragen formuliert werden.
Bei der exemplarischen Implementierung der Beispielanfragen in ORACLE hat sich gezeigt, daß es problematisch ist, eine Anfragesprache für ein nicht formal definiertes DBMS
zu realisieren, wenn keine Möglichkeit vorhanden ist, die geforderten Erweiterungen zum
DBMS zu simulieren. Es fehlen ein Datendefinitions– und ein Datenmanipulationstool
zur Erzeugung temporaler Datenbanken, die das TEER–Modell abbilden können. Daher
wurde eine Testdatenbank angelegt, die nicht als temporale Datenbank bezeichnet werden
darf. Die Einhaltung der temporalen Hierarchie wird von der Datenbank nicht überprüft.
Eine Erweiterung des TEER–Anfrage–Editors zu einer graphischen Benutzerschnittstelle,
die eine Verbindung zum ORACLE–DBMS herstellt, hätte diese Problematik verschärft.
Der Benutzer mußte absichern, daß das dargestellte Schema in der Datenbank realisiert
ist. Das Programm EDE, das im Rahmen der Diplomarbeit [Zec97] erstellt wurde, kann zu
der Transformation eines TEER–Modells in das Relationenmodell nicht benutzt werden,
da die für eine temporale Datenbank benötigten Schlüsselbedingungen nicht erzeugt werden können. Die in einer temporalen Datenbank zusätzlichen Spalten für den Anfangs–
und den Endzeitpunkt des Gültigkeitszeitraums sowie das zeitinvariante Surrogat könnten indes noch als zusätzliche Attribute der Entity– und Relationshiptypen angelegt werden. Wird ein solches EER–Schema in EDE als Simulation eines äquivalenten TEER–
Schemas modelliert, dürfen die entsprechenden SQL create table–Anweisungen nicht
nach ORACLE sondern nur in eine Datei ausgegeben werden. Der Benutzer kann so einen
Eindruck von den zu erzeugenden temporalen Tabellen und ihren Beziehungen unterein152
ander erhalten. Dieser Weg ist die im Moment die einzig verfügbare Unterstützung, die
der Benutzer bei der Erzeugung einer temporalen Datenbank bekommen kann.
Ausblick
In der Menge der Operatoren der TEER–Standarddatentyp–Signatur sind Filter– und
Mengenoperatoren enthalten, die in der TEER–Anfragesprache nicht enthalten sind.
Die Filteroperatoren first, last, min duration und max duration sind auf temporale Elemente anwendbar und geben ein oder mehrere Zeitintervalle zurück. Ein solcher Filteroperator kann dann z.B. in einer Anfrage, in der das Ergebnis einer Time–link–Unteranfrage
auf eine übergeordnete Anfrage projiziert wird, Verwendung finden. Eine Anfrage des
genannten Typs, ist die Beispielanfrage 4.12.
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem Müller
”
Leiter der Abteilung ’Montage’ ist ?“
Wird in diese Anfrage ein Filteroperator eingebunden, müssen nicht mehr alle Zeiträume,
in den Müller Leiter der Abteilung Montage war, projiziert werden, sondern es kann aus
dieser Menge von Zeitintervallen ein bestimmtes, z.B. das früheste längste, ausgewählt
werden. Die gestellte Anfrage lautet dann umgangssprachlich:
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem Müller
”
zum ersten Mal Leiter der Abteilung ’Montage’ war ?“
Die auf temporalen Elementen zugelassenen Mengenoperatoren sind die m–stellige Vereinigung, der m–stellige Durchschnitt und die Differenz zweier temporaler Elemente. Mit
Hilfe dieser Operatoren sind sehr komplexe Anfragen formulierbar, da es möglich wäre,
aus mehreren temporalen Elementen ein einziges zu erzeugen. Damit könnten innerhalb
temporaler Selektionen oder Projektionen mehrere temporale Elemente gleichzeitig verwendet werden. So könnte z.B. das Ergebnis eines True–time–Operators mit dem Ergebnis
eines Time–link–Operators vereinigt werden und dieses Ergebnis auf eine übergeordnete
Anfrage projiziert werden. Eine solche Anfrage könnte lauten:
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem Müller
”
Leiter der Abteilung ’Montage’ ist oder die Auslastung mindestens einer Abteilung über
80% liegt ?“
Wird in eine solche Anfrage zusätzlich noch ein Filteroperator eingebunden, kann gefragt
werden:
Welche Angestellten arbeiten in welcher Position innerhalb des Zeitraums, in dem Müller
”
am längsten Leiter der Abteilung ’Montage’ ist oder die Auslastung mindestens einer
Abteilung am längsten über 80% liegt ?“
Als weitere Erweiterungsmöglichkeit bieten sich die in jedem konventionellen DBMS
verfügbaren Aggregationsfunktionen an. Mit Hilfe dieser hier vorgestellten Erweiterungsmöglichkeiten vergrößert sich die Menge der formulierbaren Anfragen enorm. Für
alle diese Erweiterungen müßten neue graphische Objekte definiert werden sowie die Syntax und Semantik festgelegt werden.
Eine andere Möglichkeit die TEER–Anfragesprache zu erweitern, besteht darin, auch
Anfragen an den Existenzzeitraum von Daten zuzulassen. Dafür wird eine Datenbank
153
Kapitel 6. Kritik und Ausblick
benötigt, die zusätzlich zur Valid–Time auch die Transaction–Time unterstützt. Die Anfragekonstrukte sind dann auf beide Zeitarten anwendbar, der Benutzer muß entscheiden,
ob sich seine Anfrage auf die Valid– oder die Transaction–Time bezieht.
Als eine zusätzliche Spracherweiterung bieten sich in diesem Zusammenhang die temporalen Operatoren timeslice“ und moving window“ an. Der Timeslice–Operator liefert,
”
”
auf die Valid–Time angewendet, alle zu einem festen Zeitpunkt gültigen Datensätze, d.h.
ein Schnappschuß des Datenbankinhalts zu diesem Zeitpunkt wird ausgegeben. Dieser zu
spezifizierende Zeitpunkt kann beliebig gewählt sein. Wird der Timeslice–Operator dagegen auf die Transaction–Time angewendet, muß dieser Zeitpunkt in der Vergangenheit
liegen oder das aktuelle Datum sein. Als Ergebnis gibt der Timeslice–Operator dann alle
zu dem angegebenen Zeitpunkt in der Datenbank existierenden Datensätze zurück. Der
Timeslice–Operator ist natürlich auch für eine Anfragesprache an eine Datenbank, die nur
die Valid–Time unterstützt, eine sinnvolle Erweiterung.
Der Moving–window–Operator beschreibt ein Zeitintervall konstanter Länge. Eine Anfrage, die ein Moving–window beinhaltet, wird dann in allen existierenden Intervallen in der
Zeit T ausgewertet, die die Länge des spezifizierten Intervalls haben. Das bedeutet, das
mit dem Moving–window–Operator ein frei bewegliches Intervall fester Länge angegeben
wird, für das die Anfrageauswertung erfolgt.
154
Anhang A
Implementierung der Testdatenbank
Anmerkungen zu dem verwendeten date–Format sowie der Erzeugung von Datumsangaben in ORACLE sind in Abschnitt 5.1 zu finden.
A.1
Die Tabelle Firma
drop table Firma cascade constraints;
create table Firma (
Firma$ number not null,
t_inv$ number not null,
Firmenname varchar2(15) not null,
vt_from date not null,
vt_to date not null,
primary key (Firma$));
insert into Firma
values (1000, 991000, ’Prima’, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Firma
values (1001, 991001, ’Trumpf’, to_date(’01/07/1985’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into Firma
values (1004, 991004, ’Zonk’, to_date(’01/09/1987’,’DD/MM/YYYY’),
to_date(’31/08/1997’,’DD/MM/YYYY’));
insert into Firma
values (1005, 991005, ’Flop’, to_date(’01/01/1997’,’DD/MM/YYYY’),
to_date(’31/07/1997’,’DD/MM/YYYY’));
insert into Firma
values (1006, 991006, ’Top’, to_date(’01/01/1998’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
155
Kapitel A. Implementierung der Testdatenbank
A.2
Die Tabelle Angestellter
drop table Angestellter cascade constraints;
create table Angestellter (
Angestellter$ number unique,
t_inv$ number not null,
AngName char(15) not null,
PersNr integer not null,
Gehalt number not null,
Position char(20) not null,
vt_from date not null,
vt_to date not null,
primary key (Angestellter$));
insert into Angestellter
values (7018, 997010, ’Mueller’, 234, 5800, ’AbtLeiter’,
to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into Angestellter
values (7019, 997010, ’Mueller’, 234, 6400, ’AbtLeiter’,
to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
insert into Angestellter
values (7099, 997040, ’Maier’, 987, 7500, ’AbtLeiter’,
to_date(’01/04/1990’,’DD/MM/YYYY’),
to_date(’30/09/1995’,’DD/MM/YYYY’));
insert into Angestellter
values (7111, 997045, ’Schulz’, 654, 6400, ’AbtLeiter’,
to_date(’01/04/1989’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Angestellter
values (7001, 997000, ’Hinz’, 312, 5300, ’AbtLeiter’,
to_date(’01/03/1987’,’DD/MM/YYYY’),
to_date(’31/12/1989’,’DD/MM/YYYY’));
insert into Angestellter
values (7002, 997000, ’Hinz’, 312, 6300, ’AbtLeiter’,
to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Angestellter
values (7987, 997050, ’Kunz’, 717, 8000, ’AbtLeiter’,
to_date(’01/07/1990’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
insert into Angestellter
values (7988, 997050, ’Kunz’, 717, 8500, ’AbtLeiter’,
to_date(’01/01/1996’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
156
A.3. Die Tabelle Abteilung
insert into Angestellter
values (7020, 997015, ’Schmidt’, 813, 4000, ’Monteur’,
to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1987’,’DD/MM/YYYY’));
insert into Angestellter
values (7025, 997020, ’Schiller’, 921, 4000, ’Monteur’,
to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
insert into Angestellter
values (7030, 997025, ’Vogel’, 789, 3800, ’Maler’,
to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Angestellter
values (7035, 997030, ’Klein’, 909, 4500, ’Techniker’,
to_date(’01/01/1987’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into Angestellter
values (7040, 997035, ’Gross’, 877, 5000, ’stellv. AbtLeiter’,
to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
A.3
Die Tabelle Abteilung
drop table Abteilung cascade constraints;
create table Abteilung (
Abteilung$ number unique,
t_inv$ number not null,
AbtName varchar2(15) not null,
AbtLeiter number not null references Angestellter(Angestellter$),
vt_from date not null,
vt_to date not null,
primary key (Abteilung$));
insert into Abteilung
values (5000, 995000, ’Montage’, 7018, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into Abteilung
values (5012, 995000, ’Montage’, 7099, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’30/04/1991’,’DD/MM/YYYY’));
insert into Abteilung
values (5222, 995000, ’Montage’, 7111, to_date(’01/05/1991’,’DD/MM/YYYY’),
to_date(’31/05/1991’,’DD/MM/YYYY’));
insert into Abteilung
values (5034, 995000, ’Montage’, 7002, to_date(’01/06/1991’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
157
Kapitel A. Implementierung der Testdatenbank
insert into Abteilung
values (5011, 995010, ’Lackiererei’, 7987, to_date(’01/01/1996’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Abteilung
values (5333, 995010, ’Lackiererei’, 7018, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
A.4
Die Tabelle Produkt
drop table Produkt cascade constraints;
create table Produkt (
Produkt$ number unique,
t_inv$ number not null,
ChargenNr number not null,
ProdName varchar2(25) not null,
StPreis number not null,
vt_from date not null,
vt_to date not null,
primary key (Produkt$));
insert into Produkt
values (4000, 994000, 55778, ’Rennrad’, 1200,
to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1986’,’DD/MM/YYYY’));
insert into Produkt
values (4005, 994005, 56889, ’Rennrad’, 1150,
to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’30/06/1990’,’DD/MM/YYYY’));
insert into Produkt
values (4010, 994010, 57911, ’Rennrad’, 1000,
to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’31/12/1992’,’DD/MM/YYYY’));
insert into Produkt
values (4015, 994015, 98102, ’Rennrad’, 1050,
to_date(’01/09/1989’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Produkt
values (4020, 994020, 75432, ’Rennrad’, 1400,
to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1986’,’DD/MM/YYYY’));
insert into Produkt
values (4025, 994020, 75432, ’Rennrad’, 1700,
to_date(’01/01/1987’,’DD/MM/YYYY’),
to_date(’31/12/1987’,’DD/MM/YYYY’));
insert into Produkt
158
A.5. Die Tabelle Mitarbeiter
values (4030, 994030, 77641, ’Rennrad’, 1800,
to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’31/12/1992’,’DD/MM/YYYY’));
insert into Produkt
values (4035, 994035, 12341, ’Rennrad’, 1600,
to_date(’01/01/1992’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
insert into Produkt
values (4040, 994035, 12341, ’Rennrad’, 1400,
to_date(’01/01/1996’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Produkt
values (4001, 994000, 55778, ’Rennrad’, 1100,
to_date(’01/01/1987’,’DD/MM/YYYY’),
to_date(’31/08/1987’,’DD/MM/YYYY’));
A.5
Die Tabelle Mitarbeiter
drop table Mitarbeiter cascade constraints;
create table Mitarbeiter (
Abteilung$ number not null references Abteilung(Abteilung$),
Mitarbeiter number not null references Angestellter(Angestellter$),
vt_from date not null,
vt_to date not null);
insert into Mitarbeiter
values (5000, 7020, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1987’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5000, 7025, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5000, 7030, to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5000, 7035, to_date(’01/01/1987’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5000, 7040, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1987’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5012, 7025, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’30/04/1991’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5222, 7025, to_date(’01/05/1991’,’DD/MM/YYYY’),
159
Kapitel A. Implementierung der Testdatenbank
to_date(’31/05/1991’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5034, 7025, to_date(’01/06/1991’,’DD/MM/YYYY’),
to_date(’31/12/1994’,’DD/MM/YYYY’));
insert into Mitarbeiter
values (5011, 7025, to_date(’01/01/1995’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
A.6
Die Tabelle Zulieferfirma
drop table Zulieferfirma cascade constraints;
create table Zulieferfirma (
Zulieferfirma$ number unique,
t_inv$ number not null,
Firma$ number not null references Firma(Firma$),
vt_from date not null,
vt_to date not null,
primary key (Zulieferfirma$));
insert into Zulieferfirma
values (2000, 992000, 1000, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/08/1987’,’DD/MM/YYYY’));
insert into Zulieferfirma
values (2001, 992010, 1000, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’31/12/1992’,’DD/MM/YYYY’));
insert into Zulieferfirma
values (2010, 992020, 1004, to_date(’01/09/1987’,’DD/MM/YYYY’),
to_date(’31/08/1997’,’DD/MM/YYYY’));
insert into Zulieferfirma
values (2011, 992030, 1001, to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’30/06/1990’,’DD/MM/YYYY’));
A.7
Die Tabelle Vorprodukt
drop table Vorprodukt cascade constraints;
create table Vorprodukt (
Vorprodukt$ number unique,
t_inv$ number not null,
Produkt$ number not null references Produkt(Produkt$),
vt_from date not null,
vt_to date not null,
primary key (Vorprodukt$));
160
A.8. Die Tabelle gehoert zu
insert into Vorprodukt
values (3000, 993000, 4010, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’31/12/1992’,’DD/MM/YYYY’));
insert into Vorprodukt
values (3001, 993010, 4015, to_date(’01/09/1989’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
insert into Vorprodukt
values (3002, 993020, 4005, to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’30/06/1990’,’DD/MM/YYYY’));
insert into Vorprodukt
values (3003, 993030, 4000, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1986’,’DD/MM/YYYY’));
insert into Vorprodukt
values (3004, 993030, 4001, to_date(’01/01/1987’,’DD/MM/YYYY’),
to_date(’31/08/1987’,’DD/MM/YYYY’));
A.8
Die Tabelle gehoert zu
drop table gehoert_zu cascade constraints;
create table gehoert_zu (
Firma$ number not null references Firma(Firma$),
Abteilung$ number not null references Abteilung(Abteilung$),
vt_from date not null,
vt_to date not null,
primary key (Firma$, Abteilung$, vt_from, vt_to));
insert into gehoert_zu
values (1000, 5000, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into gehoert_zu
values (1000, 5012, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’30/04/1991’,’DD/MM/YYYY’));
insert into gehoert_zu
values (1000, 5222, to_date(’01/05/1991’,’DD/MM/YYYY’),
to_date(’31/05/1991’,’DD/MM/YYYY’));
insert into gehoert_zu
values (1000, 5034, to_date(’01/06/1991’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
insert into gehoert_zu
values (1005, 5011, to_date(’01/01/1997’,’DD/MM/YYYY’),
to_date(’31/07/1997’,’DD/MM/YYYY’));
insert into gehoert_zu
values (1000, 5333, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’31/12/1996’,’DD/MM/YYYY’));
161
Kapitel A. Implementierung der Testdatenbank
insert into gehoert_zu
values (1000, 5011, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
A.9
Die Tabelle produziert
drop table produziert cascade constraints;
create table produziert (
Produkt$ number not null references Produkt(Produkt$),
Abteilung$ number not null references Abteilung(Abteilung$),
Auslastung number not null,
vt_from date not null,
vt_to date not null,
primary key (Produkt$, Abteilung$, vt_from, vt_to));
insert into produziert
values (4000, 5000, 75, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1986’,’DD/MM/YYYY’));
insert into produziert
values (4005, 5000, 82, to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’30/06/1990’,’DD/MM/YYYY’));
insert into produziert
values (4010, 5000, 89, to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into produziert
values (4010, 5012, 73, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’30/04/1991’,’DD/MM/YYYY’));
insert into produziert
values (4010, 5222, 69, to_date(’01/05/1991’,’DD/MM/YYYY’),
to_date(’31/05/1991’,’DD/MM/YYYY’));
insert into produziert
values (4010, 5034, 70, to_date(’01/06/1991’,’DD/MM/YYYY’),
to_date(’31/12/1992’,’DD/MM/YYYY’));
insert into produziert
values (4015, 5000, 72, to_date(’01/09/1989’,’DD/MM/YYYY’),
to_date(’31/12/1990’,’DD/MM/YYYY’));
insert into produziert
values (4015, 5012, 73, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’30/04/1991’,’DD/MM/YYYY’));
insert into produziert
values (4015, 5222, 40, to_date(’01/05/1991’,’DD/MM/YYYY’),
to_date(’31/05/1991’,’DD/MM/YYYY’));
insert into produziert
values (4015, 5034, 75, to_date(’01/06/1991’,’DD/MM/YYYY’),
to_date(’31/12/1995’,’DD/MM/YYYY’));
162
A.10. Die Tabelle liefert
insert into produziert
values (4015, 5011, 91, to_date(’01/01/1996’,’DD/MM/YYYY’),
to_date(’31/12/9999’,’DD/MM/YYYY’));
A.10
Die Tabelle liefert
drop table liefert cascade constraints;
create table liefert (
Zulieferfirma$ number not null references Zulieferfirma(Zulieferfirma$),
Vorprodukt$ number not null references Vorprodukt(Vorprodukt$),
vt_from date not null,
vt_to date not null,
primary key (Zulieferfirma$, Vorprodukt$, vt_from, vt_to));
insert into liefert
values (2000,3003, to_date(’01/01/1985’,’DD/MM/YYYY’),
to_date(’31/12/1986’,’DD/MM/YYYY’));
insert into liefert
values (2001,3000, to_date(’01/01/1991’,’DD/MM/YYYY’),
to_date(’31/12/1992’,’DD/MM/YYYY’));
insert into liefert
values (2010,3001, to_date(’01/09/1989’,’DD/MM/YYYY’),
to_date(’31/08/1997’,’DD/MM/YYYY’));
insert into liefert
values (2011,3002, to_date(’01/01/1990’,’DD/MM/YYYY’),
to_date(’30/06/1990’,’DD/MM/YYYY’));
insert into liefert
values (2000,3004, to_date(’01/01/1987’,’DD/MM/YYYY’),
to_date(’31/08/1987’,’DD/MM/YYYY’));
163
Kapitel A. Implementierung der Testdatenbank
164
Anhang B
Syntax der
TEER–Datenbank–Anfragesprache
Die Syntax der TEER–Datenbank–Anfragesprache ist in der erweiterten Backus–Naur–
Form definiert. Eine Anfrage ist eine query, die übrigen Konstrukte sind in alphabetischer
Reihenfolge angegeben.
query ::= get attr | get time
abbrev ::= string
all any choice ::= "all " | "any "
alphanum ::= [ char digit expr ]+
attr expr ::= [ "not" ] attr cond
attr cond ::= attr name pred value
attr list ::= attr name [ "," attr name ]∗
attr name ::= string | abbrev"."string
bool expr ::= "(" attr expr [ bool op attr expr ]∗ ")"
bool op ::= "and" | "or"
cal temp elem ::= temp elem | get time
char ::= "a" | ...| "z" | "A" | ...| "Z" | " "
char digit expr ::= char | digit
comp name ::= string
date ::=
[ digit ] digit "/" [ digit ] digit "/"
[ digit digit ] digit digit
digit ::= "0" | "1" | ...| "9"
ent name ::= string
ent rel name ::= ent name | rel name
165
Kapitel B. Syntax der TEER–Datenbank–Anfragesprache
get attr ::=
get
get
get
get
get op [ restrict expr ]
[ temp sel expr ] [temp proj expr ]
op ::= "get" attr list "from" teer
result ::= get result op [ "restrict" restrict attr ]
result op ::= "get" attr name "from" teer
time ::= "get time" "from" teer
[ "restrict" restrict attr ] [ temp sel expr ]
interval ::= "[" time expr "," time expr "]"
interval union ::= "{" interval [ "," interval ]+ "}"
number ::= [ digit ]+
pred ::= "=" | ">" | "≥" | "<" | "≤" | "="
rel name ::= string
restrict attr ::= "(" bool expr ")" [ "and" "(" bool expr ")" ]∗
restrict expr ::= "restrict" "(" restrict attr ")" |
"restrict" result link
result link ::= attr name pred all any choice
"(" get result ")"
string ::= alphanum
ent name [ abbrev ] [ "," ent name [ abbrev ] ]∗
[ "," rel name [ abbrev ] ]∗
[ "," typ name ]∗
[ "," comp name ]∗
temp elem ::= interval | interval union
temp elem proj ::= temp elem | true time | "(" get time ")"
temp pred ::= "before" | "after" | "during" | "superior"
"equivalent" | "adjacent" | "overlap"
temp proj ::= [ "(" teer ")" ] temp pred temp elem proj
temp proj expr ::= "project" temp proj
temp sel ::= true time temp pred cal temp elem
temp sel expr ::= "time condition of" ent rel name "is" temp sel
time expr ::= "null" | "now" | "infinity" | date
true time ::= "[[" bool expr "]]"
typ name ::= string
teer ::=
value ::= "’" string "’" | number
166
Anhang C
Transformation in den TEER–Kalkül
Die Transformation einer graphischen TEER–Anfrage query, die in linearer Schreibweise vorliegt, ist gegeben durch die Abbildung Tt (query). Die Abbildungen der restlichen
Konstrukte sind in alphabetischer Reihenfolge angegeben.
Tt (get attr), falls query ::= get attr
Tt (query) :=
Tt (get time), falls query ::= get time
T (abbrev) := T (string)
T ("all") := "max"
T (all any choice) :=
T ("all"), falls all any choice ::= "all"
Tt ("any"), falls all any choice ::= "any"
T (alphanum) := [ T (char digit expr) ]+
T ("and") := " ∧ "
T ("any") := "min"
Tt (attr expr) := [ T ("not") ] Tt (attr cond)
Tt (attr cond) := Tt (attr name) T (pred) T (value)
Tt (attr list) := Tt (attr name) [ "," Tt (attr name) ]∗
Tt (attr name) := T (abbrev)"."T (string)".t"
167
Kapitel C. Transformation in den TEER–Kalkül
Es muß gelten:
abbrev gehört zu demjenigen Entity ent name für das gilt: type(attr name) = ent name
und ent name ist in teer enthalten.
Tt (bool expr) := Tt (attr expr) [ T (bool op) Tt (attr expr) ]∗
T (bool op) :=
T ("and "), falls bool op ::= "and"
T ("or "), falls bool op ::= "or"
Tt (cal temp elem) :=

"a",



..


.



"z",
T (char) :=
"A",




..


.


"Z",
Tt (temp elem), falls cal temp elem ::= temp elem
Tt (get time), falls cal temp elem ::= get time
falls char ::= "a"
falls char ::= "z"
falls char ::= "A"
falls char ::= "Z"
T (char), falls char digit expr ::= char
T (char digit expr) :=
T (digit), falls char digit expr ::= digit
T (comp name) := T (string)
T (date) :=
[ T (digit) ] T (digit) "/" [ T (digit) ] T (digit)"/"
[ T (digit) T (digit) ] T (digit) T (digit)


"0", falls digit ::= "0"


 "1", falls digit ::= "1"
T (digit) :=
.
 ..


 "9", falls digit ::= "0"
T (ent name) := T (string)
T (ent rel name) :=
Tt (get attr) :=
T (ent name), falls ent rel name ::= ent name
T (rel name), falls ent rel name ::= rel name
"{" Tt (get op) Tt (restrict expr)
[ Tt (temp sel expr) ] Tt (temp proj expr) [ ) ]! "}"
Im Gegensatz zur Syntax einer Anfrage sind die Transformationen der Konstrukte
restrict expr und temp proj expr nicht optional. Mit der Transformation des Kon168
strukts restrict expr werden eventuelle Verbindungen zwischen Entity– und Relationshiptypen, an die eine Anfrage gestellt wird, in Kalkülschreibweise ausgedrückt. Die Transformation des Konstrukts temp proj expr erzeugt die Einschränkung der Daten auf einen
Gültigkeitszeitraum. Ist keine Projektion in der Anfrage angegeben, wird die Lebensdauer
der Datenbank als Gültigkeitszeitraum genommen.
Die optionale runde schließende Klammer wird dann benötigt, wenn in einer Kalkülanfrage an dieser Stelle noch offene Klammern kein schließendes Gegenstück besitzen. Die
nicht zur erweiterten Backus–Naur–Form gehörige Hilfsnotation [ ) ]! soll bedeuten, daß
nicht beliebig viele schließende Klammern gesetzt werden dürfen, sondern ihre Anzahl
muß genau der Anzahl noch offener Klammern entsprechen. Im Rahmen der Formulierung
von booleschen Bedingungen oder Gültigkeitszeiträumen werden Klammern geöffnet,
können aber dort nicht wieder geschlossen werden, da sonst der Gültigkeitsbereich von
Deklarationen vorzeitig beendet werden könnte.
Tt (get op) := Tt (attr list) ", t |" T (teer)
Tt (get result) := "{" Tt (get result op) Tt (restrict attr) Tt (temp proj expr) [ ) ]! "}"
Es gelten dieselben Erklärungen wie für das Konstrukt get attr. Die Transformation
des in einer Unteranfrage nicht zugelassenen Konstrukts temp proj expr erzeugt die in
dem Kalkül nötige Einschränkung der Variablen t auf die Lebensdauer der Datenbank.
Da das get result–Konstrukt eine Unteranfrage darstellt, dürfen nur diejenigen runden
Klammern geschlossen werden, die während der Transformation dieser Unteranfrage
geöffnet wurden und bisher kein schließendes Gegenstück besitzen. Das bedeutet insbesondere, daß offene runde Klammern, die bei der Transformation der übergeordneten
Anfrage geöffnet wurden, nicht geschlossen werden dürfen.
Tt (get result op) := Tt (attr name) "|" T (teer)
Tt (get time) := "{ t |" Tt (restrict att) [ Tt (temp sel expr) ] Tt (temp proj expr) [ ) ]! "}"
Es gelten dieselben Erklärungen wie für das Konstrukt get attr. Die Transformation
des in einer Unteranfrage nicht zugelassenen Konstrukts temp proj expr erzeugt die in
dem Kalkül nötige Einschränkung der Variablen t auf die Lebensdauer der Datenbank.
Auch in diesem Fall drückt die Hilfsnotation [ ) ]! aus, daß nur soviele runde schließende
Klammern gesetzt werden dürfen, wie noch offene vorhanden sind. Wird das get time–
Konstrukt als Unteranfrage im Rahmen einer temporalen Selektion oder Projektion
verwendet, ist die Betrachtung der Klammern nur auf die innerhalb der Transformation
dieser Unteranfrage gesetzten Klammern beschränkt.
Tt (interval) := "[" Tt (time expr) ", " Tt (time expr) "]"
169
Kapitel C. Transformation in den TEER–Kalkül
Tt (interval union) := Tt (interval) [ " ∪ " Tt (interval) ]+
T ("not") := "¬"
T (number) := [ T (digit) ]+
T ("or") := " ∨ "

" = ",




" > ",



" ≥ ",
T (pred) :=
" < ",




" ≤ ",



" = ",
falls
falls
falls
falls
falls
falls
pred
pred
pred
pred
pred
pred
::=
::=
::=
::=
::=
::=
"="
">"
"≥"
"<"
"≤"
" = "
T (rel name) := T (string)
Tt (restrict attr) := [ " ∧ " ] [ "∃ (" T (abbrev) " : " T (ent rel name) ")" ]
[ " ∧ ∃ (" T (abbrev) " : " T (ent rel name) ")" ]∗
"(" Tt (bool expr) [ " ∧ " Tt (bool expr) ]∗
[ " ∧ " relationt ]∗
Die ersten drei optionalen Klammern ermöglichen die Deklaration aller bisher nicht deklarierten Entitytypen, die in teer aufgeführt sind. Als Variablen werden dabei die zugehörigen alias–Bezeichner abbrev aus teer benutzt. Relationshiptypen werden nur dann
deklariert, wenn eine boolesche Bedingung bool expr an ein zugehöriges Attribut gestellt
ist. Das erste optionale ∧ wird nicht benötigt, falls Tt (restrict attr) im Rahmen einer
Transformation des Konstrukts get result oder get time aufgerufen wird.
Als nächstes werden alle booleschen Bedingungen nacheinander transformiert. Die letzte
optionale Klammer beinhaltet einen Aufruf der Funktion relationt . Diese Funktion
stellt Verbindungen zwischen Entitytypen her. relationt ist sooft aufzurufen, bis alle
Relationshiptyp–, Typkonstruktions– und Komponentennamen, die in teer vorkommen,
benutzt sind. Beinhaltet eine Anfrage nur einen Entitytyp, ist der Funktionsaufruf zu
übergehen.
Für das Funktion relationt gilt:

T (rel name)".t" (abbrev,abbrev),
falls Fall 1



falls Fall 2
T (abbrev) " = as "T (ent name)".t ("T (abbrev)")",
relationt :=
"(" T (abbrev) " ∈ " T (abbrev)"."T (comp name)".t"


, falls Fall 3

[ " ∨ " T (abbrev) " ∈ " T (abbrev)"."T (comp name)".t" ] ")"
170
Fall 1:
1. rel name ist in teer enthalten.
2. participants(rel name) = {ent name,ent name}. Die alias–Bezeichner abbrev
dieser beiden Entitytypen werden verwendet.
Fall 2:
1. Es gibt eine Typkonstruktion typ name in teer, wobei
output(typ name), input(typ name) in teer enthalten sind.
2. Die erste Abkürzung abbrev eines Entitynamens gehört zu
ent name = output(typ name).
3. Die zweite Abkürzung abbrev eines Entitynamens gehört zu
ent name = input(typ name).
4. In relationt ist der verwendete ent name = output(typ name).
Fall 3:
1. comp name ist in teer enthalten.
2. Der Ausdruck in der optionalen Klammer, wird für den Fall gebraucht, daß
es mehrere Komponenten zwischen den beiden Entitytypen type(comp name) und
domain(comp name) gibt.
3. Die erste Abkürzung abbrev gehört zu ent name = domain(typ name).
4. Die zweite Abkürzung abbrev gehört zu ent name = type(typ name).
5. Eine Unterscheidung zwischen ein– und mehrwertigen Komponenten findet nicht
statt.

Tt (restrict attr),
falls Fall 1




falls Fall 2
Tt (result link),



falls Fall 3
Tt (restrict attr) " ∧ " Tt (result link),
Tt (restrict expr) :=
[ " ∧ ∃ (" T (abbrev) " : " T (ent name) ")" ]∗


falls Fall 4


"(" relationt [ " ∧ " relationt ]∗ ,



" ",
sonst
Fall 1:
restrict expr ::= "restrict" "(" restrict attr ")"
171
Kapitel C. Transformation in den TEER–Kalkül
Fall 2:
restrict expr ::= "restrict" result link
Fall 3:
restrict expr ::= "restrict" "(" result attr "and" result link ")"
Fall 4:
Fall 1 und Fall 2 sind nicht erfüllt und es gibt mehr als einen Namen ent name in teer.
Erklärung der Formel:
Mit Hilfe der ersten Klammer werden alle bisher nicht deklarierten Entitytypen, die in
teer aufgelistet sind, deklariert. Die folgenden Aufrufe der Funktion relationt bewirken,
daß die Verbindungen zwischen den einzelnen Typen ausgedrückt werden.
Tt (result link) :=
[ " ∧ ∃ (" T (abbrev) " : " T (ent name) ")" ]∗
"(" relationt [ " ∧ " relationt ]∗
"(" Tt (attr name) T (pred) T (all any choice)
Tt (get result)
Mit Hilfe der ersten Klammer werden alle bisher nicht deklarierten Entitytypen, die in
teer aufgelistet sind, deklariert. Die folgenden Aufrufe der Funktion relationt bewirken,
daß die Verbindungen zwischen den einzelnen Typen ausgedrückt werden. Der Rest der
Transformationsregel ist streng Syntax–orientiert.
T (string) := T (alphanum)
T (teer) :=
"(" T (abbrev) " : " T (ent name)
[ " ∧ " T (abbrev) " : " T (ent rel name) ]∗ ")"
wobei abbrev die zu dem Entitytypnamen ent name oder Entity– bzw. Relationshiptypnamen ent rel name gehörige alias–Bezeichner ist. Es werden nur diejenigen Namen
ent name bzw. ent rel name aufgezählt, deren Abkürzung abbrev in Tt (attr list)
vorkommt. Jeder Entity– oder Relationshiptyp wird dabei jedoch nur einmal deklariert,
auch wenn seine Abkürzung in Tt (attr list) mehrfach vorkommt.
Tt (temp elem) :=
Tt (interval),
falls temp elem ::= interval
Tt (interval union), falls temp elem ::= interval union

falls temp elem proj ::= temp elem
 Tt (temp elem),
"[t0 , t∞ ]" Tt (true time) " ∧ ”, falls temp elem proj ::= true time
Tt (temp elem proj) :=

falls temp elem proj ::= get time
Tt (get time),
172

 ∀ t ∈ Tt (temp elem proj) t < t , falls temp pred ::= before
∀ t ∈ Tt (temp elem proj) t > t , falls temp pred ::= after
Tt (temp proj) :=

∃ t ∈ Tt (temp elem proj) t = t , falls temp pred ::= during
Eine temporale Projektion wird in Abhängigkeit des verwendeten temporalen Prädikats
temp pred transformiert.
Tt (temp proj expr) :=
" ∧ " Tt (temp proj), falls temp proj expr gegeben ist
sonst
" ∧ t ∈ [t0 , t∞ ]",

"(( ∀ t ∈ [t0 , t∞ ] ∀ t ∈ " Tt (cal temp elem) "t < t )"




" ⇒ (" Tt (true time) "))"
falls temp pred ::= before



"(( ∀ t ∈ [t0 , t∞ ] ∀ t ∈ "Tt (cal temp elem) "t > t )"
Tt (temp sel) :=
falls temp pred ::= after
" ⇒ (" Tt (true time) "))"




"((
∀
t
∈
[t
,
t
]
∃
t
∈
"T
(cal
temp
elem) "t = t )"

0 ∞
t


falls temp pred ::= during
" ⇒ (" Tt (true time) "))"
Eine temporale Selektion wird in Abhängigkeit des verwendeten temporalen Prädikats
temp pred transformiert.
Tt (temp sel expr) := " ∧ " Tt (temp sel)
wobei der in temp sel expr vorkommende Name ent rel name in Tt (true time)
innerhalb von Tt (temp sel) verwendet wird.

"t0 ",



"tnow ",
Tt (time expr) :=
"t∞ ",



T (date),
falls
falls
falls
falls
time
time
time
time
expr
expr
expr
expr
::=
::=
::=
::=
null
now
infinity
date
Tt (true time) := [ "∃ (" T (abbrev) " : " T (ent rel name) ")" ] "(" Tt (bool expr) ")"
wobei der optionale Ausdruck benutzt wird, falls sich die Bedingung auf das Attribut
eines Entity– Relationshiptyps bezieht und ent rel name im bisherigen Ausdruck noch
nicht deklariert worden ist.
T (value) :=
" " T (string)" ", falls value ::= "’" string "’"
T (number),
falls value ::= number
173
Kapitel C. Transformation in den TEER–Kalkül
174
Anhang D
Benutzerhandbuch
In diesem Kapitel wird das Programm TEER–Anfrage–Editor vorgestellt, das die Formulierung von TEER–Anfragen graphisch realisiert. Dazu wird im ersten Abschnitt die Modularisierung des zu Grunde liegenden Programms aufgezeigt sowie auf die Dateistruktur,
Systemvoraussetzungen und die Installation eingegangen.
Im zweiten Abschnitt wird die Erstellung der Grundlage des TEER–Anfrage–Editors, die
Erzeugung eines TEER–Schemas, vorgestellt. Dieses schließt insbesondere das Programm
EDE ( EER–Diagramm–Editor“) ein, das im Rahmen der Diplomarbeit [Zec97] erstellt
”
wurde.
Der TEER–Anfrage–Editor wird schließlich im letzten Abschnitt vorgestellt und die Erstellung graphischer Anfragen an Hand der Beispiele aus Kapitel 4.1.3 vorgeführt.
D.1
Modularisierung und Installation
Modularisierung
Der Kern des Programms TEER–Anfrage–Editor besteht aus C++–Dateien, die dem Programm EDE entstammen. Da der Anfrage–Editor nur zur Darstellung von Anfragen
dient, sind keine neuen Quelldateien hinzugekommen. Aus dem Programm EDE wurde die Methode des Abspeicherns von Elementen übernommen. Die in das Programm
TEER–Anfrage–Editor aufgenommenen C++–Dateien enthalten die dazu angelegten Speicherstrukturen sowie Implementierungen neuer Tcl–Befehle. Diese Tcl–Befehle werden zur
Erzeugung und Darstellung der graphischen Objekte gebraucht. Die Modulstruktur der
übernommenen C++–Dateien ist in Abbildung D.1 dargestellt.
Das Programm EDE unterstützt das Konzept der Entity–Cluster und benutzerdefinierter
Integritätsbedingungen. Dieses beides wird nicht vom Anfrage–Editor angeboten. Daher
ist sämtlicher diesbezüglicher Code aus den vom Programm EDE stammenden C++–
Dateien gekürzt worden.
Die graphische Benutzeroberfläche wurde in Tcl/Tk programmiert und setzt auf dem
C++–Kern auf. Da die Programme EDE und TEER–Anfrage–Editor zum Teil die gleichen
Befehle anbieten, basiert ein Teil der Tcl–Prozeduren des Programms TEER–Anfrage–
Editor auf Tcl–Prozeduren des Programms EDE. Da das Programm TEER–Anfrage–Editor
175
Kapitel D. Benutzerhandbuch
tkAppInt
tkDiv
tkObjects
tkConnections
objects
lists
types
Abbildung D.1: Modulstruktur des Programmkerns
176
str
D.1. Modularisierung und Installation
aber in der Lage ist, zwei verschiedene Zeichenbereiche anzusteuern, sind sämtliche übernommenen Funktionen modifiziert worden.
Der Programmcode, der die graphische Oberfläche erzeugt und steuert, ist auf vier
Tcl/Tk–Dateien verteilt. Das Aussehen und die Erzeugung der Oberfläche sind in der
Datei teer.tcl implementiert. Diese Datei bildet das Hauptprogramm des Tcl/Tk–Teils.
In dieser Datei befinden sich die include–Kommandos für die übrigen Quelldateien. In
der Datei fileselect.tcl ist das Einlesen eines Dateinamens implementiert, die Datei
schemaio.tcl enthält alle Prozeduren, die zum Abspeichern und Auslesen eines Schemas
aus einer Datei nötig sind. Die letzte Datei, die Datei control.tcl, beinhaltet sämtliche
Befehle, die zur Ansteuerung und Darstellung von auf der graphischen Oberfläche dargestellten Objekten und Programmknöpfen benötigt werden. Die Abbildung D.2 zeigt an,
welche Tcl/Tk–Dateien auf welche C++–Module zugreifen.
teer.tcl
tkConnections
control.tcl
tkDiv
tkObjects
fileselect.tcl
schemaio.tcl
Abbildung D.2: Zusammenhang zwischen Tcl/Tk– und C++–Teil
Installation des Programms
Der Quelltext des Programms TEER–Anfrage–Editor ist auf zwei Verzeichnisse verteilt:
c++/ Dieses Verzeichnis enthält die von dem Programm EDE benötigten Programmquellen des C++–Teils. Diese Dateien wurden den neuen Anforderungen angepaßt.
tcl/ Dieses Verzeichnis enthält die Programmquellen des Tcl/Tk–Teils. Ein Teil der
darin enthaltenen Prozeduren wurde von EDE übernommen und den neuen
Anforderungen angepaßt.
Diese beiden Verzeichnisse befinden sich in einem Verzeichnis namens teer, der zusätzlich
eine Datei Makefile enthält.
Damit der TEER–Anfrage–Editor installierbar ist, muß als Systemvoraussetzung ein UNIX–
System mit der graphischen X–Windows–Oberfläche vorhanden sein. Zusätzlich wird die
177
Kapitel D. Benutzerhandbuch
Programmiersprache Tcl mit dem Toolkit Tk gebraucht. Tcl sollte in der Version 7.5 oder
höher, Tk in der Version 4.1 oder höher verfügbar sein. Ferner werden die Erweiterungspakete TclX und TkX benötigt.
Das make–Kommando erzeugt mit Hilfe der Datei Makefile aus dem in dem Verzeichnis
c++ befindlichen Quellcode das ausführbares Programm TEER. Der TEER–Anfrage–Editor
kann anschließend mit dem Kommando TEER aufgerufen werden.
D.2
Erstellung des TEER–Modells
Der TEER–Anfrage–Editor stellt nur Befehle zur Formulierung von Anfragen an ein TEER–
Schema zur Verfügung. Das bedeutet insbesondere, daß das TEER–Schema nicht im
TEER–Anfrage–Editor erstellt werden kann. Eine Möglichkeit zur Erstellung eines solchen
Schemas bietet das Programm EDE an. Da sich EER– und TEER–Schemata graphisch
nicht voneinander unterscheiden, stellt dieser Weg die unproblematischste Methode dar.
Der TEER–Anfrage–Editor erwartet als Eingabe eine EER–Schema–Spezifikationsdatei.
Dieses Dateiformat ist im Anhang der Arbeit [Zec97] beschrieben, der schematische Aufbau einer solchen Datei ist wie folgt:
SCHEMA Schemaname Schemagröße
ETYPES
{Entity-Spec}∗
END
ENTITY--CLUSTER
{Cluster-Spec}∗
END
RTYPES
{Relationship-Spec}∗
END
CONSTR
{Construction-Spec}∗
END
CONSTRAINTS
{Constraint-Spec}∗
END
In einer EER–Schema–Spezifikationsdatei werden im Kopf Name und Größe des Schemas
abgespeichert. In den folgenden Bereichen werden Entitytypen, Entity–Cluster, Relationshiptypen, Typkonstruktionen und Komponenten mit Namen, der graphischen Position
im Editor und den Beziehungen untereinander abgespeichert. Im letzten Bereich sind
benutzerdefinierte Integritätsbedingungen abgelegt. Wird eine solche Datei in den TEER–
Anfrage–Editor eingelesen, wird das entsprechende Schema dargestellt, Entity–Cluster–
und Integritätsangaben jedoch überlesen. Diese Konzepte werden von dem Anfrage–Editor
nicht unterstützt, da sie in der TEER–Anfragesprache keine Rolle spielen.
Die zum Ausschnitt des Konzern–Schemas, in Abbildung 3.2 dargestellt, gehörige Schema–
Spezifikationsdatei hat folgenden Inhalt:
178
D.2. Erstellung des TEER–Modells
SCHEMA unbenannt 0.0c 0.0c 24.8546c 14.0777c
ETYPES
ENTITY FIRMA 755 177
ATTRIBUTE Firmenname single 0 -1 VARCHAR2 15 755 258 KEY
ENTITY ZULIEFERFIRMA 755 44
ENTITY VORPRODUKT 292 44
ENTITY PRODUKT 292 154
ATTRIBUTE ChargenNr single 0 -1 NUMBER 0 104 111 KEY
ATTRIBUTE ProdName single 0 -1 VARCHAR2 15 118 154 SIMPLE
ATTRIBUTE StPreis single 0 -1 NUMBER 0 119 196 SIMPLE
ENTITY ABTEILUNG 290 404
ATTRIBUTE AbtName single 0 -1 VARCHAR2 15 290 476 KEY
COMPONENT AbtLeiter single 0 -1 ANGESTELLTER 447 370 SIMPLE
COMPONENT Mitarbeiter set 0 -1 ANGESTELLTER 466 437 SIMPLE
ENTITY ANGESTELLTER 625 402
ATTRIBUTE AngName single 0 -1 CHAR 0 625 331 SIMPLE
ATTRIBUTE PersNr single 0 -1 INTEGER 0 775 328 KEY
ATTRIBUTE Gehalt single 0 -1 NUMBER 0 769 380 SIMPLE
ATTRIBUTE Position single 0 -1 CHAR 0 764 432 SIMPLE
END
ENTITY-CLUSTER
END
RTYPES
RELATIONSHIP liefert 508 44
PARTICIPANT ZULIEFERFIRMA 1 -1
PARTICIPANT VORPRODUKT 1 -1
RELATIONSHIP produziert 289 293
PARTICIPANT PRODUKT 1 1
PARTICIPANT ABTEILUNG 1 -1
ATTRIBUTE Auslastung single 0 -1 NUMBER 0 125 292 SIMPLE
RELATIONSHIP gehoert_zu 505 271
PARTICIPANT FIRMA 1 -1
PARTICIPANT ABTEILUNG 1 -1
END
CONSTR
CONSTRUCTION supset2 292 93 Nord PARTIAL
INPUT PRODUKT
OUTPUT VORPRODUKT
CONSTRUCTION supset1 755 115 Nord PARTIAL
INPUT FIRMA
OUTPUT ZULIEFERFIRMA
END
CONSTRAINTS
END
Diese Spezifikation wurde mit Hilfe des Programms EDE erstellt.
179
Kapitel D. Benutzerhandbuch
D.3
D.3.1
Handbuch
Das Hauptfenster
Die Abbildung D.3 zeigt das Hauptfenster des TEER–Anfrage–Editors. Das Fenster setzt
sich aus zwei Bereichen zusammen. Der größere beinhaltet einen Zeichenbereich, in dem
das TEER–Schema dargestellt wird. An der linken Seite ist eine Bedienleiste angebracht,
mit der die Erstellung einer Anfrage gesteuert wird. Der gesamte Bereich der graphischen
Oberfläche ist nur mit der linken Maustaste bedienbar. Nur durch sie sind Aktionen
auslösbar. Die mittlere und rechte Taste besitzen keine Funktion. Das Hauptfenster ist
dehnbar, wobei jedoch nur der Zeichenbereich vergrößert wird.
Abbildung D.3: Das Hauptfenster vom TEER–Anfrage–Editor
Die Knöpfe der Bedienleiste sind in sieben Gruppen aufgeteilt, die optisch voneinander
abgesetzt sind. Damit eine graphische Anfrage syntaktisch korrekt ist, sollte die Erstellung
in der Reihenfolge der Bedienknöpfe erfolgen. Dieses ist nicht zwingend notwendig, aber
sinnvoll. Ein entsprechender Programmablaufsplan ist in Abbildung D.4 dargestellt. Ein
gestrichelter Pfeil bedeutet dabei, daß eine Aktion aktivierbar ist oder auch übergangen
werden kann. Ein durchgezogener Pfeil bedeutet, daß die Aktion aktiviert werden muß
(bei zwei sich bietenden Möglichkeiten nur eine der beiden). Ein doppelter Pfeil bedeutet,
180
D.3. Handbuch
daß eine Aktion vom Programm automatisch aktiviert wird, der Benutzer von dort aber
wieder in den ursprünglichen Ablauf zurückkehren muß. Zur Formulierung einer Anfrage
müssen mindestens die Aktionen load und get verwendet werden.
load
remove
result link
remove
get
restrict
query
specification
duplicate
time link
projection
get
time link sopecification
predicate
specification
selection
restrict
select true time
restrict
restrict
predicate
specification
select time interval
selection
select true time
projection
time link
projection
project true time
select time interval
time link
predicate
specification
specify time interval
project time interval
predicate specification predicate specification
restrict
specify time interval
Abbildung D.4: Ablauf des Programms TEER–Anfrage–Editor
181
Kapitel D. Benutzerhandbuch
Der Reihenfolge der Bedienknöpfe zu folgen bedeutet, daß sie der Reihe nach von oben
nach unten bedient werden. Somit ist zuerst ein Schema zu laden (Bedienknopf load),
dann, falls erwünscht, die Editoroperationen remove und duplicate auszuführen. Anschließend können Attribute selektiert sowie Bedingungen formuliert werden. Diese beiden
Aktionen sind durch das Drücken der Knöpfe get bzw. restrict möglich. Der Knopf specify time interval wird automatisch eingeschaltet, wenn die Eingabe eines Intervalls
nötig ist. Dasselbe Verhalten hat der Knopf restrict, wenn eine booleschen Bedingung
im Rahmen eines Gültigkeitszeitraums angegeben werden muß.
Die nächsten Bedienelemente realisieren die Formulierung einer temporalen Selektion.
Eine Selektion besteht nach Definition aus einem Gültigkeitszeitraum und einem konstanten temporalen Element. Die Formulierung dieser beiden Angaben ermöglichen die
Knöpfe select true time und select time interval.
Da auf eine temporale Selektion eine Projektion angewendet werden darf, stehen die
nächsten drei Knöpfe zur Formulierung dieser zur Verfügung. Mit projection werden
die Elemente, auf die eine temporale Projektion ausgeführt werden soll, ausgewählt. Mit
einem der nächsten Knöpfe ist entweder ein Gültigkeitszeitraum (project true time)
oder ein konstantes temporales Element (project time interval) projizierbar.
Der vorletzte Knopf time–link dient dazu eine Anfrage zu formulieren, deren Ergebnis ein
temporales Element sein soll. Eine Weiterleitung dieses Ergebnisses an eine übergeordnete
Anfrage ist an dieser Stelle nicht möglich. Die Formulierung einer Time–link–Anfrage als
Unteranfrage wird weiter unten erklärt.
Mit dem exit–Knopf kann schließlich das Programm verlassen oder durch load ein neues
Schema geladen und somit eine neue Anfrage formuliert werden.
Damit eine graphische Anfrage syntaktisch korrekt ist, sind nicht alle aktivierbaren Funktionen auf alle Elemente anwendbar. Wann immer versucht wird, eine syntaktisch nicht
korrekte Aktion auszulösen, ertönt ein Piepton. Bei der Beschreibung des Programms wird
nur erklärt, wann welche Aktionen im Zusammenhang mit welchen Elementen möglich
sind. Die der Syntax nicht entsprechenden sich aber trotzdem anbietenden Möglichkeiten
werden unterbunden.
D.3.2
Laden eines Schemas
Das Laden eines Schema wird über den Bedienknopf load gesteuert. Ein Mausklick auf
diesen Knopf läßt das Fenster Dateiauswahl“ erscheinen. Es ist in Abbildung D.5 zu
”
sehen. Aus der Dateiliste ist dann eine Datei auszuwählen, die das Format einer EER–
Schema–Spezifikationsdatei haben muß. Wird versucht eine Datei mit einem anderen Format zu laden, erfolgt eine Fehlermeldung, und es kann erneut eine Datei ausgewählt werden. Der aus der Liste ausgewählte Name wird in den oberen Teil übernommen. Das Laden
des Schemas kann entweder durch einen Mausklick auf den Button OK oder einen doppelten Mausklick auf den Dateinamen in der Liste selbst ausgelöst werden. Die Auswahl
einer Datei kann aber auch durch einen Mausklick auf den Button Abbruch abgebrochen
werden.
182
D.3. Handbuch
Abbildung D.5: Die Dateiauswahl
D.3.3
Die Editoroperatoren Remove und Duplicate
In Abbildung D.6 ist der Ausschnitt des Konzern–Schemas geladen, dessen EER–Schema–
Spezifikation im Abschnitt D.2 angegeben wurde.
Abbildung D.6: Ausschnitt des Konzern–Schemas im Anfrageeditor
183
Kapitel D. Benutzerhandbuch
Remove
Wenn sich eine Anfrage nicht auf alle Schema–Elemente bezieht, sind diejenigen Elemente,
die nicht benötigt werden, zu löschen. Dazu steht eine Löschfunktion zur Verfügung. Sie
ist durch einen Mausklick auf den Knopf remove aktivierbar. Da nach dem Löschen
von Schema–Elementen das TEER–Schema syntaktisch immer noch korrekt sein muß,
dürfen die Elemente nicht beliebig gelöscht werden. Ist die Löschfunktion aktiviert, hat
der Cursor die Form eines Totenkopfs. Alle angeklickten Elemente werden gelöscht, sofern
sie an dieser Stelle des Löschvorgangs gelöscht werden dürfen. Kann ein Element nicht
gelöscht werden, ertönt ein Piepton.
Die Löschfunktion arbeitet nach den folgenden Regeln:
• Jedes beliebige Attribut kann gelöscht werden.
• Jede beliebige Komponente kann gelöscht werden.
• Relationshiptypen können nicht gelöscht werden.
• Typkonstruktionen können nicht gelöscht werden.
• Ein Entitytyp wird nur dann gelöscht, wenn er nur eine Verbindung mit einem
Relationshiptyp oder einer Typkonstruktion hat. Steht der Entitytyp gleichzeitig
mit zwei Relationshiptypen, Typkonstruktionen oder einem Relationship und einer
Typkonstruktion in Verbindung kann der Entitytyp nicht gelöscht werden.
Kann ein Entitytyp gelöscht werden, so werden alle zugehörigen Attribute und
Komponenten mit ihm gelöscht. Ist dieser Entitytyp mit einem zweistelligen Relationshiptyp verbunden, wird dieser Relationshiptyp mit seinen Attributen ebenfalls
gelöscht.
Ist der Entitytyp einziger Eingangs– oder Ausgangstyp einer Typkonstruktion, wird
mit dem Entitytyp auch die Typkonstruktion gelöscht.
Für das obige Konzern–Schema in Abbildung D.6 bedeutet das, daß alle Attribute und
Komponenten gelöscht werden können, jedoch kein einziges Entity, da das Schema eine
Ringstruktur hat (siehe Abbildung D.7). Für einen solchen Fall, ist die Löschfunktion
durch einen doppelten Mausklick auslösbar. Von diesem Moment an ist der Benutzer für
die syntaktische Korrektheit des entstehenden TEER–Schemas verantwortlich.
184
D.3. Handbuch
Abbildung D.7: Die durch das Löschen entstandene Ringstruktur des Konzern–Schemas
Duplicate
Mit Hilfe des Knopfs duplicate wird eine Kopierfunktion aktiviert. Das Kopieren eines
Diagrammteils bedeutet, das eine geschachtelte Anfrage gestellt werden soll. Die beiden
einzigen von der TEER–Anfragesprache angebotenen Möglichkeiten sind, daß entweder
eine Anfrage mit einem Query–result–link oder mit einer Time–link–Unteranfrage formuliert werden soll. Ist die Kopierfunktion aktiviert, ist im Zeichenbereich ein Rahmen
aufziehbar. Alle innerhalb des Rahmen liegenden Elemente werden rot markiert und der
syntaktisch korrekte Teil dieses Teilschemas in einen zweiten Zeichenbereich kopiert. Dieser zweite Zeichenbereich liegt in einem neuen Fenster, das automatisch erzeugt wird.
Ehe das neue Fenster erscheint, ist festzulegen, ob eine Unteranfrage auf Grund eines
Query–result– oder eines Time–links gestellt wird. Dazu erscheint, nachdem die selektierten Elemente markiert wurden, die Listbox query specification, zu sehen in Abbildung
D.8. Der Kopiervorgang wird nur fortgesetzt, wenn eine der beiden Möglichkeiten durch
einen doppelten Mausklick ausgewählt wird.
185
Kapitel D. Benutzerhandbuch
Abbildung D.8: Die Query Specification
Query–result–link
Wählt der Benutzer die Möglichkeit result link, wird eine Anfrage, die einen Query–
result–link beinhaltet, formuliert. Der kopierte Diagrammteil wird in dem Zeichenbereich
eines neuen Fensters mit Namen subquery: result link kopiert. Dieses Fenster hat, der
Syntax der TEER–Anfragesprache folgend, nur die drei Knöpfe remove, get und restrict
in seiner Bedienleiste. Die Abbildung D.15 zeigt das subquery: result link–Fenster, das
im Rahmen der Erstellung der Beispielanfrage 4.6 erzeugt wird.
Time–link
Wird vom Benutzer die Möglichkeit time link im Fenster query specification ausgewählt, bedeutet das, daß das Ergebnis der Time–link–Anfrage, die in dem neuen Zeichenbereich formuliert wird, im Rahmen einer temporalen Projektion oder Selektion benutzt wird. Daher hat der Benutzer als nächstes diese Auswahl zu treffen. Es erscheint
das Fenster time link specification, wo durch einen doppelten Mausklick das weitere
Vorgehen bestimmt wird. Wählt der Benutzer die temporale Projektion aus, doppelter
Mausklick auf projection, muß als nächstes das temporale Prädikat, das bei dieser Projektion benutzt wird, bestimmt werden. Das geschieht abermals durch eine Listbox. Das
Fenster predicate specification beinhaltet alle in der TEER–Anfragesprache verfügbaren Prädikate.
Abbildung D.9: Die Time–Link–Specification
186
D.3. Handbuch
Abbildung D.10: Die Predicate–Specification
Nachdem ein Prädikat durch einen doppelten Mausklick ausgewählt worden ist, wird das
neue Fenster mit dem kopierten Schema erzeugt. Dieses Fenster hat den Namen subquery: time link. Im Hauptfenster wird ein Kasten erzeugt, der alle Schema–Elemente
enthält. Auf diesen Kasten zeigt ein Pfeil, der mit dem temporalen Prädikat sowie der Vorschrift get time beschriftet ist und an dessen Anfang ein blauer Kasten mit der Beschriftung subquery erzeugt wird. Abbildung D.11 zeigt diesen Zustand des Hauptfensters.
Das neu erzeugte Fenster subquery: time link enthält eine etwas größere Bedienleiste
als das Fenster subquery: result link. Es stehen zusätzlich noch die Bedienknöpfe zur
Formulierung einer temporalen Selektion zur Verfügung.
Wird vom Benutzer im Fenster time link specification die temporale Selektion ausgewählt, wird das Fenster subquery: time link erzeugt. Die Selektion im Hauptfenster
kann nicht automatisch erzeugt werden, da sich diese nur auf einen Entity– oder Relationshiptyp beziehen darf. Das Programm merkt“ sich aber, daß eine solche Unteranfrage
”
gestellt wird, und setzt im Rahmen der Formulierung der temporalen Selektion im Hauptfenster dann den subquery–Kasten an die Stelle des anzugebenden temporalen Elements.
Nachdem alle ausgewählten Elemente kopiert worden sind, nehmen die markierten Elemente wieder ihre ursprüngliche Farbe an.
Die Abbildungen D.11 und D.12 zeigen die graphische Formulierung der Beispielanfrage
4.12. In dieser Anfrage wird das Ergebnis einer Unteranfrage, das ein temporales Element
ist, auf die übergeordnete Anfrage projiziert. Die Abbildung D.12 enthält das Fenster subquery: time link, die Abbildung D.11 das Hauptfenster mit der übergeordneten Anfrage.
Die im Hauptfenster farbig markierten Elemente sind die Attribute, deren Werte ausgegeben werden sollen. Der dabei angewendete Get–Operator sowie der zur Formulierung
benutzte Restrict–Operator werden in den nächsten beiden Abschnitten vorgestellt.
187
Kapitel D. Benutzerhandbuch
Abbildung D.11: Die übergeordnete Anfrage der Beispielanfrage 4.12
Abbildung D.12: Die Time–link–Unteranfrage der Beispielanfrage 4.12
188
D.3. Handbuch
Bemerkung
Die Editoroperatoren remove und duplicate können in einer beliebigen Reihenfolge
benutzt werden. Einmal gelöschte Elemente können nicht mehr zurückgeholt werden und
somit ist ein Kopieren vor einem Löschen in vielen Fällen notwendig.
D.3.4
Der Get–Operator
Mit Hilfe des Get–Operators können Attribute, deren Werte ausgegeben werden sollen,
ausgewählt werden. Im TEER–Anfrage–Editor ist dieses durch eine farbige Markierung
der Elemente realisiert. Wird in der Bedienleiste die Aktion Get durch einen Klick auf
den Knopf get ausgelöst, nimmt der Cursor eine sternförmige Gestalt an. Alle Attribute,
die jetzt angeklickt werden, werden rot markiert. Durch ein erneutes Anklicken bereits
selektierter Attribute werden diese deselektiert.
D.3.5
Der Restrict–Operator
Mit Hilfe des Restrict–Operators können Bedingungen an Attribute formuliert werden.
Dazu ist der restrict–Knopf anzuklicken. Der Cursor nimmt die Form eines Stiftes an.
Alle Attribute sind damit auswählbar. Durch das Anklicken wird in die Ellipse ein Cursor
vor den Attributnamen gesetzt. Mit Hilfe der Pfeiltasten kann der Cursor in der Ellipse
nach rechts und links bewegt werden. Sowohl ein Backspace als auch alle anderen Tastatureingaben werden eingelesen. Die Abbildung D.13 zeigt die Beispielanfrage 4.5 im
TEER–Anfrage–Editor. Zur Erstellung dieser Anfrage wurden die dem Remove–, Get– und
Restrict–Operatoren entsprechenden Knöpfe benutzt.
189
Kapitel D. Benutzerhandbuch
Abbildung D.13: Die Beispielanfrage 4.5
D.3.6
Der Query–result–link–Operator
Eine Anfrage mit einem Query–result–link wird, wie bereits oben erklärt, über die Aktion
duplicate formuliert. Die Variable, die den Wert der Unteranfrage übergibt, wird, wie
in der TEER–Anfragesprache, direkt den entsprechenden Attributen der übergeordneten
Anfrage und der Unteranfrage zugeordnet. In der Formulierung des Vergleichs im Hauptfenster ist der erweiterte Vergleichsoperator Θ = θall oder Θ = θany zu benutzen. Die
Formulierung der Beispielanfrage 4.6 im TEER–Anfrage–Editor, ist in den beiden Fenster
D.15 und D.14 zu sehen. Das Fenster subquery: result link, Abbildung D.15, enthält
die Unteranfrage, das Fenster in Abbildung D.14 die übergeordnete Anfrage.
190
D.3. Handbuch
Abbildung D.14: Die übergeordnete Anfrage der Beispielanfrage 4.6
Abbildung D.15: Die Unteranfrage der Beispielanfrage 4.6
191
Kapitel D. Benutzerhandbuch
D.3.7
Der temporale Selektionsoperator
Eine temporale Selektion ist mit Hilfe der Knöpfe select true time und select time
interval formulierbar. Eine Selektion besteht nach Definition immer aus einem Gültigkeitszeitraum und einem konstanten temporalen Element. Der Gültigkeitszeitraum ist
nach einem Mausklick auf den Knopf select true time im Zeichenbereich erzeugbar.
Durch einen Mausklick in diesem Bereich wird ein grüner Kasten mit der Beschriftung
bool expr an der Mausposition plaziert. An dem Mauszeiger hängt jetzt eine Verbindungslinie, die zu einem Entity– oder Relationshiptypen gezogen werden kann. Ist eine
Verbindung hergestellt worden, wird automatisch die Aktion restrict aktiviert. Es kann
sofort damit der grüne Kasten angeklickt und eine boolesche Bedingung formuliert werden.
Der zweite Bestandteil einer Selektion, das konstante temporale Element, wird mit Hilfe
des Knopfes select time interval erzeugt. Ist dieser Knopf aktiviert, kann im Zeichenbereich ein blauer Kasten mit der Beschriftung time interval plaziert werden. An der
Maus hängt wieder eine Verbindungslinie, die jetzt zu dem grünen Kasten gezogen wird.
Am Ende dieser Linie befindet sich ein Pfeil. Sobald die Verbindung hergestellt ist, erscheint das Fenster predicate specification, und das temporale Prädikat der Selektion
ist auszuwählen. Es wird automatisch am Pfeilende plaziert. Jetzt ist vom Programm die
Aktion specify time interval aktiviert, und der blaue Kasten kann angeklickt werden.
Es erscheint ein Cursor in dem Kasten, und das temporale Element kann eingegeben
werden.
Wurde im Laufe der Anfrageformulierung ein Teil des Schemas kopiert, um ein temporales
Element für die Selektion berechnen zu lassen, hat der blaue Kasten die Beschriftung
subquery. Es ist in einem solchen Fall nicht möglich, ein anderes temporales Element
einzugeben.
In Abbildung D.16 ist das Aussehen der Beispielanfrage 4.9 im TEER–Anfrage–Editor zu
sehen.
192
D.3. Handbuch
Abbildung D.16: Die Beispielanfrage 4.9
D.3.8
Der temporale Projektionsoperator
Eine temporale Projektion ist mit Hilfe der Knöpfe projection, project true time und
project time interval formulierbar. Als erstes ist die Aktion projection zu aktivieren. Im Zeichenbereich ist nun ein Kasten von oben links nach rechts unten aufzuziehen.
Mit der Maus ist in den Zeichenbereich zu klicken, der Kasten aufzuziehen, während die
Maustaste gedrückt bleibt. An der Stelle, an der sich der Mauszeiger beim Loslassen der
Maustaste befindet, ist die untere rechte Ecke des Kastens. Umfaßt dieser Kasten nicht
alle Schema–Elemente, ertönt ein Piepton, und der Kasten wird nicht erzeugt. Nach Definition muß eine temporale Projektion alle in einem TEER–Schema enthaltenen Elemente
umfassen. Der Kasten ist erneut zu erzeugen, die Aktion projection ist noch aktiv.
Nachdem ein Kasten erzeugt wurde, muß der Benutzer wählen, ob ein Gültigkeitszeitraum
oder ein temporale Element projiziert werden soll. Der erste Knopf unter projection existiert zur Projektion eines Gültigkeitszeitraums. Sobald project true time aktiviert ist,
kann ein grüner Kasten im Zeichenbereich mit der Beschriftung bool expr plaziert werden. Am Cursor hängt dann eine Verbindungslinie, die zum Kasten zu ziehen ist. Am Ende
dieser Linie befindet sich Pfeil. Sobald dieser plaziert ist, ist das temporale Prädikat der
Projektion anzugeben. Dazu erscheint automatisch das Fenster predicate specification.
und eines der aufgelisteten Prädikate ist durch einen doppelten Mausklick auszuwählen.
Dieses Prädikat wird dann am Pfeilende plaziert. Das Programm aktiviert daraufhin die
Aktion restrict, und die boolesche Bedingung, auf Grund derer der Gültigkeitszeitraum
193
Kapitel D. Benutzerhandbuch
bestimmt werden soll, ist einzugeben. Die Abbildung D.17 stellt eine solche temporale
Projektion dar, die Beispielanfrage 4.8.
Abbildung D.17: Die Beispielanfrage 4.8
Die andere Möglichkeit einer Projektion ist, daß ein temporales Element projiziert werden
soll. Dazu ist die Aktion project time interval zu aktivieren. Die Vorgehensweise ist
hier genauso, wie wenn ein Gültigkeitszeitraum projiziert werden würde. Der graphische
Unterschied besteht darin, daß der im Zeichenbereich erzeugt Kasten blau ist und die Beschriftung time interval trägt. Das Programm aktiviert auch nicht die Aktion restrict,
sondern die sortenmäßig passende Aktion restrict time interval. In Abbildung D.18 ist
die Formulierung der Beispielanfrage 4.7 im TEER–Anfrage–Editor zu sehen.
194
D.3. Handbuch
Abbildung D.18: Die Beispielanfrage 4.7
Wurde jedoch bereits über die Aktionen duplicate eine temporale Projektion formuliert,
sind die Aktion projection, project true time und project time interval nicht mehr
aktivierbar. Genauso sind project true time und project time interval nur aktivierbar, wenn ein Kasten mit Hilfe von projection bereits erzeugt wurde.
Die Abbildung D.19 enthält die Beispielanfrage 4.10 im TEER–Anfrage–Editor. In dieser
Anfrage wird eine temporale Projektion auf eine Schema angewendet, das bereits eine
temporale Selektion enthält.
195
Kapitel D. Benutzerhandbuch
Abbildung D.19: Die Beispielanfrage 4.10
D.3.9
Der Time–link–Operator
Mit Hilfe des Time–link–Operators kann ein temporales Element berechnet werden. Der
im Editor verfügbare Knopf time–link dient nur zur Formulierung von Anfragen, deren
Ergebnis dieses berechnete temporale Element ist. Soll ein Time–link in Verbindung mit
einer temporalen Projektion oder Selektion verwendet werden, ist dieses nur über die
Aktion duplicate möglich. Das Vorgehen in diesem Fall wurde bereits oben erklärt.
Ist die Aktion time–link aktiviert worden, ist im Zeichenbereich ein Kasten nach denselben Regeln wie bei der Aktion projection zu erzeugen. Ist der Kasten plaziert worden,
wird von der rechten Seitenmitte ausgehend ein Pfeil mit der Vorschrift get time erzeugt.
Die Abbildung D.20 enthält die graphische Formulierung der Beispielanfrage 4.11.
196
D.3. Handbuch
Abbildung D.20: Die Beispielanfrage 4.11
D.3.10
Anmerkungen
Bei der Formulierung einer graphischen Anfrage im TEER–Anfrage–Editor wird die syntaktische Korrektheit dieser Anfrage nicht hundertprozentig kontrolliert. Es wird kontrolliert,
ob der syntaktische Aufbau der Anfrage stimmt., da immer nur syntaktisch folgerichtige Aktionen auslösbar sind. Es wird nicht überprüft, ob Eingaben, die von der Tastatur
eingelesen werden, syntaktisch richtig sind. Diese Tastatureingaben beschränken sich auf
boolesche Bedingungen und die Angabe von temporalen Elementen.
Der TEER–Anfrage–Editor war ursprünglich als Benutzerschnittstelle zu einer ORACLE–
Datenbank geplant. Daher sollte die syntaktische Korrektheit dieser vom Benutzer
angegebenen Konstrukte von ORACLE überprüft werden und eventuelle ORACLE–
Fehlermeldungen zurückgegeben werden. Dieser Teil der Implementierung war im zeitlichen Rahmen dieser Arbeit nicht realisierbar, so daß die syntaktische Korrektheit einer
Anfrage nicht immer gewährleistet ist.
197
Kapitel D. Benutzerhandbuch
198
Literaturverzeichnis
[CER90] Czejdo, B., Elmasri, R., Rusinkiewicz, M.: A Graphical Data Manipulation Language for an Extended Entity–Relationship Model. Computer, Vol. 23
No. 3. IEEE Computer Press, 1990.
[Che76] Chen, P.P.: The entity–relationship model: toward a unified view of data. ACM
Transactions on Database Systems, 1, 1, 9–36.
[CS89]
Catarci, T., Santucci, G.: Query by Diagram: A Graphical Query System.
Proc. of the eight Int. Conference on Entity–Relationship Approach, 1989.
[Dat90] Date, C.J.: An Introduction to Database Systems, Volume I, Fifth Edition.
Addison–Wesley, Reading, MA, 1990.
[EEK90] Elmasri, R., El–Assal, I., Kouramajian, V.: Semantics of temporal data in an extended ER model. Proc. of the ninth Int. Conference on Entity–
Relationship Approach, 1990.
[EK92]
Elmasri, R., Kouramajian, V.: A Temporal Query Language Based on Conceptual Entities and Roles. Proc. of the eleventh Int. Conference on Entity–
Relationship Approach, 1992.
[EN94]
Elmasri, R., Navathe, S.B.: Fundamentals of Database Systems (Second
Edition). Addison–Wesley, Amsterdam, The Netherlands, 1994.
[EW90] Elmasri, R., Wuu, G.T.J.: A Temporal Model and Query Language for ER
Databases. IEEE Data Engineering Conference, 1990.
[EWK93] Elmasri, R., Wuu, G.T.J., Kouramajian, V.: A Temporal Model and
Query Language for EER Databases. in: Tansel, A., Clifford, J., Gadia,
S., Jajodia, S., Segev, A., Snodgrass R.: Temporal Databases: Theory,
Design, and Implemetation., Database Systems and Application Series, Benjamin/Cummings, Redwood City, CA, 1993.
[Gog94] Gogolla, M.: An Extended Entity–Relationship Model. Lecture Notes in
Computer Science. Springer–Verlag, Heidelberg, 1994.
[GY95] Gadia, S.K., Yeung, C.: A Generalized Model for a Relational Temporal
Database. ACM SIGMOD Conference, 1988.
199
LITERATURVERZEICHNIS
[HE91]
Hohenstein, U., Engels, G.: SQL/EER – Syntax and Semantics of an
Entity–Relationship–Based Query Language. Informatik–Berichte 91-02. Technische Universität Braunschweig, 1991.
[Hoh88] Hohenstein, U.: Automatic Transformation of Entity–Relationship Schemas
into Relational Schemas. Informatik–Berichte 88-10. Technische Universität
Braunschweig, 1988.
[Hoh90] Hohenstein, U.: Ein Kalkül für ein erweitertes Entity–Relationship–Modell
und seine Übersetzung in einen relationalen Kalkül. Dissertation. Technische
Universität Braunschweig, 1990.
[Hoh93] Hohenstein, U.: Formale Semantik eines erweiterten Entity–Relationship–
Modells. Teubner–Texte zur Informatik. Teubner–Verlagsgesellschaft, Leibzig,
1993.
[KG95] Kouramajian, V., Gertz, M.: A Graphical Query Language for Temporal
Databases. in: Papazoglou, Michael P.: OOER’95: Object-Oriented and
Entity-Relationship Modeling. Springer-Verlag, Berlin, 1995.
[KL95]
Koch, G., Loney, K.: ORACLE: The Complete Reference, Third Edition.
Oracle Press, McGraw–Hill, Berkeley, 1995.
[Ku94]
Kuhn, B.: Implementierung einer SQL–Erweiterung für temporale Datenbanken. Studienarbeit, Institut für Informatik, Universität Hannover, 1994.
[OS94]
Oberweis, A., Sänger, V.: GTL – A Graphical Language For Temporal
Data. Proc. of the Seventh Int. Working Conference on Scientific and Statistical
Database Management, Charlottesville/Virginia, IEEE Computer Press, 1994.
[Ous95] Ousterhout, J.K.: Tcl und Tk: Entwicklung grafischer Benutzerschnittstellen
für das X Window System. Addison–Wesley (Deutschland), Bonn, 1995.
[Ull88]
Ullman, J.D.: Principles of Database and Knowledge Base Systems Vol. I
(Third edition). Computer Science Press, Rockville, D, 1988.
[Vos94] Vossen, G.: Datenmodelle, Datenbanksprachen und Datenbankmanagement–
Systeme (2. Auflage). Addison–Wesley (Deutschland), Bonn, 1994.
[Wel95] Welch, B.B.: Practical Programming in Tcl and Tk. Prentice Hall, Upper
Saddle River, New Jersey, 1995.
[Zec97]
Zech, I.: Entwicklung eines Werkzeugs zur Übersetzung von EER–Datenbankschemata nach ORACLE/SQL. Diplomarbeit, Institut für Informatik, Universität Hannover, 1997.
200
Abbildungsverzeichnis
2.1 Konzern–Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2 Hierarchischer Aufbau der Prädikatenlogik 1. Ordnung . . . . . . . . . . . 33
2.3 Rekursiver Aufbau des EER–Kalküls . . . . . . . . . . . . . . . . . . . . . 33
3.1 Die temporale Hierarchie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.2 Ausschnitt des Konzern–Schemas . . . . . . . . . . . . . . . . . . . . . . . 59
4.1 Beispiel einer condition box . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.2 Der Query–result–link bzgl. Entity–Attributen . . . . . . . . . . . . . . . . 75
4.3 Die temporale Projektion temp projtemp
pred temp elem proj (teer)
. . . . . . . 76
4.4 Der True–time–Operator in Verbindung mit einer temporalen Projektion . 78
4.5 Die temporale Selektion temp seltrue
time temp pred cal temp elem (E)
. . . . . . 79
4.6 Time–link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.7 Time–link im Rahmen einer temporalen Projektion . . . . . . . . . . . . . 82
4.8
Ableitungsbaum“
”
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
D.1 Modulstruktur des Programmkerns . . . . . . . . . . . . . . . . . . . . . . 176
D.2 Zusammenhang zwischen Tcl/Tk– und C++–Teil . . . . . . . . . . . . . . 177
D.3 Das Hauptfenster vom TEER–Anfrage–Editor . . . . . . . . . . . . . . . . . 180
D.4 Ablauf des Programms TEER–Anfrage–Editor . . . . . . . . . . . . . . . . . 181
D.5 Die Dateiauswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
D.6 Ausschnitt des Konzern–Schemas im Anfrageeditor . . . . . . . . . . . . . 183
D.7 Die durch das Löschen entstandene Ringstruktur des Konzern–Schemas . . 185
D.8 Die Query Specification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
D.9 Die Time–Link–Specification . . . . . . . . . . . . . . . . . . . . . . . . . . 186
D.10 Die Predicate–Specification
. . . . . . . . . . . . . . . . . . . . . . . . . . 187
D.11 Die übergeordnete Anfrage der Beispielanfrage 4.12 . . . . . . . . . . . . . 188
D.12 Die Time–link–Unteranfrage der Beispielanfrage 4.12 . . . . . . . . . . . . 188
D.13 Die Beispielanfrage 4.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
201
ABBILDUNGSVERZEICHNIS
D.14 Die übergeordnete Anfrage der Beispielanfrage 4.6 . . . . . . . . . . . . . . 191
D.15 Die Unteranfrage der Beispielanfrage 4.6 . . . . . . . . . . . . . . . . . . . 191
D.16 Die Beispielanfrage 4.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
D.17 Die Beispielanfrage 4.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
D.18 Die Beispielanfrage 4.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
D.19 Die Beispielanfrage 4.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
D.20 Die Beispielanfrage 4.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
202
Index
bts, 22
Aggregation
EER–Modell, 14
Alphabet
EER–Kalkül, 33
TEER–Kalkül, 88
Anfrage
EER–Kalkül, 38
TEER–Anfragesprache,
siehe
TEER–DB–Anfragesprache
TEER–Kalkül, 92
arguments, 20
Assoziation
EER–Modell, 15
Atomare Formel
Semantik, 37
Syntax, 35
ATTR, 27
Attribut, 13
Wertebereich, 14
Attributtyp
EER–Diagramm
obligatorisch, 16
optional, 17
EER–Modell
komplex–objektwertig, 15
objektwertig, 14
obligatorisch, 14
optional, 14
Ausgangstyp, siehe Typkonstruktion
avg, 22
COMP, 27
CONSTRUCTION, 27
count, 22
date, 48
Datenbankzustand, 29
temporaler, 45
Datenmodell, 13
Datentyp–Signatur
Interpretation, 20
relationale, 40
Semantik, 21
Syntax, 20
Deklaration, 35
destination, 20
domain, 14, 28
DT, 20
Duplicate–Operator, 73
EBNF–Notation, 56
Editor, 72
EER–Diagramm, 16
EER–Kalkül, 32
Semantik, 37
Syntax, 33
EER–Modell, 13
Semantik, 29
Syntax, 27
EER–Schema, 13
EER–Signatur, 28
EER–Standarddatentyp–Signatur, 21
Eingangstyp, siehe Typkonstruktion
Entity, 13, 14
seeEntitytyp, 13
entity, 28
Entity–Attributtyp
EER–Diagramm, 16
EER–Modell, 14
Entitytyp
B(S), 20
bag, 14
Belegung, 36
Bereich, 35
β, 36
Beziehung, siehe Relationship
boolescher Ausdruck
Gültigkeitszeitraum, 71
temporal, 70
203
INDEX
occ, 22
ω, 20
Operation, siehe Operationssignatur
Operationssignatur, 20
OPNSDT , 20
OPNSREL , 40
OPNSTDT , 48
output, 28
EER–Diagramm, 16
EER–Modell, 14
TEER–Modell, 45
ER–Modell, 13
E-TYPE, 27
F (S), 20
Formel
Semantik, 37
Syntax, 36
P(S), 20
participants, 28
π, 20
pos, 22
Prädikat, siehe Prädikatsignatur
Prädikatsignatur, 20
PREDDT , 20
PREDREL , 40
PREDTDT , 48
Projektion, siehe temporale Projektion
Generalisierung
EER–Modell, 15
Get–Operator, 73
Gruppierung, siehe Assoziation
I, 44
∈, 22
ind, 22
input, 28
interval, 48
Intervall, 44
maximal, 45
IOPNS , 20
IPRED , 20
ISORT , 20
Query–result–link–Operator, 74
Relationenmodell, 39
Relationenschema
Semantik, 39
Syntax, 39
Relationship, 13, siehe Relationshiptyp
EER–Modell, 15
Relationship–Attributtyp
EER–Diagramm, 16
EER–Modell, 15
Relationshiptyp
EER–Diagramm, 16
EER–Modell, 15
TEER–Modell, 46
REL(DT), 40
relship, 28
REL-TYPE, 39
Remove–Operator, 72
Restrict–Operator, 73
ROLE, 27
Rollenname
EER–Diagramm, 16
EER–Modell, 15
R-TYPE, 27
Kardinalität
EER–Diagramm, 16
EER–Modell, 16
Komponente
EER–Diagramm, 17
EER–Modell, 14
TEER–Modell, 46
list, 14
ltb, 22
lts, 22
M, 39
max, 22
min, 22
Modellierungskonzepte
EER–Modell, 13
ER–Modell, 13
Modelltransformation, 39
µ, 29
µ[DT], 21
S + , 20
S ∗ , 20
Objekt, siehe Entity
204
INDEX
temporaler Selektionsoperator, 79
temporales Element, 44
Term
Semantik, 37
Syntax, 35
TE type, 48
T F = {T , Tt , Tt,t }, 97
Time–link–Operator, 81
True–time–Operator, 78
[ts , te ], 44
type, 28
Typkonstruktion
EER–Diagramm, 17
EER–Modell, 15
TEER–Modell, 46
Schlüssel, 14
Schlüsselattribut, siehe Schlüsselattributtyp
Schlüsselattributtyp
EER–Diagramm, 17
EER–Modell, 14
TEER–Modell, 45
Schlüsselkandidat, 14
sel, 22
Selektion, siehe temporale Selektion
set,
14
, 29
σ, 29
σt , 45
[σ, β] |= ϕ, 37
[σt , β] |= ϕ, 94
[σ, β](τ ), 37, 94
SORTDT , 20
SORTREL , 40
SORTTDT , 48
source, 20
Spezialisierung
EER–Modell, 15
Stammrelation, 40
sum, 22
surrogate, 40
Surrogat, 40, 45
Universum, 29
Valid–Time, 45
Variable
frei, 36
gebunden, 36
ϕt , 92
Zeit, 44
Zeitintervall, siehe Intervall
Zeitpunkt, 44
T , 44
TE, 44
TEER–Anfrage–Konstrukte, 69
TEER–Datenbank–Anfragesprache
Syntax, 84, 165
Transformation in Kalkül, 97
TEER–Datenbank–Anfragesprache, 73
TEER–Diagramm, 43
TEER–Kalkül, 86
Semantik, 94
Syntax, 88
TEER–Modell, 43
TEER–Standarddatentyp–Signatur, 47
temporale Hierarchie, 44
temporale Projektion, 72
temporale Selektion, 71
temporale Zuordnung, 45
temporales Element, 45
temporaler Projektionsoperator, 75
205
Erklärung
Hiermit erkläre ich, Barbara Ingrid Kuhn, daß ich meine Diplomarbeit, ,,Entwicklung
einer Anfragesprache für temporale Datenbanken: Semantik, Ausdrucksfähigkeit und graphische Benutzerschnittstelle”, selbständig verfaßt und keine anderen als die angegebenen
Quellen und Hilfsmittel benutzt habe.
Hannover, den 19. November 1997.
Herunterladen