Kapitel 11 1
Moderne Datenbankkonzepte
Verteilte Datenbanken
¾ Wünschenswert,
¾ aber extrem aufwändig (Æ Zweiphasen Commit)
Objektrelationale Datenbanken
¾ Kompromiss zwischen relational und rein objektorientiert
¾ seit 1999 normiert in SQL3 (SQL99)
¾ seit Oracle V8.0 implementiert
Objektorientierte Datenbanken
Definition (objektorientierte Datenbanken)
¾ Eine Datenbank heißt objektorientiert, wenn sie grundlegende objekt- orientierte Konzepte wie Objekte, Klassen, Methoden, Kapselung und Vererbung enthält.
Warum objektorientierte Datenbanken?
¾ Komplexe Datenstrukturen können direkt in die Datenbank übernommen werden
¾ Objektorientierte Ansätze wie Kapselung oder Vererbung können eingesetzt werden
¾ Ziel: Direkte Abbildung der Realität in die Datenbank mit überschaubarem und leicht modifizierbarem Code
Kapitel 11 3
Nachteile relationaler Datenbanken
Nachteile Auswirkung
Flache Struktur Komplexe Objekte werden „flachgeklopft“; ihr Auf- bau ist aus dem Design nicht mehr direkt ersichtlich Keine Rekursion Der Aufbau komplexer Objekte kann nur schwer
nachvollzogen werden (Stücklistenproblem)
Vielzahl von Relationen Häufige Joins auf zusammengehörige Relationen verlängern die Laufzeit
Objekte am Beispiel: Aufbau eines Fahrrads
Fahrrad
Lackierter Rahmen
Sattel Gruppe Deore
Räder Lenker Pedale
Geschweißter Rahmen
Gabel Rohre Tretlager
Felgen Bereifung Schlauch
Kapitel 11 5
Objektrelationale Datenbanken
Ansatz:
Erweiterung relationaler Datenbanken durch Hinzufügen von objekt- orientierten Strukturen und Methoden
Basis:
NF2-Relationen (NF2 = NFNF = Non-First-Normal-Form) Definition (NF2-Relationen)
¾ Eine Relation ist in der n-ten NF2-Form (n>1), falls sie in der n-ten Normalform ist, wobei aber die Bedingung der ersten Normalform (Atomarität der Attribute) nicht erfüllt sein muss.
SQL3 (SQL99)
Es wird unterstützt:
¾ NF2-Relationen
¾ Anwendungssprache, um Rekursion, Konstruktor, Methoden und Datenkapselung zu unterstützen
¾ Klassenobjekte (mit private, public, protected Elemente)
¾ Templates (parametrisierte Typen)
¾ Neue Operatoren wie Recursive Union (für Stücklistenproblem)
¾ Neue Datentypen CREATE TYPE
CREATE TABLE erweitert
IF-, WHILE-, FOR- Kontrollstrukturen
Kapitel 11 7
Objektrelationale Erweiterungen in Oracle ab V8.0
Wirtssprache ist PL/SQL, was etwas von der SQL3-Norm abweicht.
Objektorientierte Strukturen in Oracle:
¾ Objekt
¾ Objekt-Sichten
¾ Variable Felder
¾ Eingebettete Relationen (nested table)
Create-Type-Befehl (1)
CREATE [ OR REPLACE ] TYPE Typname AS OBJECT ( Spalte Datentyp [ , … ] ,
[ MEMBER { Prozedurname | Funktionsname } [ , … ] ] ) CREATE [ OR REPLACE ] TYPE BODY Typname AS
MEMBER { Prozedurdeklaration | Funktionsdeklaration } ; [ , … ] END
Beispiel:
CREATE OR REPLACE TYPE TAdresse AS OBJECT ( Strasse CHARACTER ( 30 ) ,
PLZ CHARACTER ( 5 ) ,
Ort CHARACTER ( 20 ) ) ;
Kapitel 11 9
Verwendung des neuen Datentyps
CREATE TABLE LieferantNeu
( Nr INTEGER PRIMARY KEY ,
Name CHARACTER ( 30 ) NOT NULL ,
Adresse TAdresse ,
Sperre CHARACTER ) ;
Vorteil:
In allen drei Relationen Lieferant, Kunde, Personal werden die gleichen Datentypen verwendet!
Aber:
Wie werden die Daten von Lieferant übertragen?
Wie wird auf die Relation LieferantNeu zugegriffen?
Zugriff auf Relation LieferantNeu
Einfügen aus Relation Lieferant:
INSERT INTO LieferantNeu
SELECT Nr, Name, TAdresse(Strasse, PLZ, Ort), Sperre FROM Lieferant ;
Lesezugriffe:
SELECT * FROM LieferantNeu ;
SELECT Name, L.Adresse.Ort FROM LieferantNeu L;
Kapitel 11 11
Objekt-Sichten
Beispiel Lieferant:
Vorteilhaft: Sicht statt neue Relation
CREATE VIEW SLieferant ( Nr, Name, Adresse, Sperre ) AS
SELECT L.Nr, L.Name, TAdresse (L.Strasse, L.PLZ, L.Ort), L.Sperre FROM Lieferant L;
Zugriffe:
SELECT * FROM SLieferant ;
SELECT Name, L.Adresse.Ort FROM SLieferant L;
Variable Felder
CREATE TYPE Typname AS
{ VARRAY | VARRYING ARRAY } ( Anzahl ) OF Datentyp Beispiel:
Nicht atomare Relation Verkäufer-Produkt (max. 20 Produkte)
CREATE TYPE TProdukt AS VARRAY ( 20 ) OF CHARACTER ( 30 ) ; CREATE TABLE VerkaeuferProdukt
( Verk_Nr CHARACTER ( 4) PRIMARY KEY , Verk_Name CHARACTER (20) NOT NULL ,
Adresse TAdresse ,
Produkt TProdukt ,
Umsatz NUMERIC (10, 2) ) ;
Kapitel 11 13
Zugriff auf variable Felder
Einfügen einer neuen Zeile:
INSERT INTO VerkaeuferProdukt VALUES
( 'V1', 'Meier', TAdresse ('Postfach 100111', '80075', 'München'), TProdukt ('Waschmaschine', 'Herd', 'Kühlschrank'), 17000 ) ; Lesezugriff:
Select Verk_Name, Adresse, Produkt From VerkaeuferProdukt ;
Lesen von einzelnen Produktelementen nur mit Programmierung:
z.B.: in Produkt.Count ist die Anzahl der Elemente gespeichert
Eingebettete Relationen
Syntax:
CREATE TYPE Typname AS TABLE OF Datentyp
Beispiel: Einbettung der Relation Auftragsposten in die Relation Auftrag
AuftrNr Datum Kundnr Persnr
1 04.08.03 200002 2 800,00 1 2 2 06.09.03 100002 3 1.950,00
200001 1 400,00 3 5
3 07.10.03 100001 1 700,00
500002 2 100,00 4 2
4 18.10.03
100001 1 700,00 500001 4 30,00 500008 1 94,00
6 5
5 03.11.03 500010 1 40,00
500013 1 30,00 1 2
Kapitel 11 15
Realisierung der Einbettung
CREATE OR REPLACE TYPE TEinzelposten AS OBJECT ( Teilenr INTEGER,
Anzahl INTEGER,
Gesamtpreis NUMERIC(10,2) ) ;
CREATE TYPE ET_Einzelposten AS TABLE OF TEinzelposten ; CREATE TABLE AuftragNeu
( AuftrNr INTEGER PRIMARY KEY,
Datum DATE,
Einzelposten ET_Einzelposten,
Kundnr INTEGER REFERENCES Kunde
ON DELETE NO ACTION ON UPDATE CASCADE, Persnr INTEGER REFERENCES Personal
ON DELETE SET NULL ON UPDATE CASCADE ) NESTED TABLE Einzelposten STORE AS ET_Einzelposten_TAB ;
Zugriff auf eingebettete Relationen
Einfügen:
INSERT INTO AuftragNeu VALUES ( 2, '06-Sep-98',
ET_Einzelposten ( TEinzelposten (100002, 3, 1950),
TEinzelposten (200001, 1, 400) ), 3, 5 ) ; Lesezugriffe:
SELECT * FROM AuftragNeu ;
SELECT Einzelposten FROM AuftragNeu WHERE AuftrNr = 2 ;
Einzelposten(Teilenr, Anzahl, Gesamtpreis)
ET_Einzelposten(TEinzelposten(100002, 3, 1950),
TEinzelposten(200001, 1, 400), TEinzelposten(500013, 2, 60))
Kapitel 11 17
Komplexere Ausgaben
Funktion THE ( ) :
Wandelt eingebettete Relation in Ausgaberelation um.
Beispiel: Ausgabe der Einzelposten als „normale“ Relation:
SELECT * FROM THE ( SELECT Einzelposten FROM AuftragNeu
WHERE AuftrNr = 2 ) ;
Teilenr Anzahl Gesamtpreis
100002 3 1950
200001 1 400
500013 2 60
Komplexe Ausgabe (2)
Aufgabe: Ausgabe des Gesamtvolumens des Auftrags 2
SELECT Sum ( T. Gesamtpreis )
FROM THE ( SELECT Einzelposten
FROM AuftragNeu
WHERE AuftrNr = 2 ) T ;
Kapitel 11 19
Einfügen in eingebettete Relation
Einfügen eines weiteren Auftragsposten zum Auftrag 2 INSERT INTO
THE (SELECT Einzelposten FROM AuftragNeu WHERE AuftrNr = 2 ) VALUES ( TEinzelposten ( 500013, 2, 60 ) ) ;
Ausgabe von Daten mehrerer eingebetteter Relationen
Ziel:
Ausgabe aller Einzelpositionen zu allen Aufträgen mit einem Gesamtwert von über 600 Euro
Benötigt:
Funktion Multiset: Fast eingebettete Relationen zusammen Cast-Operator: Umwandeln in geeigneten Datentyp
SELECT A1.AuftrNr,
CAST (MULTISET (SELECT * FROM
THE (SELECT Einzelposten FROM AuftragNeu A2 WHERE A2.AuftrNr = A1.AuftrNr ) T WHERE T.Gesamtpreis > 600
) AS ET_Einzelposten) FROM AuftragNeu A1;
Kapitel 11 21
Weitere objektorientierte Datenbankansätze
PostgreSQL:
PostgreSQL ist eine Erweiterung relationaler Datenbanken.
PostgreSQL unterstützt weitgehend den SQL-3 Standard.
PostgreSQL baut auf der Datenbank Ingres auf und wurde an der Universität von Berkeley entwickelt und hat auch die Datenbank Ingres selbst beeinflusst.
PostgreSQL ist frei verfügbar.