Datenbank-Sichten und Daten- Repräsentation

Werbung
Universität Paderborn
Fachbereich 17 - Mathematik/Informatik
Arbeitsgruppe Softwaretechnik
Prof. Dr. W. Schäfer
Warburger Str. 100
33098 Paderborn
Datenbank-Sichten und DatenRepräsentation
Seminarausarbeitung
im Rahmen der Projektgruppe
Entwicklung eines verteilten
multimedia Systems mit Hilfe
von Design Pattern
im Projekt
von
Carsten Reckord
Bergstraße 53
33415 Verl
Paderborn, Juni 2001
ii
i.
KAPITEL 1
Inhaltsverzeichnis
EINFÜHRUNG IN SICHTEN ................................................. 1
1.1 SICHTEN IN RELATIONALEN DATENBANKEN .......................................... 2
1.2 SICHTEN IN OBJEKTORIENTIERTEN DATENBANKEN ................................ 3
1.2.1 Sichten in ODMG 3.0 .............................................................................. 4
1.2.2 Ein Sichtenmodell für O2 ......................................................................... 4
1.2.3 Sichten in Coocoon .................................................................................. 7
1.3 WEITERE ANWENDUNGEN FÜR SICHTEN ................................................ 8
KAPITEL 2
SICHTEN IN VERTEILTEN DATENBANKEN .................. 9
2.1 FRAGMENTIERUNG DURCH SICHTEN .................................................... 11
2.2 SCHEMA-INTEGRATION DURCH SICHTEN .............................................. 11
2.3 MATERIALISIERTE SICHTEN .................................................................. 12
KAPITEL 3
DATENBANKMODELLIERUNG MIT UML .................... 15
3.1 MODELLIERUNG IN UML .....................................................................
3.2 MODELL-INTEGRATION IN UML ..........................................................
3.3 ABBILDUNG AUF RELATIONALE DATENBANKEN ..................................
3.4 SICHTEN IN UML ..................................................................................
16
18
19
21
KAPITEL 4
ZUSAMMENFASSUNG ........................................................ 25
ANHANG A
ARBEITEN MIT RELATIONALEN SICHTEN ................. 27
A.1 SICHTENDEKLARATION IN SQL ........................................................... 27
A.1.1 Sichten-Typen ........................................................................................ 28
A.2 ANFRAGEN AUF SICHTEN ..................................................................... 29
A.2.1 Sichtenauflösung (view resolution): ...................................................... 29
A.2.2 Sichten-Materialisierung (View Materialization) ................................. 30
A.2.3 Einschränkungen für die Sichtendefinition ........................................... 31
A.3 UPDATEOPERATIONEN AUF SICHTEN ................................................... 31
A.3.1 Änderbare Sichten nach ISO-Standard ................................................. 32
A.3.2 Das View Update Problem jenseits des ISO Standards ........................ 34
A.4 ERGÄNZUNGEN ZUM RELATIONALEN SICHTENMODELL ...................... 39
iii
A.4.1 Virtuelle Attribute in SQL3 ................................................................... 39
A.4.2 Objektrelationale Datenbanken und Objektsichten .............................. 39
ANHANG B
LITERATURVERZEICHNIS ............................................... 41
ANHANG C
ABBILDUNGSVERZEICHNIS ............................................. 43
iv
KAPITEL 1
Einführung in Sichten
Die meisten modernen Datenbank-Systeme besitzen eine Drei-Schichten-Architektur, die dem
ANSI/SPARC Datenbank-Modell[BG92] entspricht. Die in diesem Modell definierten Schichten beschreiben unterschiedliche Abstraktionsebenen für die Daten einer Datenbank. Dies sind
im einzelnen das interne Schema, das konzeptionelle Schema und das externe Schema.
externes Schema
1
2
...
n
konzeptionelles Schema
internes Schema
externe Schicht
Benutzersichten
konzeptionelle Schicht
interne Schicht
physische Schicht
Abbildung 1: Die Drei-Schicht-Architektur des ANSI/SPARC-Modells
Das interne Schema dient der Abbildung der Datenbank auf interne Datenstrukturen des Datenbank-Systems und auf das Dateisystem des unterliegenden Betriebssystems. Das konzeptionelle
Schema beschreibt die logische Struktur der Daten in der Datenbank, also die Art und Menge
der gespeicherten Daten, sowie ihre Abhängigkeiten untereinander und Integritätsbedingungen
für die Datenbank. Diese logische Struktur wird in der Regel von dem jeweiligen DatenbankAdministrator angelegt und verwaltet.
Beim Entwurf des konzeptionellen Schemas ist eine Reihe von Rahmenbedingungen zu beachten, die eine effektive und redundanzfreie Speicherung von Daten in der Datenbank sicherstellen sollen, wie zum Beispiel die Normalisierung von relationalen Datenbanken. Das hat zur
Folge, daß in der konzeptionellen Sicht auf eine Datenbank die Daten häufig nicht so strukturiert sind, wie es den Anforderungen der Benutzer entspricht. Zudem haben unterschiedliche
Benutzer häufig unterschiedliche Anforderungen an die Strukturierung dieser Daten und in der
Regel benötigen einzelne Benutzer jeweils nur Zugriff auf einen Teil der Daten in der Datenbank. Das externe Schema des Drei-Schichten-Modells erlaubt daher die Definition sogenannter Benutzersichten auf die Datenbank, um diesen Anforderungen gerecht zu werden.
Eine Benutzersicht (oder einfach Sicht, engl. view) ist eine Darstellung der Daten des unterliegenden konzeptionellen Schemas, die an die Anforderungen individueller Benutzer oder
1
1.1 Sichten in relationalen Datenbanken
Anwendungsfälle angepaßt ist. Sie erlaubt eine Restrukturierung der Daten in eine Form, die
den individuellen Anforderungen gerecht wird und erlaubt eine Fokussierung auf die in dem
jeweiligen Kontext relevanten Informationen durch Ausblendung unwichtiger Daten. Eine
Sicht wird beschrieben durch Anfragen an die Datenbank und reflektiert zu jeder Zeit das
Ergebnis dieser Anfragen.
Ein Benutzer kennt lediglich die für ihn vorgesehene Sicht. Er kann sie abfragen und verändern,
wie eine eigenständige Datenbank, ohne sich mit dem unterliegenden konzeptionellen Schema
auseinandersetzen zu müssen. Durch dieses Konzept bleibt dem Benutzer die konzeptionelle
Komplexität der eigentlichen Datenbank verborgen, wodurch eine signifikante Vereinfachung
im Umgang mit der Datenbank erreicht wird. Zudem wird hierdurch eine weitgehende logische
Unabhängigkeit von dem unterliegenden Schema erreicht. Denn bei Änderungen an dem konzeptionellen Schema, etwa durch das Einfügen neuer Attribute oder strukturelle Änderungen,
können die Sichten meist konstant gehalten werden. Hierzu sind unter Umständen lediglich die
Sichtendefinitionen entsprechend anzupassen.
Desweiteren bieten Sichten einen sehr flexiblen und komplexen Mechanismus zur Zugriffsbeschränkung auf sensible Informationen. So können diese Informationen in einzelnen Sichten
vor dem Benutzer verborgen werden, während sie in anderen Sichten verfügbar sind.
Schließlich wird durch Sichten die Vereinfachung von Anfragen an die Datenbank ermöglicht,
indem häufig auftretende Teilanfragen als Sichten definiert werden. Diese ersetzen dann in der
Formulierung der Anfrage die entsprechende Teilanfrage.
Da das Sichtenmodell von Datenbanken dazu geeignet ist - und meistens dazu verwendet wird
- logische Zusammenhänge zwischen den Informationen in einer Datenbank geeignet zu repräsentieren, kann man solche Sichten als logische Sichten bezeichnen.
In den folgenden Abschnitten werden die Sichtenmodelle für die zwei bedeutendsten Klassen
von Datenbank-Systemen vorgestellt: relationale und objekt-orientierte Datenbanken.
1.1 Sichten in relationalen Datenbanken
Eine relationale Datenbank besteht aus einer Menge von Tabellen, den sogenannten Relationen.
Jede Relation besitzt einen eindeutigen Namen und ist eine Ausprägung eines Relationen-Schemas. Ein solches Relationen-Schema besteht aus einer Liste von Attributen und deren zugehörigen Wertebereichen und zusätzlichen Integritätsbedingungen. Jedes Attribut definiert eine
Spalte der Relation. Die Gesamtheit der Relationen-Schemata aller in einer Datenbank enthaltenen Relationen bildet das konzeptionelle Schema der Datenbank, das häufig auch als Datenbankschema bezeichnet wird [EN94].
Im relationalen Modell hat der Begriff der Sicht eine etwas andere Bedeutung, als die bisher
verwendete. Wie dargestellt, bezeichnet der Begriff der Sicht im Allgemeinen die Gesamtheit
des externen Modells eines Benutzers. Im relationalen Modell jedoch bezeichnet eine Sicht eine
virtuelle Relation. Im Gegensatz zu einer Basis-Relation, die Teil des konzeptionellen Schemas
2
KAPITEL 1
1.2 Sichten in objektorientierten Datenbanken
ist und deren Tupel physisch in der Datenbank gespeichert sind, erscheint eine Sicht dem Benutzer zwar ebenfalls wie eine gewöhnliche Relation, die er genauso benutzen kann, wie eine
Basis-Relation (mit Einschränkungen bezüglich Updateoperationen, siehe Anhang A). Ihr
Inhalt ist jedoch nicht statisch festgelegt und wird auch (mit Ausnahmen, siehe Anhang A) nicht
physisch gespeichert. Stattdessen wird er dynamisch aus einer Datenbank-Anfrage berechnet,
die bei der Definition der Sicht angegeben wird. Bei dieser Anfrage handelt es sich um eine normale Datenbank-Anfrage, die mit Hilfe der relationalen Algebra[EN94] - oder einer darauf
basierenden Anfragesprache, wie SQL[EN94] - auf Basis-Relationen und bestehenden Sichten
formuliert werden kann.
Eine Sicht reflektiert zu jeder Zeit das Ergebnis der sie definierenden Anfrage. Änderungen an
den in der Anfrage verwendeten Relationen werden - im Gegensatz zu einem Snapshot, der stets
das Ergebnis der Anfrage zum Definitionszeitpunkt darstellt - unmittelbar in der Sicht reflektiert. Umgekehrt werden Updateoperationen auf einer Sicht (so sie erlaubt sind, siehe Anhang
A) direkt auf die unterliegenden Relationen umgesetzt.
Die Syntax zur Definition relationaler Sichten, sowie die Erörterung von Problemen bei
Updateoperationen auf relationalen Sichten und Lösungsansätzen hierfür kann Anhang A entnommen werden.
1.2 Sichten in objektorientierten Datenbanken
Objektorientierte Datenbanksysteme (ooDBMS) wenden das objektorientierte Modell, das aus
vielen aktuellen Programmiersprachen bekannt ist, auf konventionelle Datenbanken an.
Objekte der realen Welt werden hierbei auf Datenbank-Objekte abgebildet, die Instanzen von
Klassen sind. Eine Klasse definiert Attribute, die Eigenschaften eines Objektes beschreiben und
so den internen Zustand des Objektes darstellen, zusammen mit Nachrichten und Methoden zur
Abfrage und Veränderung dieses Zustandes. Ein Objekt reagiert auf eine Nachricht durch die
Ausführung der dieser Nachricht zugeordneten Methode. Eine Nachricht definiert also lediglich
eine Schnittstelle für den Aufruf einer Methode, die diese Nachricht implementiert. So ist es
möglich, Methoden außerhalb der Datenbank mit Hilfe von herkömmlichen objektorientierten
Sprachen zu implementieren. Jedes Objekt hat eine eindeutige Objekt-ID zur Identifikation, die
konstant und unabhängig von dem inneren Zustand des Objektes ist. Ferner erlauben die meisten objektorientieretn Datenbanken die Angabe eines Extents für jede Klasse. Ein Extent ist ein
benannter Container, der alle persitenten Instanzen dieser Klasse enthält (Diese werden, im
Gegensatz zu transienten Instanzen, in der Datenbank gespeichert).
Da die Umsetzung dieses Grundkonzeptes in unterschiedlichen objektorientierten Datenkanksystemen stark variiert und es eine Fülle unterschiedlicher Sichtenmodelle für OO-Datenbanken
gibt, sollen hier beispielhaft lediglich das Sichtenmodell des ODMG3.0-Standards und zwei
weitere, etwas komplexere Modelle beschrieben werden.
Einführung in Sichten
3
1.2 Sichten in objektorientierten Datenbanken
1.2.1 Sichten in ODMG 3.0
Der ODMG 3.0-Standard der Object Data Management Group enthält nur eine sehr rudimentäre Unterstützung für Sichten. Die Abfragesprache OQL (Object Query Language) von ODMG
erlaubt lediglich die Definition von benannten Abfragen mit folgender Syntax:
define <name>[(<parameter>[, ...])]
as <query>
wobei <query> eine Standard-OQL-Anfrage bezeichnet, die analog zu SQL die Struktur
select ... from ... where ... hat. Zusätzlich können optionale Parameter angegeben werden, die in der Anfrage verwendet werden können.
Obwohl dies eine Gruppierung von Instanzen mit bestimmten durch die Anfrage bestimmten
Eigenschaften erlaubt, ist eine echte Restrukturierung des konzeptionellen Schemas der Datenbank nicht möglich. So können etwa keine Attribute von Klassen versteckt werden, ohne die
Objektstruktur der Instanzen zu verlieren und stattdessen lediglich einfache Tupel von Attributdaten zu erhalten. Auch eine Erweiterung und Umstrukturierung der Klassenstruktur des konzeptionellen Schemas durch virtuelle Klassen analog zu virtuellen Relationen des relationalen
Modells ist nicht möglich. Daher kann mit diesem Konzept kein externes Schema als Abstraktion von dem konzeptionellen Schema der Datenbank erzeugt werden.
Da häufig angeführt wird, daß objektorientierte Datenbanken eine Erweiterung der Idee herkömmlicher (relationaler) Datenbanken darstellen sollen und als solche mindestens deren Funktionalität und Mächtigkeit zur Verfügung stellen sollten, werden im Folgenden zwei weitere
Sichtenmodelle vorgestellt, die in ihrer Mächtigkeit den Sichten relationaler Datenbanken
ähneln.
1.2.2 Ein Sichtenmodell für O2
Das im Folgenden vorgestellte Sichtenmodell aus [AB91] setzt auf dem objektorientierten
Datenbanksystem O2 auf und erweitert dieses um eine flexible Sichtenstruktur.
Ziel dieses Sichtenmodelles ist ein flexibler Mechanismus zur Restrukturierung der Datenbank
und zur Modifikation des Verhaltens und der Struktur von Objekten. Dazu führen die Autoren
in ihrem Sichtenmodell virtuelle Attribute und virtuelle Klassen ein.
Eine Sicht besteht in diesem Modell aus importierten Klassen von einer oder mehreren Datenbanken, Sichtbarkeitsregeln für die Attribute dieser Klassen, sowie zusätzlichen virtuellen Klassen und virtuellen Attributen. Eine Sichtendefinition hat folgende Form:
create view <name>
{import/hide specifications}
{class/attribute definitions}
Import-Spezifikationen haben die Form
4
KAPITEL 1
1.2 Sichten in objektorientierten Datenbanken
import {class <name>|all classes}
from database <db>
In relationalen Datenbanken hat es ausgereicht, die Attribute einer virtuellen Relation explizit
in der definierenden Anfrage aufzulisten. In objektorientierten Systemen ist so ein Vorgehen
problematisch, da hierdurch auch alle Attribute, die in Unterklassen definiert sind, verborgen
würden. Daher erlaubt dieses Modell explizit das Verstecken von Attributen mit folgender Syntax:
hide attribute <name> in class <class>
wobei <class> eine beliebige (virtuelle oder importierte) Klasse in der Sicht sein kann.
Virtuelle Attribute
Virtuelle Attribute sind Attribute, deren Wert nicht explizit definiert ist, sondern aus dem aktuellen Objektzustand errechnet werden. Hierdurch können zum Beispiel mehrere Attribute einer
Klasse zu einem komplexen Attribut zusammengefaßt werden, wie folgendes Beispiel zeigt:
Eine Klasse Person sei gegeben durch die Attribute name, city, street und zipCode. Dann können letztere drei Attribute zu einem komplexen Attribut address zusammengefaßt werden:
attribute address in class Person
has value
[city: self.city, street: self.street,
zipCode: self.zipCode]
Die Syntax zur Definition eines Attributes lautet
attribute <name>[(<parameter>,[...])]
[of type <type>]
in class <class>
[has value <value>]
Wird die Option has value angegeben, so handelt es sich um ein virtuelles Attribut, ansonsten
um ein normales. Die Angabe von Parametern ist nur für virtuelle Attribute gestattet. Diese
Definition erlaubt außerdem die Behandlung von Methoden als virtuelle Attribute mit Parameter, deren Wert durch den Methodenrumpf berechnet wird.
Virtuelle Klassen
Die Klassenhierarchie der importierten Klassen kann um virtuelle Klassen erweitert werden.
Dazu ist für jede virtuelle Klasse eine Population mit bestehenden oder neuen Objekten, die
Position in der Klassenhierarchie und das Verhalten - also die Menge der unterstützten Nachrichten - zu definieren. In dem Modell ist lediglich die Population explizit anzugeben. Position
und Verhalten werden daraus anhand der enthaltenen Objekte automatisch abgeleitet.
Für die Population virtueller Klassen gibt es mehrere Möglichkeiten:
• Spezialisierung: Die virtuelle Klasse enthält alle Instanzen einer Klasse, die einer bestimm-
ten Bedingung genügen. Diese wird in Form einer Datenbank-Anfrage ausgedrückt.
Einführung in Sichten
5
1.2 Sichten in objektorientierten Datenbanken
• Generalisierung: Die virtuelle Klasse enthält alle Instanzen einer Menge von Unterklassen
• Verhaltensabhängige Generalisierung: Die virtuelle Klasse enthält alle Klassen, die Attri-
bute oder Methoden bestimmten Namens und bestimmter Signatur haben.
• Imaginäre Objekte: Imaginäre Objekte sind neu erzeugte Objekte, deren Attributwerte aus
den Attributwerten bestehender Objekte berechnet werden.
Insgesamt sieht die Definition einer (virtuellen) Klasse wie folgt aus:
class <name> [(<parameter>[,...])]
[includes {<classname>|
like <classname>|
[imaginary] (<query>)}[,...]]
Mit der Option like <classname> werden dabei alle Objekte eingebunden, deren Klassen
mindestens die Attribute und Methoden von <classname> haben. Die optionalen Parameter
können wie bei virtuellen Attributen als Argumente der Datenbankanfrage verwendet werden.
Das Schlüsselwort imaginary muß angegeben werden, wenn das Ergebnis der Anfrage eine
Liste von Attributwerten ist, aus denen ein neues, imaginäres Objekt erzeugt werden soll.
Ansonsten darf in der select-Klausel der Anfrage nur ein einzelnes Objekt angegeben sein. Hier
zwei Beispiele:
class Supported (maxIncome)
includes Senior, Student,
(select a in Adult
where a.income<maxIncome)
class Family includes imaginary
(select [husband:H, wife:H.partner]
from Person H where H.sex=’male’)
Nach der Definition einer virtuellen Klasse und ihrer Population können neue virtuelle Attribute
(und damit auch Methoden) für die Klasse definiert werden. Zum Beispiel
attribute supportAmount in Supported
has value amount(self)
wobei amount eine dem System bekannte Funktion zur Berechnung der Unterstützungshöhe ist.
Virtuelle Klassenhierarchie
Die Klassenhierarchie der Sicht mit allen importierten Klassen und den darauf definierten virtuellen Klassen kann mittels Typinferenz automatisch hergeleitet werden. Sei hierzu C eine virtuelle Klasse, die die Klassen C1...Ck und Instanzen der Klassen Ck+1...Cn enthält. Es gilt:
• Ist D eine Oberklasse aller Ck, so ist D eine Oberklasse von C
• Ci ist Unterklasse von C für alle i ∈ [1,k]
6
KAPITEL 1
1.2 Sichten in objektorientierten Datenbanken
Updateoperationen auf Sichten
Die Sichten, die mit diesem Modell erzeugt werden können, sind hinsichtlich der meisten Operationen updatefähig. Einzige Bedingungen sind, daß bei Mehrfachvererbung Attributnamen
eindeutig aufgelöst werden können (ansonsten entsteht Schizophrenie[AB91]) und alle
Updatemethoden auf imaginären Objekten redefiniert sind, um die entsprechenden Änderungen an den ursprünglichen Objekten vorzunehmen. Die zweite Bedingung entspricht damit der
Idee aus Anhang A, Updates auf relationale Sichten zu ermöglichen durch abstrakte Datentypen mit entsprechenden Updateoperationen.
1.2.3 Sichten in Coocoon
Einen anderen Ansatz verfolgt das COCOON-System [LST91]. Anstatt die Syntax des Datenbanksystems um zusätzliche Konstrukte zu erweitern, wie dies im vorangegangenen System der
Fall ist, wird eine Sicht ähnlich zu SQL durch einen Ausdruck der Form
define view <name> as <query>
definiert. Anders als in SQL oder dem vorangegangenen Beispiel wird in diesem System jedoch
durch eine besondere Eigenschaft der Anfragesprache COOL die Update-Fähigkeit de Sichten
sichergestellt: Objekt-erhaltende Operatorsemantik.
Im Gegensatz zur OQL, die relationale Semantik hat, also Tupel von Werten zurückliefert, liefert COOL existierende Objekte zurück. Hierfür existieren Operationen zur Selektion, Projektion und Erweiterung von Objekten um neue Methoden:
select [<query>](<source>)
project[<attr>[,...]](<source>)
extend[<function-name>:=<expr>[,...]](<source>)
wobei <source> einen Klassennamen oder einen mengenwertigen Ausdruck bezeichnet.
Zusätzlich existieren die Mengenoperationen union, intersect und difference. Ein
mengenwertiger Ausdruck ist ein Klassenname, über den alle Instanzen der Klasse referenziert
werden, eine der oben angegebenen Operationen sowie jede Kombination hieraus mit Hilfe von
Mengenoperationen.
Der Unterschied zur relationalen Semantik von OQL soll anhand eines Beispiels dargestellt
werden: Sei Person eine Klasse mit den Attributen name, sex, age und income. In OQL liefert
die Projektion »select p.name, p.sex from Person p« eine Menge von zweidimensionalen Tupeln mit den Werten der Attribute name und sex der Instanzen von Person. Dieselbe Projektion in COOL, gegeben durch »project[name, sex](Person)«, liefert alle
Instanzen von Person zurück, blendet jedoch alle Attribute außer name und sex aus, so daß darauf nicht zugegriffen werden kann.
Wie gesagt ist durch die Semantik der Abfragesprache sichergestellt, daß alle in COOL möglichen Anfragen zur Definition update-fähiger Sichten genutzt werden können. Denn alle Operationen werden durch die objekterhaltende Semantik direkt auf den realen Objekten ausgeführt.
Einführung in Sichten
7
1.3 Weitere Anwendungen für Sichten
Jede Sicht ist in diesem Modell eine neue Klasse, für die mittels der extend-Operation auch neue
Methoden definiert werden können. Ferner wird in [Tre91] gezeigt, daß auch eine verhaltensabhängige Generalisierung analog zu Abschnitt 1.2.2 möglich ist. Damit bietet auch dieses
Sichtenmodell die Möglichkeit zur flexiblen Restrukturierung des konzeptionellen Schemas.
Im Gegensatz zu dem Sichtenmodell aus Abschnitt 1.2.2 definiert dieses Modell jedoch Sichten
vollständig mit Hilfe der Anfragesprache und ist somit wesentlich einfacher aufgebaut als das
O2-Modell.
1.3 Weitere Anwendungen für Sichten
In der Einleitung ist dargestellt worden, daß ein externes Schema für eine Datenbank sinnvoll
ist, um logische Unabhängigkeit vom konzeptionellen Schema zu erhalten und um die Struktur
der Datenbank an die individuellen Anforderungen einzelner Benutzer anpassen zu können.
Darüber hinaus gibt es aber eine Vielzahl weiterer interessanter Anwendungsgebiete für Sichten:
• Schema-Entwurf durch Sichtenintegration: Eine Möglichkeit, das konzeptionelle Schema
einer Datenbank „bottom up“ zu entwickeln. Die Anforderungen an die Datenbank werden
für alle Benutzergruppen getrennt als Sichten entwickelt. Durch Zusammenfügen dieser
Sichten und Eliminierung möglicher Konflikte zwischen ihnen kann dann das Gesamtschema hergeleitet werden.
• Datenbank-Integration: Daten können aus einer Datenbank in eine andere exportiert wer-
den, indem die unterschiedlichen Schemata der beteiligten Datenbanken mit Hilfe von Sichten auf ein gemeinsames (Teil-)Schema abgebildet werden, über das dann die Daten
ausgetauscht werden können
• Anpassung des Datenmodells: Sichten können genutzt werden, um auf eine Datenbank mit
einem anderen Datenmodell zuzugreifen. So können etwa Objekt-Sichten auf relationale
Datenbanken[BKSW91] (was grob gesagt das Prinzip objektrelationaler Datenbanken ist)
oder relationale Sichten auf objektorientierte Datenbanken definiert werden.
• Visualisierungssysteme: Bei der Visualisierung von Daten einer Datenbank tritt dasselbe
Problem auf, wie bei materialisierten Sichten. Ein Visualisierungssystem sollte stets den
aktuellen Datenstand repräsentieren. Daher muß es bei Änderungen an den Daten entsprechend aktualisiert werden. Dies entspricht dem View Maintenance Problem, das in Anhang
A vorgestellt wird. Einige Visualisierungssysteme bauen daher auf einer Model-View-Controller-Architektur auf, die materialisierte Sichten für das Modell und die zugehörigen
Maintenancealgorithmen für den Controller verwenden.[Lee]
Weitere Anwendungsmöglichkeiten werden in Kapitel 2 im Zusammenhang mit verteilten
Datenbanken erläutert.
8
KAPITEL 1
Sichten in verteilten Datenbanken
KAPITEL 2
Verteilte Datenbanken können aufgefaßt werden als logisch integrierte Datenmengen, die physikalisch über ein Netzwerk verteilt sind. Verteilte Datenbanksysteme sind damit Softwaresysteme zur Verwaltung einer verteilten Datenbank, so daß die Verteilung für den Benutzer
transparent ist. Die meisten verteilten Datenbanksysteme erreichen diese Transparenz durch
eine Architektur, die dem ANSI/SPARC Modell entspricht. Die verschiedenen Klassen von
verteilten Datenbanksystemen lassen sich grob unterteilen in (homogene) verteilte Datenbanksysteme, (heterogene) Multi-Datenbanksysteme und föderierte Datenbanksysteme. Sie unterscheiden sich in der Art der lokalen Datenbanken, auf denen sie aufbauen, und deren
Integration in das SPARC-Modell. Abbildung 2 zeigt die Architekturen dieser drei Klassen[BG92].
1
globale
Benutzersichten
n
1
globale
Benutzersichten
globales
Schema
n
globales
Schema
FragmentierungsSchema
Hilfsschema
1
globale
Benutzersichten
n
AllokationsSchema
Hilfsschema
1
1
lokale
konzeptionelle
Schemata
...
lokale
interne
Schemata
n
1
1
...
n
n
1
lokale
Benutzersichten
lokale DB
a) verteiltes Datenbank-System
Hilfsschema
lokale
konzeptionelle
Schemata
...
lokale
interne
Schemata
n
n
1
1
...
...
n
n
lokale
Benutzersichten
1
1
lokale
konzeptionelle
Schemata
...
lokale
interne
Schemata
1
n
...
n
n
lokale DB
lokale DB
b) Multidatenbank-System
c) Föderiertes Datenbank-System
Abbildung 2: Verteilte Datenbankarchitekturen
9
Architekturen verteilter Datenbanken
(Homogene) Verteilte Datenbanken bestehen aus mehreren gleichartigen lokalen Datenbanken, auf die die Daten eines globalen Schemas aufgeteilt sind. Das Fragmentierungsschema
definiert , wie die Daten des globalen Schemas auf die lokalen Datenbanken aufgeteilt werden
und das Allokierungsschema definiert, in welchen lokalen Datenbanken diese Fragmente
abgelegt sind. Der Zugriff auf die Daten erfolgt ausschließlich über die verteilte Datenbank.
(Heterogene) Multi-Datenbanksysteme bestehen hingegen aus verschiedenartigen Datenbanksystemen mit eventuell unterschiedlichen Datenmodellen. So kann zum Beispiel eine lokale
Datenbank ein hierarchisches Datenmodell verwenden, während eine andere ein relationales
Modell verwendet. Multi-Datenbanksysteme haben häufig ein Hilfsschema, um zum Beispiel
die Umrechnung von Maßeinheiten in verschiedenen lokalen Datenbanken zu ermöglichen.
Einige Systeme haben auch ein Fragmentierungsschema. Multi-Datenbanksysteme werden
meist dort eingesetzt, wo auf bestehende Datenbanken aufgesetzt werden soll. Sie erlauben
daher insbesondere die normale Weiterverwendung der lokalen Systeme durch Benutzer.
Föderierte Datenbanksysteme sind spezielle Multi-Datenbanksysteme, die lediglich die Daten,
die sie mit anderen Datenbanken teilen sollen, in einem Export-Schema definieren. An einem
föderierten System beteiligte Datenbanken können das System jederzeit verlassen oder ihm beitreten. Den lokalen Systemen ist es selbst überlassen, mit Hilfe der zur Verfügung stehenden
Exportschemata ein eigenes globales Schema zu definieren.
Sichten auf verteilte Datenbanken
Wie bereits erwähnt verhält sich eine verteilte Datenbank hinsichtlich Datenbankoperationen
völlig transparent und die Verteilung ist für den Benutzer nicht erkennbar. Anfragen und
Updateoperationen auf der verteilten Datenbank werden vom Datenbanksystem in entsprechende Operationen auf den lokalen Datenbanken umgesetzt. Daher ist auch die Definition
von Sichten mittels Anfragen auf der Datenbank für den Benutzer transparent. Analog zu zentralisierten (nicht-verteilten) Datenbanken wird die definierende Anfrage einer Sicht gespeichert und bei Bedarf durch Sichtenauflösung oder Materialisierung (siehe Anhang A) für
Operationen zur Verfügung gestellt.
Somit gelten für Sichten auf verteilte Datenbanken ebenfalls alle in Kapitel 1 dargestellten
Eigenschaften. In diesem Kapitel soll daher lediglich auf drei spezielle Anwendungsmöglichkeiten von Sichten in verteilten Datenbanksystemen eingegangen werden: die Verwendung von
Sichten zur Beschreibung von Fragmentierung und zur Schema-Integration, sowie die Optimierung der Zugriffszeit durch materialisierte Sichten.
Im weiteren Verlauf dieses Kapitels wird zur einfacheren Darstellung für die Datenbanken ein
relationales Datenmodell angenommen. Alle Ausführungen lassen sich jedoch auch auf andere
Datenmodelle mit entsprechend mächtigen Sichtenmodellen übertragen.
10
KAPITEL 2
2.1 Fragmentierung durch Sichten
2.1 Fragmentierung durch Sichten
In verteilten Datenbanken werden alle Daten auf die unterliegenden lokalen Datenbanken aufgeteilt. Dies wird als Fragmentierung bezeichnet. Hierbei ist es möglich, lediglich die Relationen des globalen Schemas auf die lokalen Datenbanken aufzuteilen. Häufig werden jedoch auch
einzelne Relationen auf mehrere lokale Datenbanken aufgeteilt. Hierzu können etwa vollständige Tupel einer Relation auf unterschiedliche lokale Datenbanken verteilt werden, was als
horizontale Fragmentierung bezeichnet wird. Alternativ kann eine Relation entlang ihrer Attribute aufgetrennt werden, was als vertikale Fragmentierung bezeichnet wird. Eine Kombination
beider Techniken wird als hybride Fragmentierung bezeichnet.
Die Aufteilung einer Relation entlang ihrer Tupel beziehungsweise ihrer Attribute wird auch in
Anhang A beschrieben. Dort erfolgt diese Aufteilung durch die Definition von horizontalen
beziehungsweise vertikalen Sichten. Es liegt daher nahe, dasselbe Vorgehen für die Definition
des Fragmentierungsschemata anzuwenden. Bei der vertikalen Fragmentierung ist lediglich
darauf zu achten, daß alle Fragmente mindestens den Primärschlüssel oder einen vollständigen
Sekundärschlüssel enthalten müssen, damit die Fragmente wieder korrekt zusammengesetzt
(materialisiert) werden können.
Die Definition des Fragmentierungsschemas mit Hilfe von Sichten hat den Vorteil, daß eine
geschlossene Darstellung der verschiedenen Abstraktionsebenen des Datenbanksystems existiert. Von einem zentralen globalen Schema wird sowohl das externe Schema als auch das
Fragmentierungsschema auf dieselbe Weise abgeleitet. Dies erlaubt zudem die Auffassung des
Datenbanksystems als eine einheitliche hierarchische Struktur mit den Fragmenten als Blätter,
von denen Relationen und Sichten abgeleitet werden können[CBS97].
2.2 Schema-Integration durch Sichten
In Abschnitt 1.3 ist bereits erwähnt worden, daß Sichten zur Entwicklung eines komplexeren
Schemas genutzt werden können, ebenso wie zur Integration unterschiedlicher Datenbanken in
ein gemeinsames Schema. Dies entspricht genau dem Problem der Schema-Integration für
Multi-Datenbank-Systeme. Die Schemata unterschiedlicher existierender Datenbanken müssen
in ein einheitliches und konsistentes globales Schema integriert werden. Die Tatsache, daß einzelne lokale Datenbanken eventuell unterschiedliche Datenmodelle verwenden, kann hier vernachlässigt werden, da das Multi-Datenbank-System auf jeden Fall sein eigenes Datenmodell
auf die lokalen Datenmodelle abbilden können muß und umgekehrt.
Der Vorgang der Schema-Integration wird in [BG92] als Serie von Abstraktionsschritten auf
den Daten der lokalen Schemata beschrieben. Da das globale Schema höchstens die Summe der
Daten der lokalen Schemata enthalten kann, in der Regel jedoch weniger, werden in diesen
Abstraktionsschritten sukzessive Details der lokalen Schemata ausgeblendet oder transformiert.
Diese Abstraktionsschritte lassen sich in verschiedene Kategorien unterteilen:
Sichten in verteilten Datenbanken
11
2.3 Materialisierte Sichten
• Aggregationen: Beziehungen zwischen Objekten der lokalen Schemata werden durch ein
abstrakteres Objekt ausgedrückt. Eine Aggregation zwischen Kunde und Händler kann etwa
durch ein Objekt „Vertrag“ repräsentiert werden.
• Generalisierung: Mehrere Relationen mit einer gemeinsamen Teilmenge an Attributen wer-
den in eine Relation mit dieser Attributteilmenge umgesetzt.
• Selektion: Für das globale Modell ist nur ein Teil der Objekte eines Typs interessant. Dieser
Abstraktionsschritt kann analog zur Generalisierung auch als Spezialisierung verstanden
werden.
• Weitere Transformationen zur syntaktischen Anpassung der Schemata, etwa zur Einheiten-
konvertierung oder um unterschiedliche Tabellenstrukturen einander anzupassen.
• Weitere Transformationen zur semantischen Anpassung, etwa um immanente Informatio-
nen lokaler Schemata als explizite Attribute in das globale Schema aufzunehmen. So kann
etwa eine Relation mit Transportrouten in den lokalen Schemata jeweils nur die Zielorte
beinhalten, während als Startort immanent der Standort der lokalen Datenbank angenommen wird. Haben die lokalen Datenbanken unterschiedliche Standorte, so müssen diese in
der globalen Relation berücksichtigt werden.
Diese Transformationen lassen sich in der Regel durch Operationen des globalen Datenmodells
ausdrücken und können damit in Form von Sichten definiert werden. Aggregationen können im
relationalen Modell etwa durch Join und Projektion ausgedrückt werden, Generalisierungen
durch Vereinigung und Spezialisierungen durch Selektionsbedingungen. Damit läßt sich ähnlich zu den Ausführungen in Abschnitt 2.1 die Definition des Multi-Datenbank-Systems in
einem geschlossenen Modell beschreiben.
2.3 Materialisierte Sichten
Wie auch in Anhang A erläutert wird, ist eine dynamische Berechnung des Inhaltes einer Sicht
bei jeder Anfrage durch Sichtenauflösung nicht immer erstrebenswert. Dies ist insbesondere in
verteilten Datenbanken der Fall, da die definierende Anfrage einer Sicht in der Regel eine verteilte Anfrage auf mehrere Datenbanken ist. Besonders für häufig benutzte Sichten bedeutet dies
einen hohen zeitlichen Aufwand und eine signifikante Zunahme des Kommunikationsvolumens
im Netzwerk. Dies ist unter Umständen nicht akzeptabel. Daher werden in verteilten Datenbanken häufig materialisierte Sichten als Alternative zur Sichtenauflösung eingesetzt (siehe
Anhang A). Dadurch werden Netzwerkzugriffe bei Anfragen an eine Sicht eliminiert. Lediglich
bei der Aktualisierung einer Sicht aufgrund von Änderungen an den Basisrelationen entsteht
Netzwerkverkehr und Systemlast. Durch Incremental View Maintenance (siehe Anhang A)
kann beides weiter reduziert werden.
View Maintenance-Algorithmen lassen sich anhand der Informationen klassifizieren, auf die sie
zur Aktualisierung einer materialisierten Sicht zurückgreifen müssen. Im einfachsten Fall haben
die Algorithmen Zugriff auf alle an der Sicht beteiligten Relationen. Ein Beispiel für einen solchen Algorithmus ist der counting-Algorithmus[GM95]. Hierbei wird für jedes Tupel der Sicht
12
KAPITEL 2
2.3 Materialisierte Sichten
dessen Multiplizität mitgespeichert. Änderungen an Tupeln werden durch Änderungen an diesem Zähler ausgedrückt. Einfügen eines neuen Tupels in eine Basisrelation erhöht den Zähler
um eins, Löschen verringert ihn. Änderungen an einem Tupel werden auf Einfüge- und
Löschoperationen abgebildet. Ein Tupel mit einer Multiplizität von Null wird aus der Sicht
gelöscht.
Algorithmen, die nur einen Teil der an einer Sicht beteiligten Relationen benötigen, sind für verteilte Datenbanken meist besser geeignet, da weniger Informationen zwischen den Netzwerkknoten ausgetauscht werden muß. Eine spezielle Unterklasse dieser Algorithmen erlaubt die
Aktualisierung einer materialisierten Sicht nur unter Verwendung der Sicht selbst. Sichten, die
durch einen solchen Algorithmus aktualisiert werden können, werden als self-maintainable
views bezeichnet. Solche Sichten sind in verteilten Datenbanken besonders effizient zu aktualisieren, da sie nur eine Liste der Aktualisierungsoperationen auf ihren Basisrelationen benötigen,
um aktualisiert zu werden.
Häufig lassen sich View Maintenance-Algorithmen zudem mit Algorithmen für das sogenannte
irrelevant update-Problem kombinieren. Diese Algorithmen erlauben bereits im Vorfeld die
Erkennung von Update-Operationen auf den Basisrelationen, die keinen Einfluß auf die Sicht
haben.
Eine große Klasse von Sichten sind die sogenannten SPJ-Sichten (Select-Project-Join). Ihre
definierenden Anfragen sind von der Form
select ti1.aj1,...,tin.ajn
from R1 t1,...,Rm tm
where <cond1> and ... and <condk>
wobei <condi> entweder eine Join-Bedingung von der Form t.a=s.b oder eine Selektionsbedingung in Form eines Vergleiches mit einer Konstanten ist. Für die hierdurch definierte Klasse
von Sichten kann gezeigt werden, daß es sich fast immer um self-maintainable Sichten in Bezug
auf Lösch- und Update-Operationen handelt[GM95].
Anfrage-Optimierung durch materialisierte Sichten
Die Verringerung der Antwortzeiten von Anfragen auf Sichten durch die Verwendung von
materialisierten Sichten und effizienten Aktualisierungsalgorithmen kann aber darüber hinaus
auch für zusätzliche Optimierungen weiterverwendet werden. In [GL01] wird ein Optimierer
für Datenbankanfragen mit Hilfe von materialisierten Sichten vorgestellt. Hierzu werden automatisch eine große Zahl geeigneter SPJ-Sichten erzeugt, so daß viele Datenbank-Anfragen in
Anfragen transformiert werden können, die ausschließlich auf materialisierte Sichten zugreifen. Durch geeignete Index-Strukturen, sogenannte Filter-Bäume, über die definierenden
Anfragen dieser Sichten ist dieses view matching effizient zu realisieren. Es wird gezeigt, daß
durch einen derartigen Optimierer immense Performance-Steigerungen möglich sind, da etwa
80-90 % aller Anfragen durch Anfragen auf materialisierte Sichten ausgedrückt werden können.
Sichten in verteilten Datenbanken
13
2.3 Materialisierte Sichten
14
KAPITEL 2
KAPITEL 3
Datenbankmodellierung mit UML
Wie in Abschnitt 1.2.3 und Abschnitt 2.2 zu erkennen ist, ist ein zentrales Problem des Datenbankentwurfs die Schema-Integration, also die Zusammenführung unterschiedlicher Benutzersichten zu einem zentralen Schema. Der Entwurf einer Datenbank erfolgt meist mit Hilfe von
speziellen Entwurfsdiagrammen für den jeweiligen Datenbank-Typ, etwa Entity-Relationship(ER-) Diagrammen für relationale Datenbanken oder erweiterten ER-Diagrammen (EER-Diagrammen) für objektrelationale oder objektorientierte Datenbanken.
Häufig erfolgt der Entwurf einer Datenbank jedoch nicht isoliert, sondern eingebettet in den
Entwurf einer oder mehrerer Applikationen, die auf die Datenbank zugreifen sollen. Diese
Applikationen werden in der Regel mit Hilfe von objektorientierten Modellierungssprachen
entworfen und in einer objektorientierten Programmiersprache wie C++ oder Java implementiert. Hieraus ergibt sich ein Problem im Zusammenhang mit herkömmlichen Entwurfsmethoden für Datenbanken. Denn die unterschiedlichen Modellierungssprachen für Datenbank und
Applikationslogik erlauben keine geschlossene Modellierung des Systems. Vielmehr müssen
Teile des Applikationsmodelles, die ebenfalls Bestandteil der Datenbank sind, dort entsprechend der eingesetzten Datenbank-Entwurfsdiagramme neu modelliert werden. Dieses Vorgehen hat nicht nur eine Erschwerung von Entwurfsänderungen durch die Umsetzung in zwei
unterschiedlichen Modellen zur Folge. Auch eine Portierung auf eine andere, neuere Datenbanktechnologie, wie etwa von relationalen auf objektorientierte Datenbanken gestaltet sich
sehr schwierig.
Derartige Probleme können vermieden werden, wenn der Entwurf der Applikationslogik und
der Datenbank in einem einzigen Modell mit Hilfe einer einheitlichen Modellierungssprache
erfolgen kann. Diese sollte außerdem eine Abbildung des Modelles auf eine möglichst große
Zahl von Datenbank-Typen erlauben. Wie gesagt wird die Applikationslogik meist objektorientiert entworfen. auch ER- und EER-Diagramme können leicht auf objektorientierte Modelle
abgebildet werden. Auch Verfahren zur Lösung vieler traditioneller Probleme des Datenbankentwurfes, wie der Schema-Integration (siehe Abschnitt 1.2.3 und Abschnitt 2.2), zeigen objektorientierte Ansätze. Daher liegt es nahe, die Datenbank zusammen mit der Applikationslogik
mit einer objektorientierten Modellierungsprache zu entwerfen.
Die Unified Modelling Language [UML] von Grady Booch, James Rumbaugh und Ivar Jacobson ist eine objektorientierte, grafische Modellierungssprache zur Beschreibung statischer und
dynamischer Eigenschaften eines Softwaresystems. Sie ist aus einer Zusammenführung der
Sprachen OMT [Rum94] von Rumbaugh, OOSE [Jac95] von Jacobson und Booch-Diagrammen [Boo94] von Grady Booch entstanden und wurde 1997 erstmals vorgestellt.
15
3.1 Modellierung in UML
In den folgenden Absätzen soll der Entwurf von Datenbankschemata mit Hilfe der UML erläutert werden. Für eine genauere Darstellung der hier vorgestellten Methoden und der sich ergebenden Probleme siehe [Mul99].
3.1 Modellierung in UML
Die Modellierung eines Datenbank-Systems in UML erfolgt grundsätzlich genauso, wie die
Modellierung eines herkömmlichen Software-Systems. Im Gegensatz zu herkömmlichen
Modellierungsmethoden für Datenbanken wird nicht zwischen Datenbank- und Applikationsmodellierung unterschieden.
In einem ersten Schritt werden die Anforderungen an das System in Form von Use-Case-Diagrammen modelliert. Hierbei werden Benutzer - dies können Anwender des Systems oder auch
andere Systemkomponenten sein - als Aktoren in Form von Strichmännchen dargestellt. Alle
Aktionen, die das System diesen Aktoren zur Verfügung stellen soll, werden als Use-Cases in
Form von Ovalen dargestellt. Abbildung 3 zeigt ein solches Use-Case-Diagramm.
Online shop
add Customer
remove Customer
process Order
«uses»
customer
support
remove Order
packager
add Order
identify
customer
Abbildung 3: Use-Case-Diagramm
Für jeden Use-Case können in einem nächsten Schritt mit Hilfe von Kollaborationsdiagrammen
die beteiligten Objekte, ihre Beziehungen untereinander und die Operationen auf diesen Objekten identifiziert und modelliert werden. Abbildung 4 zeigt dies beispielhaft.
1:getOrder
Customer
OrderSystem
Packager
address
1.1:partsInStock
recipient
3.2:removeOrder
1.1.1:inStock
2:getParts
3:ship
Order
parts
Part
Abbildung 4: Kollaborationsdiagramm »process Order«
16
KAPITEL 3
3.1 Modellierung in UML
Sind alle Objekte identifiziert, so kann hieraus eine Klassenhierarchie abgeleitet werden, indem
gleichartige Objekte zu Klassen zusammengefaßt und Klassen spezieller Objekte als Unterklassen allgemeinerer Klassen modelliert werden. Attribute und Methoden der Klassen ergeben sich
aus den Eigenschaften der Objekte in den Kollaborationsdiagrammen und den Kollaborationsnachrichten zwischen den Objekten. In Abbildung 5 ist ein Klassendiagramm zu dem Kollaborationsdiagramm aus Abbildung 4 und dem Use-Case-Diagramm aus Abbildung 3 dargestellt.
Address
+town:String
+Street:String
OrderSystem
livesAt
Person
0..1
0..1 +name:String
orders
n
Customer
Employee
+id:Integer
Packager
+custID:String
+login:String 1
+identify():void
recipient
Order
n +partsInStock():bool
+ship():void
0..1
parts
Part
+inStock():bool
0..1
n
Abbildung 5: Klassendiagramm
Ist so schließlich das gesamte System modelliert, müssen die für die Datenbank relevanten Teile
des Modelles identifiziert werden. Hierzu ist zunächst zwischen persistenten Klassen, deren
Instanzen in der Datenbank gespeichert werden sollen, und transienten Klassen, die lediglich in
der Applikationslogik verwendet werden, zu unterscheiden. So sind etwa in einem MVCModell nur die Modell-Klassen persistent, während die Instanzen der View- und ControllerKlassen ausschließlich in der Applikationslogik benötigt werden. Persistente Klassen werden in
UML durch den Stereotyp «persistent» gekennzeichnet.
Desweiteren muß entschieden werden, ob das dynamische Verhalten einer Klasse, also ihre
Methoden und Signale, in der Datenbank oder in der Applikation realisiert werden soll. Für die
Realisierung in der Applikation spricht hierbei bessere Portabilität des Verhaltens, einfachere
Wartbarkeit und der meist wesentlich größere Funktionsumfang der verwendeten Programmiersprache. Für eine Implementierung in der Datenbank in Form von stored Procedures und Triggern spricht die höhere Performance bei Operationen auf großen Datenmengen und einem
hohen Aufkommen an Transaktionen. Methoden, die auf transienten Daten arbeiten, sollten
immer in der Applikation realisiert werden.
Da die Umsetzung des so entstandenen Datenmodells auf eine objektorientierte Datenbank
direkt erfolgen kann, soll hier nicht näher darauf eingegangen werden. Stattdessen wird in
Abschnitt 3.3 die etwas problematischere Umsetzung in ein relationales Schema skizziert. Für
eine genaue Beschreibung der Umsetzung in Schemata für unterschiedliche Datenbank-Typen
siehe [Mul99].
Datenbankmodellierung mit UML
17
3.2 Modell-Integration in UML
3.2 Modell-Integration in UML
Häufig soll eine Datenbank von mehreren Applikationen oder unterschiedlichen Komponenten
eines großen Software-Systems verwendet werden. Hier bietet es sich an, analog zum Vorgehen
der Sichtenintegration aus Abschnitt 1.3 diese Komponenten und ihre Anforderungen an die
Datenbank nach dem dargestellten Verfahren zunächst einzeln zu modellieren. Für jede Komponente ergeben sich eine Anzahl von Use-Cases und aus jedem Use-Case kann ein Datenmodell entwickelt werden, das einer Sicht auf das Gesamtmodell (sowohl der Datenbank als auch
der Applikationslogik) entspricht.
Diese Modelle müssen anschließend zu einem einheitlichen Gesamtmodell zusammengefügt
werden. Dies entspricht dem in Abschnitt 2.2 erläuterten Problem der Schema-Integration für
verteilte Datenbanken. Auch hier kann die Integration mit Hilfe objektorientierter Techniken in
einigen Schritten erfolgen[Mul99]:
1. Identifikation von strukturellen Ähnlichkeiten in den einzelnen Modellen: Namensähnlichkeiten, ähnliche Beziehungen etc.
2. Mit Hilfe der so gewonnenen Informationen Identifikation von semantischen Gemeinsamkeiten: Unterschiedliche Klassen mit Gemeinsamkeiten in den enthaltenen Informationen,
etc.
3. Integration der gefundenen Ähnlichkeiten in ein Modell:
Beseitigung von Namenskonflikten, Umsetzung semantischer Gemeinsamkeiten der Klassen:
• Gemeinsame Daten in unterschiedlichen Klassen können mit Hilfe von Assoziationen aus-
gedrückt werden (siehe Abbildung 6)
• Ähnliche Klassen können durch Vererbung modelliert werden, wobei gemeinsame Attri-
bute in einer Oberklasse modelliert werden und die unterschiedlichen Details in den entsprechenden Unterklassen (siehe Abbildung 6)
4. Beseitigung verbleibender Inkonsistenzen in den Modellen. Hier muß von Fall zu Fall eine
geeignete Lösung gefunden werden. Eventuell sind auch die einzelnen Modelle entsprechend abzuwandeln. Ein Beispiel für ein solches Problem sind etwa nicht miteinander vereinbare Integritätsbedingungen.
Person
Person
+name:String
+sex:String
+age:Integer
0..1
livesAt
n
Address
Contact
+
+name:String
0..1
contactMethods
n
ContactMethod
+name:String
+sex:String
+age:Integer
0..1
contactMethods
n
ContactMethod
+town:String
+Street:String
Address
+town:String
+Street:String
Abbildung 6: Integration von Klassendiagrammen
18
KAPITEL 3
3.3 Abbildung auf relationale Datenbanken
Das hier beschriebene Verfahren, die Komponenten eines Systems zunächst einzeln zu modellieren, hat zahlreiche Vorteile gegenüber einer geschlossenen Modellierung des gesamten
Systems. Die kleineren Modelle sind zumeist übersichtlicher und einfacher zu erstellen. Durch
die Aufteilung in mehrere Modelle können auch nach der Integration die Komponenten des
Gesamtsystems leichter für eine modulare Entwicklung gruppiert werden. Und aus den einzelnen Modellen sind direkt die unterschiedlichen Benutzersichten für das externe Schema der
Datenbank ableitbar.
3.3 Abbildung auf relationale Datenbanken
Sobald das vollständige Modell einer Applikation und der zugehörigen Datenbank erstellt und
der für die Datenbank relevante Teil, das Datenmodell, festgelegt ist, kann dieses Datenmodell
in ein entsprechendes Datenbank-Schema umgesetzt werden. Während in objektorientierten
Modellen Operationen auf individuellen Objekten ausgeführt werden und Navigation mit Hilfe
von Assoziationen zwischen Objekten erfolgt, arbeiten relationale Datenbanken jedoch mengenbasiert. Operationen werden auf Datenmengen ausgeführt und Navigation erfolgt innerhalb
oder zwischen Mengen von Daten. Aus diesem als impedance mismatch bekannten Problem
ergeben sich zahlreiche Schwierigkeiten bei der Umsetzung eines objektorientierten Modells in
ein relationales Datenbankschema. Im Folgenden soll skizziert werden, wie trotzdem eine recht
einfache Umsetzung eines Teils des Modells möglich ist und welche objektorientierten Modellaspekte nicht oder nur schwer umzusetzen sind.
Klassen und Vererbung
Das objektorientierte Modell besteht aus Klassen und deren Instanzen, den Objekten. Im relationalen Modell werden Informationen dagegen in Form von Relationen, die Tupel von Daten
enthalten, verwaltet. Es liegt nahe, Klassen auf Relationen abzubilden und deren Instanzen als
Tupel ihrer Attributwerte in den Relationen abzulegen. Für jede Klasse kann so eine Relation
in das Datenbankschema aufgenommen werden, die dieselben Attribute hat, wie die darzustellende Klasse. Vererbung kann bei diesem Vorgehen auf unterschiedliche Weisen umgesetzt
werden:
• Jede Vererbungshierarchie wird durch eine Relation dargestellt. Die Relation enthält alle
Attribute der beteiligten Klassen und für Instanzen einzelner Klassen werden nicht definierte Attribute durch null-Werte repräsentiert. Die Hierarchie wird hierdurch geebnet.
• Jede Klasse wird durch eine Relation dargestellt, die alle Attribute der Klasse enthält. Für
jede Instanz einer Klasse existieren Einträge in der zu der Klasse gehörenden Relation und
den Relationen aller Oberklassen.
• Jede Klasse wird durch eine Relation dargestellt, die alle Attribute enthält, die in der Klasse
neu definiert sind, sowie durch eine foreign key-Beziehung zu der Relation der Vaterklasse.
Die Attribute eines Objektes werden entsprechend auf die Relationen für Klasse und Oberklassen aufgeteilt.
Datenbankmodellierung mit UML
19
3.3 Abbildung auf relationale Datenbanken
Die erste Alternative erlaubt einfache Updates und Abfragen. Jedoch ist die Identifikation der
zugehörigen Klasse für ein Tupel der Relation kompliziert und eventuell nicht eindeutig möglich. Dies erschwert die Implementierung von Integritätsbedingungen des OO-Modells. Außerdem wird die Erweiterung der Klassenhierarchie um neue Klassen oder Attribute von Klassen
erschwert. Die letzte Alternative ermöglicht hingegen eine flexible und leicht erweiterbare
Umsetzung der Klassenhierarchie. Jedoch ist das Auslesen der Attribute eines Objektes schwierig, da dies Joins über die Relationen aller Oberklassen des Objektes beinhaltet. Die zweite
Alternative ist ein Kompromiß zwischen den beiden anderen Möglichkeiten. Sie erlaubt eine
etwas flexiblere Umsetzung als Alternative 1 und eliminiert die in Alternative 3 benötigten
Joins. Dafür führt sie aber beträchtliche Datenredundanzen ein, zusammen mit den daraus resultierenden Update-Problemen.
Mehrfachvererbung ist in relationalen Datenbanken nur schwer zu simulieren und sollte nach
Möglichkeit vermieden werden (siehe [Mul99]).
Attribute
Attribute des OO-Modells werden wie gesagt auf Attribute der Relationen abgebildet, die die
Klassen repräsentieren. Im Gegensatz zu UML erlauben relationale Datenbanken nicht die
Definition unterschiedlicher Sichtbarkeiten, so daß Attribute hier grundsätzlich immer als
public umgesetzt werden. Spezielle Wertebereiche oder diskrete Wertemengen können auf
Integritätsbedingungen oder auf Fremdschlüsselbeziehungen zu Wertetabellen abgebildet werden. Diese können entweder eine Abbildung zwischen Programmiersprachen- und DatenbankTypen enthalten, oder direkt die (diskrete) Menge der gültigen Werte eines Attributes definieren. So kann eine solche Wertetabelle etwa den Java-Datentyp String auf den Datenbank-Typ
varchar abbilden oder die Buchstaben „T“ und „F“ als erlaubte Werte zur Repräsentation des
boolean-Datentyps von Java in der Datenbank definieren[Mul99].
Objekt-Identität
Im objektorientierten Modell sind Objekte implizit und unabhängig von ihrem internen
Zustand eindeutig identifizierbar. Um dies auf Tupel in einer relationalen Datenbank abbilden
zu können, muß für jede Relation, die eine Klasse repräsentieren soll, ein geeigneter Primärschlüssel (Objekt Identität, OID) definiert werden. Sind im OO-Modell bereits Attribute für
eine Klasse vorhanden, die Instanzen dieser Klasse eindeutig voneinander unterscheiden, so
können diese verwendet werden. Ansonsten ist ein geeignetes zusätzliches Attribut (etwa eine
Spalte mit eindeutigen Integer-Werten) einzuführen. In der Regel ist die Verwendung eines
zusätzlichen Attributes die bessere Alternative, da dies die Änderung aller Attribute eines
Objektes erlaubt, die in dessen Klasse definiert sind. Ein Attribut der Klasse, das als Schlüssel
definiert ist, kann hingegen nicht geändert werden. Bei Klassenhierarchien ist zu berücksichtigen, daß alle Klassen der Hierarchie dieselben Attribute für ihre OID benutzen sollten und jede
OID innerhalb der Klassenhierarchie eindeutig vergeben sein sollte.
20
KAPITEL 3
3.4 Sichten in UML
Methoden und Signale
Die Möglichkeiten zur Umsetzung von Methoden und Signalen in relationalen Datenbanken
ist relativ beschränkt. Im wesentlichen können Methoden auf stored procedures und Signale
auf Trigger abgebildet werden. Wie Abschnitt 3.1 zeigt, ist es jedoch nicht immer sinnvoll,
Methoden in der Datenbank zu implementieren. Die Implementierung in der Applikationslogik
ist in der Regel flexibler und wird als besseres Design angesehen.
Assoziationen
Assoziationen können mit Hilfe von Schlüsselbeziehungen und Triggern nahezu vollständig
auf relationale Datenbanken abgebildet werden.
Unidirektionale Assoziationen (Referenzen) können direkt auf Schlüssel-FremdschlüsselBeziehungen abgebildet werden. Bei bidirektionalen Beziehungen ist zu beachten, daß beide
Richtungen aus den Relationen extrahierbar sein müssen. Dies kann durch gegenseitige Referenzierung mit Schlüssel-Beziehungen erfolgen, wobei eine Änderung an dem Fremdschlüssel
eines Assoziationspartners mit Hilfe von Triggern eine entsprechende Aktualisierung des
Fremdschlüssels des anderen Partners sicherstellen muß. Alternativ kann die Assoziation wie
eine Referenz umgesetzt werden, wobei die Rückrichtung mit Hile einer entsprechenden Datenbank-Abfrage zu ermitteln ist. Die Kardinalitäten einer Assoziation sind in jedem Fall durch
geeignete Integritätsbedingungen zu gewährleisten. Many-to-many-Assoziationen und n-äre
Assoziationen können mit Hilfe von Assoziationstabellen realisiert werden, die Fremdschlüssel
für alle an der Assoziation beteiligten Klassen enthalten. Auch Assoziationsklassen können
durch entsprechende Assoziationstabellen umgesetzt werden. Aggregation und Komposition
können durch geeignete Trigger auf den beteiligten Fremdschlüsseln umgesetzt werden, wie
etwa kaskadierende Löschoperationen.
Integritätsbedingungen
Da Integritätsbedingungen in UML beliebig komplexe Ausdrücke sein können, ist nicht
gewährleistet, daß diese direkt in Integritätsbedingungen in der Datenbank umgesetzt werden
können. Stattdessen müssen diese häufig mit Hilfe von Triggern und stored procedures realisiert oder sogar in die Applikationslogik verlagert werden.
3.4 Sichten in UML
Die 3-Schicht-Architektur von Datenbanken ermöglicht die Definition von Sichten, die logische Zusammenhänge der Daten im unterliegenden Schema geeignet darstellen. Dies ist möglich, da durch das konzeptionelle Schema der Datenbank eine Zuordnung von semantischen
Informationen aus der Domäne der modellierten Daten zu Attributen in den Relationen gegeben
ist. Man kann hier also von logischen Sichten sprechen (siehe Kapitel 1).
Auch auf UML-Diagrammen ist die Definition von Sichten möglich [Rec01]. Um ein einheitliches Sichtenkonzept für alle UML-Diagrammarten zu gewährleisten, kann ein solches Konzept
aber nur auf den Informationen des UML-Metamodells[UML] basieren, das die Struktur der
Datenbankmodellierung mit UML
21
3.4 Sichten in UML
verschiedenen UML-Diagrammarten definiert. Elemente von UML-Diagrammen werden darin
durch Klassen beschrieben und der mögliche Aufbau der Diagramme durch Assoziationen zwischen diesen Klassen. UML-Diagramme und die darin enthaltenen Elemente sind Instanzen dieser Metamodell-Klassen (Abbildung 8 zeigt das in FUJABA verwendete Metamodell an einem
Beispiel).
Meta-Metamodell
Metamodell
Modell
Benutzerobjekte
Abbildung 7: UML-Metamodell-Architektur
:UMLQualifier
House
no
levels
:UMLClass
:UMLAssoc
name=“levels“
Level
+no : Long
target
name=“House“
:UMLClass
name=“Level“
qualifier
leftRole
rightRole
:UMLRole
:UMLRole
target
qualifierAttrs
attrs
:UMLAttr
name=“no“
Abbildung 8: Klassendiagramm und Metamodell in FUJABA
Da das UML-Metamodell keine semantischen Informationen über das in einem UML-Diagramm dargestellte Modell enthält, ist auf Basis dieser Informationen keine Definition eines
logischen Sichtenmodells möglich.
Jedoch können die Informationen des Metamodells genutzt werden, um ein strukturelles Sichtenmodell zu definieren. Die Darstellung eines UML-Diagrammes als Instanz des Metamodells
resultiert in einer Graphenstruktur (siehe Abbildung 8), dem sogenannten abstrakten Syntaxgraph (ASG, [FNT98]). Durch die Definition von Traversierungsregeln auf diesem Graphen
können Diagrammteile anhand ihrer strukturellen Zusammenhänge identifiziert und in eine
strukturelle Sicht aufgenommen werden. Eine einfache Traversierungsregel kann zum Beispiel
lauten: „Von Klasse A ausgehend sind alle Generalisierungskanten in Richtung der Oberklasse
bis zu einer Tiefe von n zu durchlaufen“.
Die an der Universität GH Paderborn entwickelte UML-Entwicklungsumgebung FUJABA,
deren Entwicklung 1997 im Rahmen einer Diplomarbeit [FNT98] begonnen worden ist, ist im
Rahmen einer Studienarbeit [Rec01] um ein solches Sichtenmodell erweitert worden. Das
22
KAPITEL 3
3.4 Sichten in UML
implementierte Sichtenkonzept ermöglicht die Definition von Traversierungsregeln auf dem
ASG in Form sogenannter Filter. Ein Filter definiert eine Traversierungsregel zur Findung des
1-Kontextes eines ausgezeichneten Knotens im ASG. Der 1-Kontext definiert eine Nachbarschafts-Beziehung zwischen Knoten im ASG. Durch n-fache rekursive Anwendung auf die Elemente des 1-Kontextes kann der n-Kontext eines Knotens ermittelt werden. Eine
Sichtendefinition in FUJABA besteht somit aus der Angabe eines Filters, einer ausgezeichneten
Menge von Diagrammelementen als Startknoten und der Größe des zu berechnenden Kontextes.
Es gibt verschieden Möglichkeiten zur Definition unterschiedlich komplexer Filter in FUJABA.
Einfache Filter können direkt in Java implementiert oder in FUJABA mit UML spezifiziert und
mit Hilfe der Codegenerierungsfunktion von FUJABA als Java-Code exportiert werden. Der
Java-Code kann dann kompiliert und die neuen Filter in die Entwicklungsumgebug geladen
werden.
Um nicht für jeden Spezialfall einer Regel, wie etwa die Verfolgung von Vererbungshierarchien
in Richtung von Unter- oder Oberklassen, einen neuen Filter implementieren zu müssen, erlaubt
FUJABA zudem die Definition parametrisierter Filter. Deren Verhalten kann über zusätzliche
Attribute gesteuert werden. Zur Konfiguration dieser Filter existiert ein generischer Editor, der
die Darstellung und Änderung aller Filter-Attribute ermöglicht.
Sehr komplexe Filter können erzeugt werden, indem einfachere Filter durch Mengenoperationen wie Schnitt- Vereinigungs- und Differenzmengenbildung zu einem Composite-Filter kombiniert werden. Abbildung 8 zeigt die grafische Definition eines solchen Filters inklusive
Auswertungsreihenfolge. Die großen Kästen stellen Filter mit Namen und zu berechnendem
Kontext dar, der kleine Kasten einen Schnittmengenoperator, der ausgefüllte Kreis den Startknoten und die konzentrischen Kreise den Endknoten für die Auswertung..
i:InheritanceFilter
(1)
1.1.1:getResult
1.1.1.1:
getResult
t:TransitionFilter
(2)
1.1:getResult
v
1:getResult
1.1.2:getResult
Abbildung 9: Composite-Filter-Definition und Auswertungsreihenfolge
Die durch dieses Sichtenmodell definierbaren Sichten sind wiederum UML-Diagramme, die
wie ihre Ursprungsdiagramme in FUJABA verändert werden können. Da jede Sicht ein eindeutiges Ursprungsdiagramm hat, können Änderungsoperationen auf den Sichten eindeutig auf das
Ursprungsdiagramm umgesetzt werden. Probleme oder Einschränkungen bei Änderungen, wie
sie etwa in Anhang A für relationale Sichten diskutiert werden, treten nicht auf. Die Sichten in
FUJABA sind als materialisierte Sichten implementiert. Das heißt, daß für jede Sicht ein Diagramm-Objekt in FUJABA angelegt wird, das alle zu der Sicht gehörenden Diagrammelemente
Datenbankmodellierung mit UML
23
3.4 Sichten in UML
enthält. Dieses Sichtendiagramm wird bei jeder Änderung an dem Ursprungsdiagramm mit
Hilfe der Filterregeln der Sichtendefinition neu berechnet.
Das Sichtenmodell in FUJABA ist wie gesagt nicht (oder nur bedingt) zur gezielten Darstellung
logischer Zusammenhänge und semantischer Informationen des jeweiligen Modells geeignet.
Es ermöglicht jedoch die Partitionierung großer Diagramme in mehrere Sichten. Damit erhöht
es die Lesbarkeit und Verständlichkeit umfangreicher und komplexer Spezifikationen, die häufig einige hundert Klassen enthalten können und in denen Diagramme enthalten sind, deren
ASG-Repräsentationen aus mehreren hundert bis einigen tausend Knoten bestehen. Dadurch
wird die Wartung und Modifikation solcher Spezifikationen erheblich erleichtert.
Für weitere Details zu diesem Sichtenmodell, der Definition von Filtern und der Verwendung
von Sichten in FUJABA siehe [Rec01].
24
KAPITEL 3
KAPITEL 4
Zusammenfassung
Datenbank-Schemata sind vielen Rahmenbedingungen bezüglich Effizienz und Redundanzfreihiet unterworfen und vereinen häufig unterschiedlichste Anforderungen in einem Modell.
Daher entspricht ihre Repräsentation der enthaltenen Daten in der Regel nicht den Anforderungen einzelner Benutzer.
Aus diesem Grund erlaubt das ANSI/SPARC-Modell die Definition von Benutzersichten, die
einen gemäß den Anforderungen des jeweiligen Benutzers umstrukturierten Ausschnitt der
Daten aus der unterliegenden Datenbank zeigen. Der Benutzer sieht diese Sicht als in sich
geschlossene Datenbank. Die Sicht repräsentiert jederzeit die Daten der unterliegenden Datenbank und Änderungsoperationen auf der Sicht werden an die Datenbank weitergegeben. Neben
einer geeigneten Darstellung der Datenbankinhalte ermöglicht dies auch eine Zugriffskontrolle
auf Benutzerebene.
Die Definition von Sichten für relationale Datenbanken erfolgt durch Spezifikation einer Datenbankanfrage. Sie ist in Anhang A detailiert beschrieben. Änderungsoperationen sind auf relationalen Datenbanken nur bedingt möglich, da eine eindeutige Transformation auf Änderungen
an der unterliegenden Datenbank nicht immer möglich sind. Anhang A gibt eine Übersicht über
diese Beschränkungen und über Methoden, diese zu lockern, indem für Updateoperationen auf
Sichten eine eindeutige Semantik definiert wird.
Für objektorientierte Datenbanken gibt es keinen Standard für ein einheitliches Sichtenmodell.
Daher sind nur beispielhaft zwei Sichtenkonzepte für unterschiedliche Datenbanken vorgestellt
worden. Im Gegensatz zu relationalen Datenbanken ist hier jedoch die Transformierbarkeit von
Update-Operationen auf Sichten mit Hilfe von objekterhaltender Operatorsemantik sehr einfach
sicherzustellen.
Die Definition und Verwendung von Sichten in verteilten Datenbanken erfolgt analog zum
nicht verteilten Fall. Da Sichten in der Regel durch Anfragen definiert werden und Anfragen
von verteilten Datenbanksystemen transparent umgesetzt werden, ist auch die Verwendung von
Sichten völlig transparent. Da Anfragen auf Sichten in einer verteilten Datenbank meist auf
einer verteilten Anfrage auf den unterliegenden Datenbanken resultieren, werden Sichten in
verteilten Datenbanken meist als materialisierte Sichten realisiert. Diese dienen als Cache für
den Inhalt der Sicht, so daß Performanceverluste durch Netzwerkoperationen vermieden werden.
Für verteilte Datenbanken müssen abhängig von der Datenbankarchitektur Verteilungsschemata definiert oder lokale Schemata zu einem globalen Schema der verteilten Datenbank inte-
25
griert werden. Auch dies kann einfach mit Hilfe von geeigneten Sichtendefinitionen erfolgen,
so daß die Sicht als einheitliches Mittel der Systemadministration dienen kann.
Um die Entwicklung von Datenbanken zusammen mit den hierauf oerierenden Applikationen
in einem geschlossenen Modell zu ermöglichen und die einfache Portabilität des entworfenen
Datenbankschemas auf unterschiedliche Datenbank-Typen sicherzustellen, bietet sich der Entwurf in UML an. In einem UML-Modell kann der Entwurf von Applikationslogik und Datenmodell zusammengefaßt werden, so daß zum Schluß lediglich die für das Datenbankschema
relevanten Teile zu identifizieren und in ein entsprechendes Schema umzusetzten sind.
Abschnitt 3.3 skizziert die Möglichkeiten zur Umsetzung des objektorientierten UML-Modells
in ein relationales Datenbankschema.
26
KAPITEL 4
ANHANG A
Arbeiten mit relationalen Sichten
In diesem Anhang soll die Definition von Sichten in SQL[EN94] und die Behandlung von
Anfragen und Updateoperationen auf diese Sichten erläutert werden. Ferner werden in diesem
Zusammenhang auftretende Probleme und Möglichkeiten zu deren Lösung erläutert. Abschließend wird ein Ausblick auf SQL3 und objektrelationale Datenbanken gegeben.
A.1 Sichtendeklaration in SQL
Die Datendefinitions-Sprache (Data Definition Language, DDL) von SQL92 sieht folgende
Syntax für die Definition einer Sicht vor:
create view <Sichtname> [(<Spaltenname>[,...])]
as <SQL_Anfrage>
[with [cascaded|local] check option]
<Sichtname> steht dabei für den Namen der virtuellen Relation. Die Angabe von Spaltennamen
ermöglicht eine Umbenennung der Spalten der Anfrage. Spaltennamen müssen angegeben werden, falls die Benennung der Spalten der Anfrage nicht eindeutig ist, was zum Beispiel passieren kann, wenn die Anfrage Aggregatfunktionen enthält. Ist die Benennung der Spalten
eindeutig, so ist die Angabe von Spaltennamen optional. Werden Spaltennamen angegeben,
muß ihre Anzahl der Anzahl der Spalten der Anfrage entsprechen. Auf die Direktive with check
option wird in Abschnitt A.2.3im Zusammenhang mit Updateoperationen auf Sichten eingegangen.
Um eine neue Sicht erfolgreich anlegen zu können, muß der Benutzer für alle an der Sicht beteiligten Relationen select-Rechte und für die Domänen aller Attributtypen usage-Rechte haben
(Zu Zugriffsrechten und Domänen/Datentypen in SQL siehe [EN94])
Eine Sicht kann wieder gelöscht werden mit dem SQL-Befehl
drop view <Sichtname> [cascade|restrict]
Hierdurch wird die Definition der Sicht aus der Datenbank gelöscht. Unterliegende Relationen
bleiben unverändert. Mit der cascade-Option werden zusätzlich rekursiv alle Sichten gelöscht,
die diese Sicht in ihrer Definition verwenden. Die restrict-Option verhindert stattdessen das
Löschen von Sichten, auf denen andere Sichten basieren. Wird keine der Optionen angegeben,
ist das Standardverhalten restrict.
27
A.1 Sichtendeklaration in SQL
A.1.1 Sichten-Typen
Obwohl alle Sichten gleich definiert und behandelt werden, bietet sich in der Praxis eine Unterscheidung zwischen verschiedenen Typen an[CBS97]. Diese sollen an einem Beispiel erläutert
werden. Hierzu seien die folgenden drei Relationen-Schemata definiert:
Houses
= (house integer, address char(20),
janitor integer)
Appartments = (appt integer, house integer, size integer,
inhabitant integer, monthlyRent integer)
Persons
= (id integer, forename char(20),
surname char(20))
Zwischen den folgenden Sichtentypen kann unterschieden werden:
Horizontale Sichten
Eine horizontale Sicht ermöglicht die Zugriffsbeschränkung eines Benutzers auf ausgewählte
Tupel einer Relation. Eine solche Sicht wird als horizontal bezeichnet, da sie eine Relation
horizontal - also zwischen ihren Tupeln - aufteilt. Zum Beispiel sollte der Hausmeister von
Haus Nr. 53 nur Informationen über Appartments seines Hauses abfragen können:
create view janitor53Appts as
select * from Appartments
where house=53
Vertikale Sichten
Eine vertikale Sicht ermöglicht die Zugriffsbeschränkung eines Benutzers auf ausgewählte
Attribute einer Relation. Eine solche Sicht wird als vertikal bezeichnet, da sie eine Relation
vertikal - also entlang ihrer Attribute - aufteilt. Zum Beispiel sollte in einem Informationssystem über Appartments der Benutzer nicht den aktuellen Mieter und die monatliche Miete
angezeigt bekommen:
create view infoAppts as
select appt, house, size
from Appartments
Gruppen- und Verbundsichten
In diesem Beispiel wird die Definition einer komplexeren Sicht gezeigt, in der mehrere Relationen miteinander zu einer sogenannten Verbundsicht (engl. join) kombiniert werden und in
der Tupel mit der group-by-Klausel gruppiert werden, um darauf Aggregatfunktionen anzuwenden. Häufig werden Sichten (wie bereits erwähnt) zur Vereinfachung von Anfragen definiert, um häufig auftretende Unteranfragen zu ersetzen. In diesem Beispiel könnte zum
Beispiel die Frage nach der monatlichen Gesamtmiete eines Hauses eine solche Unteranfrage
sein, in deren Kontext eventuell auch häufig die Addresse des jeweiligen Hauses interessant
ist. Das führt dann zu folgender Sichtendefinition:
28
ANHANG A
A.2 Anfragen auf Sichten
create view houseRent (houseNo, address, totalRent) as
select a.house, h.address, sum(a.monthlyRent)
from Houses h, Appartments a
where h.house=a.house
group by a.house
Informationen über die Gesamtmieten und Addressen können mit Hilfe dieser Sicht dann in
einer einfachen Anfrage auf eine einzelne Tabelle formuliert werden.
A.2 Anfragen auf Sichten
Eine Sicht muß per Definition stets das aktuelle Ergebnis der sie definierenden Anfrage reflektieren. Um dies in Anfragen auf einer Sicht sicherzustellen, gibt es im wesentlichen zwei unterschiedliche Möglichkeiten, die im Folgenden kurz erläutert werden sollen.
A.2.1 Sichtenauflösung (view resolution):
Unter Sichtenauflösung versteht man die Integration der Anfrage, die die Sicht definiert, in die
Anfrage, die auf der Sicht ausgeführt werden soll.
Die Auflösung soll anhand des bereits eingeführten Beispiels aus Abschnitt verdeutlicht werden. Eine Anfrage an die Sicht houseRent könnte wie folgt aussehen:
select address, totalRent
from houseRent
where houseNo<=10
order by totalRent
Diese Anfrage wird nun vom Datenbanksystem vor ihrer Ausführung mit der definierenden
Anfrage der Sicht kombiniert. Dies geschieht nach folgenden Regeln:
5. Sichtennamen in der from-Klausel werden durch die from-Listen der definierenden Anfragen ersetzt:
from Houses h, Appartments a
6. Die Attributnamen in der select-Klausel, der where-Klausel, der group by- und havingKlauseln und der order by-Klausel der Anfrage, die Attribute der Sicht bezeichnen, werden
durch Namen der entsprechenden Basisrelationen der definierenden Anfrage ersetzt:
select h.address, sum(a.monthlyRent)
order by sum(a.monthlyRent)
7. Die where-Klausel der Anfrage wird mit der where-Klausel der definierenden Anfrage undverknüpft:
where a.house<=10 and h.house=a.house
8. Die group by- und having-Klauseln der definierenden Anfrage werden der Anfrage hinzugefügt:
Arbeiten mit relationalen Sichten
29
A.2 Anfragen auf Sichten
group by a.house
Enthält die definierende Anfrage der Sicht weitere Sichten, so werden diese Regeln sukzessiv
angewendet, bis nur Basisrelationen in der Anfrage enthalten sind. Die so erhaltene Anfrage auf
Basisrelationen kann nun von dem Datenbank-System ausgeführt werden. Ihr Ergebnis entspricht dem Ergebnis der ursprünglichen Anfrage auf der Sicht.
Dieses Verfahren hat den Vorteil, daß kein Overhead für die Verwaltung der Daten in Sichten
bei Änderung der unterliegenden Relationen entsteht. Der Nachteil ist, daß Anfragen an Sichten
intern in eventuell sehr komplexe Anfragen umgewandelt werden, was lange Antwortzeiten zur
Folge haben kann. Insbesondere in Umgebungen, in denen im Verhältnis zur Änderungshäufigkeit an den Basisrelationen sehr häufig auf Sichten zugegriffen wird, oder wo Anfragen an
Basisrelationen sehr langsam sind (etwa in verteilten Datenbanken, in denen Anfragen an Basisrelationen über ein Netzwerk ausgeführt werden müssen), ist dies unter Umständen nicht akzeptabel. Hier wird häufig das Verfahren der Sichten-Materialisierung (engl. View Materialization)
bevorzugt.
A.2.2 Sichten-Materialisierung (View Materialization)
Eine materialisierte Sicht[GM95] ist eine Sicht, deren Inhalt, wie bei einer Basis-Relation, in
der Datenbank gespeichert wird. Dieser Vorgang wird Materialisierung genannt. Die materialisierte Sicht ist also eine Art Cache für den Inhalt der Sicht. Anfragen auf eine materialisierte
Sicht können dann direkt auf dem Inhalt dieses Caches berechnet werden, als wäre die Sicht
eine Basisrelation. Da die Sicht nicht jedesmal neu berechnet werden muß und die Anfragen
nicht wie oben beschrieben zu komplexeren Anfragen ergänzt werden müssen, ist der Zugriff
auf eine materialisierte Sicht dadurch wesentlich schneller. Ergänzend können für eine materialisierte Sicht genauso wie für eine Basisrelation Index-Strukturen aufgebaut werden, die den
Zugriff weiter beschleunigen.
Der Inhalt einer materialisierten Sicht kann ungültig werden, sobald an einer der Basisrelationen der Sicht Änderungen vorgenommen werden. In diesem Fall muß die Sicht aktualisiert werden. Dieser Vorgang wird als View Maintenance bezeichnet. Wann und wie diese
Aktualisierung stattfinden sollte, ist Thema vieler aktueller Arbeiten ([GM95]). So kann die
Aktualisierung an der Sicht bei jeder Änderung an einer Basisrelation, periodisch in festen
Abständen, bei geringer Auslastung des Systems oder bei der nächsten Anfrage an die Sicht
erfolgen. Jede dieser Optionen hat Vor- und Nachteile. So erzeugt die erste Möglichkeit offensichtlich einen unnötigen Kommunikations- und Rechenoverhead bei mehreren Aktualisierungen an demselben Datum. Die letzte Möglichkeit minimiert diesen Overhead soweit wie
möglich, dafür entstehen aber bei der ersten Anfrage nach Änderungen an den Basisrelationen
eventuell lange Wartezeiten.
In der Regel ist es auch nicht nötig, die Sicht jedesmal vollständig neu zu berechnen. Stattdessen
reicht es häufig, auf Basis der Änderungen an den Basisrelationen die Änderungen an der Sicht
zu berechnen, was als incremental view maintenance bezeichnet wird. Das Problem, zu ent-
30
ANHANG A
A.3 Updateoperationen auf Sichten
scheiden, ob eine Änderung an einer Basisrelation eine Änderung an der Sicht zur Folge hat,
und diese Änderung zu berechnen, ist als incremental view maintenance Problem bekannt.
Eine materialisierte Sicht wird meistens so lange in der Datenbank gehalten, wie auf sie zugegriffen wird. Das heißt, daß die gespeicherten Daten einer materialisierten Sicht erst gelöscht
werden, wenn auf die Sicht für einen gewissen Zeitraum nicht zugegriffen wurde. Wie lang dieser Zeitraum sein sollte, hängt von der Zeit ab, die benötigt wird, um die Sicht neu zu berechnen,
und natürlich von dem zur Verfügung stehenden Speicherplatz. Ein Wert für die Speicherdauer
kann etwa vom Administrator festgelegt oder vom System automatisch abgeschätzt werden.
Auf materialisierte Sichten, ihre Aktualisierung und Anwendungen wird in Kapitel 2 im Zusammenhang mit verteilten Datenbanken noch einmal genauer eingegangen.
A.2.3 Einschränkungen für die Sichtendefinition
Bei der Definition von Sichten ist zu berücksichtigen, daß es einige wichtige Einschränkungen
für die Verwendung bestimmter Sichten in SQL-Ausdrücken gibt[CBS97].
• Wenn in der Definition einer Sicht Spalten mit Hilfe von Aggregatfunktionen definiert wor-
den sind, dürfen diese Spalten in Anfragen auf der Sicht ausschließlich in select- und order
by-Klauseln verwendet werden. Außerdem dürfen diese Spalten nicht als Argument weiterer Aggregatfunktionen verwendet werden.
• Eine Sicht, deren definierende Anfrage Gebrauch von der group by-Klausel macht, kann
nicht mit anderen Sichten oder Basisrelationen zu einer Verbundrelation mittels der joinOperation zusammengefaßt werden.
Desweiteren sollte darauf hingewiesen werden, daß in vielen Datenbank-Systemen die Auswertung der definierenden Anfrage einer Sicht immer auf Basis der Relationenschemata erfolgt, die
bei Definition der Sicht aktuell waren. Wird zum Beispiel eine Sicht definiert durch die Anfrage
select * from Houses
where house<100
und wird nach der Definition dieser Sicht in das Schema der Relation Houses ein weiteres Attribut eingefügt, so erscheint dieses trotzdem nicht in der Sicht.
A.3 Updateoperationen auf Sichten
Während Anfragen auf Sichten relativ unkompliziert sind, stellen Änderungen an den Daten in
einer Sicht häufig ein Problem dar. Um solche Änderungen durchführen zu können, müssen die
Operationen auf einer Sicht in Operationen auf den entsprechenden Basisrelationen transformiert werden können. Das Problem der Herleitung solcher Transformationen ist als View Translation Problem[FC85] bekannt. Da die definierende Anfrage einer Sicht beliebig komplex sein
kann, ist eine Transformation in vielen Fällen garnicht oder nicht eindeutig möglich. Und selbst
Arbeiten mit relationalen Sichten
31
A.3 Updateoperationen auf Sichten
in dem Fall, daß eine solche Transformation eindeutig möglich ist, kann das Ergebnis eventuell
unerwünschte Seiteneffekte auf die veränderte oder eine andere Sicht haben oder sogar Inkonsistenzen in der Datenbank verursachen.
Aus diesen Gründen muß eine Sicht zahlreiche Bedingungen erfüllen, damit Updateoperationen
auf ihr erlaubt sind. Das Grundkonzept dieser Bedingungen ist Folgendes:
Updates auf einer Sicht sind nur dann erlaubt, wenn diese in eindeutiger und wohldefinierter Weise in Updates an den zugrundeliegenden Basisrelationen transformiert werden können.([FC85] und [CBS97])
A.3.1 Änderbare Sichten nach ISO-Standard
Oben genannte Bedingung ist teilweise nicht oder nur in unangemessener Zeit umzusetzen,
weshalb in den meisten aktuellen Datenbanksystemen eine strengere Bedingung zugrunde
gelegt wird:
Damit Updates auf einer Sicht erlaubt sind, muß für jede Zeile oder Spalte einer Sicht
die zugehörige Zeile oder Spalte einer Basisrelation eindeutig identifizierbar
sein.[CBS97]
Auf dieser Basis definiert der ISO SQL Standard einen Katalog von Bedingungen für die definierende Anfrage einer Sicht, so daß eine Sicht genau dann Updateoperationen unterstützen
muß, wenn diese Bedingungen erfüllt sind:
1. Vielfache Vorkommen eines Tupels im Anfrage-Ergebnis werden nicht eliminiert. Die select-Klausel der Anfrage darf also nicht als distinct definiert sein.
2. Jedes Element in der select-Liste ist ein Attributname. Konstanten, Aggregatfunktionen
oder andere Ausdrücke sind nicht erlaubt. Jedes Attribut ist höchstens einmal aufgeführt.
3. In der from-Klausel ist nur eine einzelne Relation definiert. Ist diese Relation eine Sicht, so
muß sie ebenfalls diesen Bedingungen genügen. Dies bedeutet insbesondere, daß Sichten,
die auf Joins, Vereinigungs-, Schnitt- oder Differenzmengen basieren, nicht änderbar sind
4. Die where-Klausel enthält keine geschachtelten Anfragen, die die Relation der from-Klausel verwenden.
5. Es sind keine group by- oder having-Klauseln definiert.
Zusätzlich dürfen Updates keine Integritätsbedingungen der unterliegenden Relationen verletzen. Insbesondere dürfen Attribute der unterliegenden Relationen, die nicht in der Sicht enthalten sind, nicht die Integritätsbedingung not null besitzen. Denn nicht in der Sicht definierte
Attribute werden beim Einfügen neuer Tupel in die Sicht in der Basisrelation durch null-Werte
ergänzt.
Entgegen den Bedingungen des ISO-Standards können auch für eine Vielzahl von Sichten, die
diesen Bedingungen nicht genügen, Updateoperationen sinnvoll transformiert werden, jedoch
32
ANHANG A
A.3 Updateoperationen auf Sichten
mit einem zum Teil erheblichen Mehraufwand. Dies führt zusammenfassend zu einer groben
Einteilung von Sichten in drei Kategorien ([CBS97] und [EN94]):
1. Sichten, die nach dem ISO-Standard änderbar sind. Dies sind im wesentlichen Sichten, die
durch eine einfache Anfrage auf einer einzelnen Basisrelation definiert sind und den Primär-Schlüssel oder einen Sekundär-Schlüssel der Relation enthalten.
2. Sichten, die nicht änderbar sind. Dies sind insbesondere Sichten, deren Attribute alle über
Aggregation definiert sind.
3. Sichten, die nicht den Bedingungen des ISO-Standards genügen, deren Updateoperationen
jedoch trotzdem in wohldefinierter Weise in Updateoperationen auf Basisrelationen transformiert werden können.
Auf die Sichten der dritten Klasse soll im Folgenden noch weiter eingegangen werden.
Zunächst werden jedoch anhand einiger Beispiele die Probleme verdeutlicht, die bei
Updateoperationen auf Sichten auftreten können, die nicht den ISO-Bedingungen genügen.
• Der Effekt der Operation entspricht nicht der Erwartung:
Folgende Sicht entspricht nicht den ISO-Bedingungen, da es sich um eine Verbundsicht auf
mehr als einer Basis-Relation handelt:
create view janitors as
select house, forename, surname
from Houses h, Persons p
where h.janitor=p.id
Das Einfügen eines neuen Tupels (53, „Hans“, „Meier“) in diese Sicht muß transformiert
werden in Einfügeoperationen auf Houses und Persons. Es ergeben sich die Tupel (53, null,
null) und (null, „Hans“, „Meier“). Da aber der Vergleich mit null-Werten per Definition
immer fehlschlägt, wird nicht das gewünschte Ergebnis erreicht, da die Sicht anschließend
das neue Tupel nicht enthält.
• Die Transformation ist nicht eindeutig:
Soll zum Beispiel im Tupel (1, „Peter“, „Müller“) der janitors-Sicht der Vorname
durch „Klaus“ ersetzt werden, so kann diese Operation in unterschiedliche Operationen auf
den Basisrelationen transformiert werden. Eine Möglichkeit ist das Ersetzen des Namen in
der Basisrelation Persons. Ebenso kann aber eine neue Person Klaus Müller angelegt und
Haus 1 als Hausmeister zugewiesen werden.
• Eine Operation erzeugt mehrere Veränderungen auf der Sicht
Wird in dem vorangegangenen Beispiel die erste Möglichkeit zur Transformation gewählt,
so werden alle Tupel der Sicht verändert, die denselben Hausmeister haben.
• Eine Operation erzeugt mehrere Veränderungen auf einer Basisrelation
Ein Überblick über die Mietpreise und Größen der Appartments kann als Sicht deklariert
werden durch
create view apptRents as
select appt, monthlyRent, avg(size) as avgSize
Arbeiten mit relationalen Sichten
33
A.3 Updateoperationen auf Sichten
from Appartments
group by monthlyRent
Eine Erhöhung der Monatsmiete von 1000 DM auf 2000 DM in einem Tupel muß transformiert werden in eine Änderung aller Tupel der Basisrelation mit 1000 DM Miete.
• Eine Operation kannn nicht sinnvoll transformiert werden
In obigem Beispiel ist es nicht möglich, Updates an dem Attribut avgSize sinnvoll zu transformieren, da es sich um einen errechneten Wert handelt.
Ein weiteres Problem ergibt sich, wenn ein Tupel einer Sicht so geändert wird, daß es anschließend nicht mehr der Bedingung der definierenden Anfrage der Sicht genügt. Sind zum Beispiel
in einer Miethausverwaltung zwei Sichten für Sachbearbeiter für Sozial- und Studentenwohnungen und Luxusappartments wie folgt definiert
create view social as
select * from Appartments
where monthlyRent<1000
create view luxurious as
select * from Appartments
where monthlyRent>20000
Der Sachbearbeiter für Sozialwohnungen könnte nun in seiner Sicht die Miete einer Wohnung
von 750 auf 25000 DM ändern. Dies hätte zur Folge, daß die Wohnung nicht mehr in seinen
Aufgabenbereich fällt, aber in der Sicht des anderen Mitarbeiters erscheint. Dieses Verhalten
wird als Migration aus der Sicht bezeichnet[CBS97].
Die Definition des Verhaltens der Datenbank in einem solchen Fall erfolgt in SQL bei der Sichtendefinition durch die with [cascaded|local] check option-Option. Ist diese Option nicht angegeben, sind Updates, die die Migration von Tupeln aus der Sicht bewirken, erlaubt. Ist eine Sicht
mit der Option with local check option definiert, so sind keine Updates auf der Sicht oder einer
auf dieser Sicht definierten Sicht erlaubt, die die Migration eines Tupels aus der Sicht bewirken,
es sei denn das Tupel wird ebenfalls aus der unterliegenden Relation entfernt. Ist die Sicht mit
der Option with cascaded check option oder nur with check option definiert, sind alle Updates
verboten, die ein Tupel aus der Sicht migrieren lassen.
Mit Hilfe der with check option ist es also möglich, eine einfache und effektive Hierarchie von
Integritätsbedingungen für Updates auf Sichten zu definieren. Die Integritätsbedingungen werden dabei durch die Selektionsbedingungen der definierenden Anfragen festgelegt.
A.3.2 Das View Update Problem jenseits des ISO Standards
Neben den Sichten, die den Bedingungen des ISO Standards genügen, gibt es eine Vielzahl weiterer Sichten, für die eine eindeutige Transformation der Operationen möglich ist. Häufig werden hierfür dann aber bei der Definition der Sichten zusätzliche Informationen benötigt, um
mehrdeutige Transformationsmöglichkeiten zu eliminieren und den jeweiligen Updateoperationen für eine Sicht dadurch eine eindeutige Semantik zu geben[FC85]. Hierfür sollen im Folgenden einige Ansätze beschrieben werden.
34
ANHANG A
A.3 Updateoperationen auf Sichten
Dazu soll das View Update Problem aber zunächst formaler beschrieben werden. Hierzu werden sowohl Sichten als auch Updateoperationen als Transformationsoperationen von einem
Datenbank-Zustand in einen anderen interpretiert:
Sei S ein Datenbankschema und V eine Sicht auf S (der Ausdruck Sicht bezeichnet hier wieder
eine Sicht auf die gesamte Datenbank, anstatt einer einzelnen virtuellen Relation). Seien s und
s’ konsistente Zustände von S und v und v’ konsistente Zustände von V, u ein Update von V
und t ein Update von S. Sei ferner f eine Abbildung von konsistenten Zuständen von S auf konsistente Zustände von V (für relationale Datenbanken wäre f also gegeben durch die definierenden Anfragen aller virtuellen Relationen) und USdie Menge aller Updates t, die einen
konsistenten Zustand s von S wieder in einen konsistenten Zustand überführen. Damit t ∈ T als
Transformation von u in Frage kommt, muß gelten:
f(s) = v ∧ u(v) = v' ∧ t(s) = s' ÿ f(s') = u'
t heißt exakte Transformation von u auf S genau dann, wenn t obige Bedingung erfüllt und unter
Berücksichtigung der Integritätsbedingungen von S jeden konsistenten Zustand von S wieder in
einen konsistenten Zustand überführt. t heißt ferner (minimal) akzeptierbar, wenn t den Zustand
von S unverändert läßt für den Fall, daß u den Zustand von V nicht verändert, wenn also gilt:
u(f(s)) = f(s) ÿ t(s) = s
Sei UV die Menge aller erlaubten Updateoperationen auf V. Dann besteht das View Update Problem daraus, eine eindeutige Translations-Abbildung TU zu finden, die jedem u aus UV genau
ein exaktes und akzeptierbares t aus US zuordnet und die distributiv ist in Bezug auf die Hintereinanderausführung von Sichtenupdates u. Dieser Zusammenhang ist in Abbildung 10 noch einmal grafisch dargestellt.
u=u1° u2
v
TU
f
s
v’
u1
t1
u2
TU
f
s’
t2
v’’
f
TU(u1°u2)=TU(u1)°TU(u2)
s’’
t=t1° t2
Abbildung 10: Die Translations-Abbildung TU
Anhand von TU können Sichten damit in drei Kategorien eingeteilt werden[CBS97]:
• nicht updatefähige Sichten, für die kein TU existiert oder mehrere mögliche TU existieren
und keine zusätzlichen Informationen zur Auflösung dieser Uneindeutigkeit gegeben sind.
• partiell updatefähige Sichten, für die ein eindeutiges TU nur für eine Teilmenge der mögli-
chen Updateoperationen existiert
Arbeiten mit relationalen Sichten
35
A.3 Updateoperationen auf Sichten
• (theoretisch) updatefähige Sichten, für die ein eindeutiges TU existiert (theoretisch, da
lediglich eine Aussage über die Existenz von TU gemacht wird, dieses aber in einzelnen
Fällen nicht oder nicht notwendig in akzeptabler Zeit zu finden ist)
Die folgenden Abschnitte zeigen unterschiedliche Ansätze, den Updateoperation auf einer Sicht
eine eindeutige Semantik zu geben und sie so updatefähig zu machen.
Eindeutige Update-Semantik durch abstrakte Datentypen
Eine Möglichkeit, für Updateoperationen auf einer spezielle Sicht eine eindeutige Semantik zu
finden, ist es, diese explizit festzulegen. In diesem Ansatz wird eine Sicht als abstrakter Datentyp betrachtet, der neben der eigentlichen Sichtendefinition eine Definition aller erwünschten
Updateoperationen für die Sicht enthält. Die zu definierenden Operationen werden dabei aus
der Anwendung der Sicht abgeleitet (application orientated operations [FC85]).
Für die in Abschnitt A.3.1 deklarierte Sicht janitors wären zum Beispiel die Operationen
hire, fire, replace und transfer zum Einstellen, Entlassen, Ersetzen und Versetzen eines Hausmeisters denkbar.
Die Einführung von abstrakten Datentypen ist zwar, wie die Klasse der Objekt-Relationalen
Datenbanken (siehe Abschnitt A.4.2) zeigt, für relationale Datenbanken möglich. Jedoch erfordert sie die Definition zusätzlicher Sprachkonstrukte. Zudem ist die Definition und Pflege von
Update-Operationen erforderlich, was die Erzeugung von Sichten deutlich aufwendiger macht.
Andererseits hat dieser Ansatz den Vorteil, daß er eine hohe Flexibilität bei der Transformation
der Updateoperationen auf Basisrelationen ermöglicht. Außerdem folgen weitere Vorteile, wie
eine benutzerfreundlichere Schnittstelle und eine bessere Integritätssicherung durch Kapselung,
von der auch Basisrelationen profitieren können.
Sichtenupdate durch Abhängigkeitsgraphen
Dieser Ansatz verwendet die Abhängigkeits-Struktur der unterliegenden Basis-Relationen, um
Updateoperationen auf Sichten eindeutig zu machen.
Hierzu sind die Sichten und unterliegenden Schemata jedoch einigen entscheidenden Einschränkungen unterworfen:
• Die funktionalen Abhängigkeiten im konzeptionellen Schema müssen auf einzelne Attribut-
paare beschränkt sein und jede Basisrelation muß einen Primärschlüssel haben.
• Update-Operationen sind auf das Löschen und Ersetzen von Tupeln und das Einfügen ein-
zelner Tupel beschränkt.
• Sichten sind von der Form
create view V (c1,...,cn) as
select ti1.aj1,...,tin.ajn
from R1 t1,...,Rm tm
where <cond>
36
ANHANG A
A.3 Updateoperationen auf Sichten
wobei <cond> nur Bedingungen der Form t.a=k und t.a=u.b enthält. Die Attribute ajk werden dann als Erzeugende der Sichtenattribute ck bezeichnet (für k ∈ [1,n] ).
Die Struktur dieser Sichtendefinition und der funktionalen Abhängigkeiten des unterliegenden
Schemas kann dann in Form eines gerichteten Sichtenabhängigkeits-Graphen G(V) dargestellt
werden, der bei der Definition der Sicht automatisch angelegt und berechnet werden kann. Er
hat folgende Form:
• Für jedes Attribut der Relationen R1...Rm, jedes Sichtenattribut c1...cn und jede Konstante k
der Bedingung enthält er einen Knoten mit dem Namen des Attributes bzw. dem Wert de
Konstante
• Für jedes ck existiert eine bidirektionale Kante zu dem erzeugenden Attribut ajk
• Für jede Gleichung der Bedingung existiert eine bidirektionale Kante zwischen den beiden
Operanden
• Für jede funktionale Abhängigkeit Rk: a i → a j des konzeptionellen Schemas existiert eine
Kante (Rk.ai, Rk.aj)
• Für jeden Knoten Rk.a mit einem Pfad zu einem Knoten mit einem konstanten Wert existie-
ren Kanten (Ri.aj, Rk.a) für die Attribute aller Relationen Ri der from-Klausel
Aufgrund der Einschränkungen für Updateoperationen haben diese eine recht einfache Struktur,
so daß mit Hilfe dieser Struktur allgemeine Transformationen für diese Operationen angegeben
werden können, in die dann lediglich die Ausdrücke der jeweiligen konkreten Operationen eingestezt werden müssen. Hierfür gibt es in der Regel mehrere Möglichkeiten, von denen nicht
jede eine exakte Transformation der ursprünglichen Operation ist. Mit Hilfe des Abhängigkeitsgraphen können jedoch die Transformationen eliminiert weden, die keine exakten Transformationen sind. Dies soll anhand eines Beispiels verdeutlicht werden:
Eine einfache Löschoperation hat die Form
delete from V
where cn1=k1 and ... and cnp=kp
Die Transformation dieser Operation hat die allgemeine Form
delete from Ri where Ri.ai in
(select ti.ai
from R1 t1,...,Rm tm
where <cond> and sn1=k1 and ... and snp=cp)
wobei sj das Attribut bezeichnet, das das Sichtenattribut cj erzeugt hat und i ∈ [1,m] beliebig
ist. Damit gibt es m mögliche Transformationen. Es kann aber gezeigt werden, daß nur die
Transformationen exakt sind, für die für alle cj von V ein Pfad zu einem Attribut von Ri exi-
Arbeiten mit relationalen Sichten
37
A.3 Updateoperationen auf Sichten
stiert[FC85]. Für insert- und update-Operationen können ähnliche Regeln gefunden werden[DB82].
Dieses Verfahren hat den Vorteil, daß alle benötigten Informationen bei der Definition einer
Sicht vorhanden sind und keine zusätzliche Arbeit für den Benutzer entsteht. Der Nachteil ist,
daß das Verfahren deutliche Einschränkungen hinsichtlich Schema, Sichten und Updateoperationen macht. Ferner liefert es zwar exakte Transformationen (so solche existieren), jedoch ist
es immernoch nicht-deterministisch, da eventuell mehrere exakte Transformationen gefunden
werden. In diesem Fall sind weitere Informationen und Berechnungsschritte nötig, wie sie etwa
im folgenden Abschnitt vorgestellt werden.
Eindeutige Update-Semantik durch Sichtenkomplemente
Eine weitere Möglichkeit, die Semantik einer Updateoperation eindeutig zu definieren, ist die
Spezifikation der Relationen und Attribute der Datenbank, die durch ein Update der Sicht nicht
verändert werden dürfen. Auf diesem Wege können alle Transformationen der Updateoperation, die dieser Spezifikation nicht genügen, ausgeschlossen werden. In [BS81] wird gezeigt,
daß durch die Spezifikation eines solchen Sichtenkomplements jede Mehrdeutigkeit eliminiert
wird und die Semantik der Updateoperationen damit eindeutig definiert ist. Desweiteren kann
die Translations-Abbildung für die Updateoperationen mit Hilfe des Sichtenkomplements vom
System bestimmt werden, so daß Updates automatisch transformiert beziehungsweise als nicht
transformierbar erkannt und abgelehnt werden können.
Das Kernelement dieses Ansatzes ist wie gesagt das Sichtenkomplement, das zunächst genau
definiert werden soll. Informal kann ein Sichtenkomplement zu einer Sicht V beschrieben werden als eine Sicht V’, die alle Informationen der Datenbank enthält, die in V nicht enthalten
sind. Das heißt, daß aus V und V’ stets die ursprüngliche Datenbank rekonstruiert werden kann.
Formal bedeutet dies für die Sichten V und V’ mit den Abbildungsfunktionen f und f’ (siehe
Abschnitt A.3.2):
Sei f'' = f × f' eine Funktion mit f''(s) = (f(s),f'(s)) . V’ ist ein Komplement zu V, genau dann,
wenn f’’ beschränkt auf konsistenten Datenbankzustände s eine bijektive Abbildung ist.
f’’ bildet also einen Datenbankzustand bijektiv auf die Zustände einer Sicht und ihres Komplements ab. Daher ist es möglich, mittels f’’ von einem konsistenten Datenbankzustand s ein Paar
von zugehörigen Zuständen (v, v’) der Sicht und ihres Komplements zu berechnen und umgekehrt mittels f’’-1, ohne Informationen zu verlieren.
Eine Transformation von Updateoperationen u unter einem konstanten Sichtenkomplement
kann beschrieben werden durch die Suche nach einem Datenbankzustand s’, so daß
f(s') = u(f(s)) ∧ f'(s') = f'(s) gilt. Durch die Definition eines konstanten Sichtenkomplements
V’ ist s’ eindeutig. Existiert s’ für alle konsistenten Zustände s, so heißt u V’-transformierbar.
Die Transformation kann dann erfolgen durch den von V’ induzierten Translator TV’ mit
–1
T V'(u) = f'' ° ( u × I )°f''
wobei I die identische Abbildung bezeichnet.
38
ANHANG A
A.4 Ergänzungen zum relationalen Sichtenmodell
Das Vorgehen für den Umgang mit Sichtenupdates ist dann folgendes: Der Datenbankadministrator gibt - unterstützt vom System - zusätzlich zu einer Sicht ein entsprechendes Komplement
an, das bei Updates auf der Sicht unverändert bleiben soll. Anschließend ist vom System ein
geeigneter Translator zu berechnen, mit dessen Hilfe dann jedes Update auf der Sicht entweder
eindeutig und wohldefiniert in Updates der Basisrelationen transformiert werden kann oder als
ungültig abgelehnt wird.
In der Praxis bleibt das Problem offen, für beliebige Sichten geeignete Komplemente zu finden,
beziehungsweise zu überprüfen, ob eine Sicht das Komplement einer anderen ist. Ferner ist für
den allgemeinen Fall die Berechnung von f’’-1 ein offenes Problem.
In [CP84] ist ein Verfahren zur Berechnung von Komplementen für eine sehr eingeschränkte
Klasse von Sichten (Sichten bestehend aus einer Relation mit einfachen funktionalen Abhängigkeiten als einzige Integritätsbedingungen) in Polynomialzeit und für die Berechnung des
Translators gegeben.
Eine andere Möglichkeit wird in [Chan83] dargestellt. Hier wird das Sichtenkomplement ebenfalls nur auf sehr einfache Sichten (eine Relation, keine Integritätsbedingungen und nur ein relationaler Operator in der Abfragebedingung) angewendet. Ferner wird vorgeschlagen,
Operationen auf komplexere Sichten zusammen mit den Sichtendefinitionen durch einen Interpreter analysieren zu lassen. Der Interpreter soll dann die Operationen als Operationen auf einfachen Sichten interpretieren, die den oben genannten Bedingungen genügen und die durch
Schachtelung die ursprüngliche Sicht repräsentieren.
A.4 Ergänzungen zum relationalen Sichtenmodell
A.4.1 Virtuelle Attribute in SQL3
Zusätzlich zu virtuellen Relationen unterstützt SQL3 eine Erweiterung des relationalen Sichtenmodells: virtuelle Attribute oder virtuelle Spalten. Basisrelationen können um solche virtuellen
Spalten erweitert werden, deren Inhalt ähnlich zu virtuellen Relationen dynamisch durch eine
relationale Datenbankanfrage definiert ist.
A.4.2 Objektrelationale Datenbanken und Objektsichten
Objektrelationale Datenbanken erweitern herkömmliche relationale Datenbanken um ein komplexeres Typsystem mit Objektorientierung. Klassen werden hierbei auf spezielle Relationen sogenannte Objekttabellen - abgebildet, Objekte auf Tupel in diesen Tabellen. Ein Standard für
objektrelationale Datenbanken ist SQL3.
SQL3 unterstützt neben herkömmlichen relationalen Sichten sogenannte Objektsichten. Ebenso
wie herkömmliche relationale Sichten virtuelle Relationen sind, sind Objektsichten virtuelle
Arbeiten mit relationalen Sichten
39
A.4 Ergänzungen zum relationalen Sichtenmodell
Objekt-Tabellen. Sie werden definiert durch eine eine typisierte Sichtendefinition und eventuell
eine zusätzliche Typ- beziehungsweise Klassendefinition für die Objekte in der Objekt-Tabelle.
Eine solche Sichtendefinition kann zum Beispiel folgendermaßen aussehen:
create table employees (
empnum Integer,
name VarChar,
job VarChar )
create type developer (
empno Integer,
name VarChar,
function ...)
create view developerView of developer
with object oid (empno) as
select empnum, name
from employees
where job = ’Developer’
Die Klausel with object oid gibt dabei die Attribute der Objekt-Tabelle an, die ein Objekt eindeutig identifiziert. Aus den Werten dieser Attribute wird dann eine eindeutige Obejkt-ID für
jedes Objekt der Objektsicht errechnet. Die angegebenen Attributnamen müssen daher für die
Sicht mindestens einen Candidate Key bezeichnen. In den meisten Fällen handelt es sich um die
Primärschlüssel-Attribute der unterliegenden Relationen.
Updates auf Objekt-Sichten sind in der Regel genau dann erlaubt, wenn auch Updates auf einer
herkömmlichen Sicht mit der gleichen definierenden Anfrage erlaubt sind. Zusätzlich bietet
sich hier der bereits in Abschnitt A.3 vorgestellte Ansatz an, weitere Updates durch die explizite
Definition von Update-Funktionen für die Objekte der Sicht zu ermöglichen. In Oracle[Ora8i]
wird dies zum Beispiel durch sogenannte instead of-Trigger ermöglicht, die bei Updates an den
Objekten an Stelle der normalen Update-Operation ausgeführt werden.
40
ANHANG A
ANHANG B
Literaturverzeichnis
[Boo94]
Grady Booch. Objektorientierte Analyse und Design. Addison Wesley, 1994.
[EN94]
R. Elmasri and S.B. Navathe. Fundamentals of Database Systems. Benjamin/
Cummings, Redwood City, 2nd edition, 1994.
[FNT98]
T. Fischer, J. Niere, and L. Torunski. Konzeption und Realisierung einer integrierten Entwicklungsumgebung für UML, Java und Story-Driven-Modeling (in german). Master’s thesis, University of Paderborn, Paderborn, Germany, July 1998.
[Jac95]
I. Jacobson. Object oriented software engineering: a use case driven approach.
Addison Wesley, 1995.
[Rum94]
James Rumbaugh. Objektorientiertes Modellieren und Entwerfen. Hanser, 1994.
[UML]
Rational Software Corporation. UML documentation version 1.3 (1999). Online
at http://www.rational.com.
[Rec01]
C. Reckord. Entwurf eines generischen Sichtenkonzeptes für die Entwicklungsumgebung Fujaba. Studienarbeit, University of Paderborn, Paderborn, Germany,
Feb 2001.
[Mul99]
R.J. Muller. Database Design for Smarties - Using UML for Data Modeling. Morgan Kaufmann Publishers, 1999.
[BG92]
D. Bell and J. Grimson. Distributed Database Systems. Addison Wesley, 1992.
[GL01]
J. Goldstein and P. Larson. Optimizing queries using materialized views: A practical, scalable solution. In Proc. of ACM SIGMOD Conf. on Management of Data,
2001.
[BS81]
F. Bancilhon & N. Spyratos. Update semantics of relational views. ACM Transactions on Database Systems, (4) 557--575, 1981.
[AB91]
S. Abiteboul and A. Bonner. Objects and Views. In Clifford and R.King, editors,
Proc. ACM SIGMOD Conf. on Management of Data, pages 238-247, Denver, Co,
May 1991, ACM New York.
41
42
ANHANG B
ANHANG C
Abbildungsverzeichnis
ABBILDUNG 1: DIE DREI-SCHICHT-ARCHITEKTUR DES ANSI/SPARC-MODELLS ................ 1
ABBILDUNG 2: VERTEILTE DATENBANKARCHITEKTUREN ...................................................... 9
ABBILDUNG 3: USE-CASE-DIAGRAMM ................................................................................. 16
ABBILDUNG 4: KOLLABORATIONSDIAGRAMM »PROCESS ORDER« ....................................... 16
ABBILDUNG 5: KLASSENDIAGRAMM ..................................................................................... 17
ABBILDUNG 6: INTEGRATION VON KLASSENDIAGRAMMEN ................................................. 18
ABBILDUNG 7: UML-METAMODELL-ARCHITEKTUR ............................................................ 22
ABBILDUNG 8: KLASSENDIAGRAMM UND METAMODELL IN FUJABA ................................... 22
ABBILDUNG 9: COMPOSITE-FILTER-DEFINITION UND AUSWERTUNGSREIHENFOLGE ........... 23
ABBILDUNG 10: DIE TRANSLATIONS-ABBILDUNG TU ........................................................... 35
43
Herunterladen