Ein Ansatz für ein Konzept Objektrelationaler

Werbung
Ein Ansatz für ein Konzept Objektrelationaler Datenbanksysteme
Ich möchte mit diesem Skript einen eigenen Ansatz für Objektrelationale Datenbanksysteme
beschreiben. Meine Idee ist es, das Konzept der Relationalen Datenbanken weitestgehend
beizubehalten und die Objektorientierten Prinzipien dort lediglich hineinzuinterpretieren, um ein
Verständnis für die bereits vorhandenen Verbindungen beider Konzepte zu schaffen. Darüber hinaus
werden notwendige Erweiterungen erarbeitet, um eine echte Unterstützung der Objektorientierung in
Relationalen Datenbanksystemen zu erreichen.
Für relationale Datenbanken ist charakteristisch, dass sie einzig und allein aus Relationen
zusammengesetzt sind. Ein Tupel wird dabei durch einen Primärschlüssel eindeutig definiert. Die
Beziehungen zwischen den Relationen werden durch Fremdschlüssel hergestellt. Ein
objektorientierter Aufsatz darf diese Prinzipien nicht verletzen!
Die Grundkonzepte der Objektorientierung lauten Datenabstraktion, Datenkapselung, Vererbung und
Polymorphismus. Diese Konzepte sind nun auf relationale Datenbanken zu übertragen. Des Weiteren
muss geklärt werden, was bei relationalen Datenbanken ein Objekt, ein Attribut, eine Methode und
was eine Klasse ist.
Beginnen wir mit Letzterem: Eine Klasse entspricht einer Relation. Die Attribute einer Klasse
entsprechen den Attributen einer Relation. Dadurch wären die Daten einer Klasse im Sinne der
objektorientierten Programmierung beschrieben. Was ist aber mit den Methoden? Wie ist der Zugriff
auf diese Daten geregelt? Nun ja, dafür gibt es die Datenbankzugriffssprache SQL, genauer gesagt
DML. Die Methoden, sind für jede Klasse gleich. Sie heißen „insert“, „update“, „delete“ und „select“.
Dass nicht für jede Klasse eigene Methoden definiert werden sollen hat zwei Gründe. Zum einen wird
dadurch die Einfachheit der Relationalen Datenbanken erhalten und zum zweiten ist die
Notwendigkeit dafür überhaupt nicht gegeben, wenn man sich vor Augen führt, dass ein DBMS zur
Verwaltung von Datenbeständen, nicht aber zur Programmierung eines operativen
Anwendungssystems dient. Hier muss man zwischen der Anwendungsentwicklung und dem
Datenmanagement strikt unterscheiden.
Zu den vier Grundkonzepten der OOP: Die Datenabstraktion ist die Bildung von Klassen zur
Beschreibung von Objekten. Da eine Relation per Definition eine Klasse ist und eine Relation mit SQL
selbstverständlich angelegt, geändert und gelöscht werden kann, ist diesem Konzept mit dem bereits
vorhandenen Mitteln vollends genüge getan.
Die Datenkapselung bezeichnet die Zugriffskontrolle auf die Daten. Auch dies ist durch SQL schon mit
Hilfe des „grant“-Befehls abgedeckt. Zudem hilft das Transaktionsprinzip, um gegen Inkonsistenzen
gewappnet zu sein. Und zu guter letzt ist ein direkter Zugriff auf die Attribute generell nicht möglich.
Dies ist schon bei rein relationalen Datenbanken nur per SQL bzw. genauer formuliert über die
„Methoden“ der DML möglich.
Von Vererbung spricht man in der Objektorientierten Programmierung, wenn eine Klasse die Attribute
und Methoden einer anderen Klasse übernimmt bzw. erbt. So muss in der erbenden Klasse, in der
„abgeleiteten Klasse“, lediglich das Spezielle dieser Klasse definiert werden, nicht aber das
Allgemeine, das bereits in der vererbenden Klasse, der „Basisklasse“, definiert ist. Um die Vererbung
in relationalen Datenbanken zu integrieren muss zunächst klar sein, dass es sich bei der Beziehung
zwischen Basisklasse und abgeleiteter Klasse um eine 1:1-Beziehung handelt – nie um eine 1:nBeziehung! Ein Beispiel, um die Vererbung von Klassen inhaltlich in Relationen abzubilden, sei im
Folgenden aufgezeigt:
Mitarbeiter
Nr
Name
Vorname
Angestellter
Nr
Gehalt
Arbeiter
Nr
Stundenlohn
Es erben die Relationen „Angestellter“ und „Arbeiter“ von der Relation „Mitarbeiter“ die allgemeinen
Felder „Name“ und „Vorname“. Im Speziellen wird bei einem Angestellten ein „Gehalt“ definiert; ein
Arbeiter erhält einen „Stundenlohn“. Die Beziehungen zur „Basisrelation“ werden in den „abgeleiteten
Relationen“ über den Fremdschlüssel „Nr“ definiert, wie es das Konzept der relationalen Datenbanken
vorsieht. Bei 1:1-Beziehungen ist der Fremdschlüssel zugleich auch der Primärschlüssel der Relation.
So erfolgt die Abbildung der Attribute in Relationen im Sinne der Objektorientierung reibungslos,
jedoch muss nun noch möglich sein, dass der Datenzugriff diese Vererbung unterstützt. Das bedeutet,
dass der Zugriff beispielsweise auf „Angestellter“ so erfolgen kann, als beinhalte diese Relation außer
den Attributen „Nr“ und „Gehalt“ auch noch „Name“ und „Vorname“. Ein „select * from Angestellter“ soll
demnach alle vier Felder listen. Das würde er derzeit mit SQL nicht machen. Möchte man mit
vorhandenen Mitteln das vorgegebene Ziel erreichen, wäre dieser SELECT-Befehl nötig:
SELECT mitarbeiter.nr, name, vorname, gehalt
FROM mitarbeiter INNER JOIN angestellter ON mitarbeiter.nr = angestellter.nr;
Hierbei kann von einer wirklichen Unterstützung der Objektorientierung durch SQL nicht die Rede
sein. Ein Vorschlag meinerseits für Abhilfe ist, eine besondere Art von Fremdschlüssel-Beziehung zu
erlauben, die eine Vererbung markiert. Benannt könnte diese Beziehung IS-A-Beziehung werden –
nachdem Bjarne Stroustrup, Erfinder von C++, zwischen Objekten eine „IS-A“- und eine „HAS-A“Beziehung erkannte. Die Ausweisung als Vererbung soll zur Folge haben, das SQL die abgeleitete
Relation so behandelt, als seien die Felder der Basisrelation, bis auf dessen Primärschlüssel, direkt
dort definiert. Angepasst müssten dementsprechend sämtliche DML-Befehle werden. Nun ist geklärt,
wie die Vererbung von Attributen zu verstehen ist, aber nicht die von Methoden. Dazu gibt es auch
nicht viel zu sagen, wenn man bedenkt, dass alle existierenden Methoden „insert“, „update“, „delete“
und „select“ sind, diese generisch sind, also ohnehin für alle Relationen gelten. Relationenbezogene
Methoden wurden bereits weiter oben ausgeschlossen und müssen deshalb hier nicht diskutiert
werden.
Als letztes gilt es sodann den Polymorphismus unter den Hut der relationalen Datenbanken zu
bringen. Der Begriff „Polymorphismus“ kommt aus dem griechischen und bedeutet wörtlich übersetzt
„Vielgestaltigkeit“. Das bedeutet in der OOP, dass ein Objekt eines bestimmten Typs auch unter der
Deklaration eines verwandten Typs verarbeitet werden kann. Anhand des obigen MitarbeiterBeispiels, bedeutet das, dass Objekte bzw. Tupel vom Typ „Angestellter“ auch als „Mitarbeiter“
verarbeitet werden können, z.B. eine Mitarbeiterliste erstellt werden kann, obwohl die Objekte
eigentlich „Angestellte“ oder „Arbeiter“ sind. Also „select * from mitarbeiter“ muss z.B. akzeptiert
werden, was selbstverständlich wegen unserer generischen DML-Methoden der Fall ist.
Polymorphismus wird demnach implizit unterstützt, wenn die Vererbung möglich ist. Viel schwieriger
wäre es hierbei SQL so zu manipulieren, dass der Polymorphismus nicht unterstützt wird.
Alles in Allem gestaltet es sich nicht besonders schwierig, um SQL auf Objektorientierung zu trimmen.
Lediglich für die Vererbung muss ein besonderer Beziehungstyp bei 1:1-Beziehungen definierbar sein.
Die weiteren Konzepte der Objektorientierung widersprechen denen der Relationalen Datenbanken
ohnehin nicht und müssen nur richtig verknüpft werden.
Meiner Ansicht nach reicht diese SQL-spezifische Erweiterung für die Unterstützung der
Objektorientierung aus. Natürlich kann man auch darüber nachdenken, in einzelnen Attributen von
Relationen komplexe Objekte statt der einfachen Datentypen zuzulassen. Dies zieht aber meiner
Meinung nach nur eine umfangreiche Verkomplizierung von SQL nach sich und macht so das genial
einfache Konzept Relationaler Datenbanken unnötig schwer verwendbar. Zudem bringt dies kaum
Vorteile. Ein schlichter Aufsatz in Richtung Objektorientierung genügt völlig.
Christian Silberbauer
Herunterladen