Vererbung und Polymorphie mit relationalen Datenbanken

+ andere TechDocs
+ SQL mit Java
+ SQL
+


Relationale Datenbanken sind nicht objektorientiert und es gibt keine Vererbung.

In objektorientierten Programmiersprachen (z.B. Java) ist Vererbung üblich, zum Beispiel um über Methoden der Oberklasse Funktionalitäten aller Objekte anzusprechen (die pro Unterklasse unterschiedlich implementiert sein können: Polymorphie).

Es gibt verschiedene Wege, Vererbungshierarchien objektorientierter Modelle auf Datenbanktabellen abzubilden. Diese verschiedenen Methoden können auch gemischt vorkommen.



Inhalt

  1. Eine Tabelle pro Klasse
  2. Eine Tabelle pro konkreter Klasse
  3. Eine Tabelle pro Klassenhierarchie


Eine Tabelle pro Klasse

OO-Modell (z.B. Java-Klassen)   Datenbanktabellen
 
        
Artikel
id int
name String
preis double
                          
ARTIKEL
ID INTEGER
NAME VARCHAR
PREIS NUMERIC
DISCRIMINATOR VARCHAR
        
  Δ
|
  Δ
|
         
Speise
zutaten String
zubereitzeit double
 
Getraenk
volumen double
hersteller String
        
SPEISEN
ZUTATEN VARCHAR
ZUBEREITZEIT NUMERIC
 
GETRAENKE
VOLUMEN NUMERIC
HERSTELLER VARCHAR

Sowohl für Interfaces und abstrakte Oberklassen (im Beispiel "Artikel") als auch für die davon abgeleiteten Klassen (im Beispiel "Speise" und "Getraenk") wird jeweils eine Datenbanktabelle angelegt. Die Daten konkreter Objekte werden auf die Tabellen zu den Ober- und Unterklassen verteilt.

Vorteile:

Nachteile:

Beispiel für Hibernate-Mapping (per 'joined-subclass'):



Eine Tabelle pro konkreter Klasse

OO-Modell (z.B. Java-Klassen)   Datenbanktabellen
 
        
Artikel
id int
name String
preis double
                                     
  Δ
|
  Δ
|
             
Speise
zutaten String
zubereitzeit double
 
Getraenk
volumen double
hersteller String
        
SPEISEN
ID INTEGER
NAME VARCHAR
PREIS NUMERIC
ZUTATEN VARCHAR
ZUBEREITZEIT NUMERIC
 
GETRAENKE
ID INTEGER
NAME VARCHAR
PREIS NUMERIC
VOLUMEN NUMERIC
HERSTELLER VARCHAR

Für die abstrakte Oberklasse (im Beispiel "Artikel") wird keine Datenbanktabelle angelegt. Nur für die konkreten Klassen, von denen Objekte erzeugt werden können (im Beispiel "Speise" und "Getraenk"), werden Datenbanktabellen angelegt. Die Daten konkreter Objekte werden nicht auf mehrere Tabellen verteilt.

Vorteile:

Nachteile:

Beispiel für Hibernate-Mapping (per 'union-subclass'):



Eine Tabelle pro Klassenhierarchie

OO-Modell (z.B. Java-Klassen)   Datenbanktabellen
 
        
Artikel
id int
name String
preis double
                   
ARTIKEL
ID INTEGER
NAME VARCHAR
PREIS NUMERIC
DISCRIMINATOR VARCHAR
ZUTATEN VARCHAR
ZUBEREITZEIT NUMERIC
VOLUMEN NUMERIC
HERSTELLER VARCHAR
 
  Δ
|
  Δ
|
       
Speise
zutaten String
zubereitzeit double
 
Getraenk
volumen double
hersteller String
            

Die Daten aller Klassen einer Klassenhierarchie werden in einer gemeinsamen "breiten" Datenbanktabelle abgebildet. Je nach gespeichertem Objekt bleiben für den jeweiligen Typ nicht benötigte Datenbankspalten leer.

Vorteile:

Nachteile:

Beispiel für Hibernate-Mapping (per 'subclass'):





Weitere Themen: andere TechDocs | SQL mit Java | SQL
© 1998-2007 Torsten Horn, Aachen