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.
OO-Modell (z.B. Java-Klassen) | Datenbanktabellen | |||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||
Δ | |
Δ | |
↓ | ↓ | |||||||||||||||||||||||||||||||||||||||
|
|
|
|
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'):
<class name="entity.Artikel"> <id name="id"><generator class="native" /></id> <property name="..." /> <joined-subclass name="entity.Speise" table="SPEISEN"> <key column="id" /> <property name="..." /> </joined-subclass> <joined-subclass name="entity.Getraenk" table="GETRAENKE"> <key column="id" /> <property name="..." /> </joined-subclass> </class>
OO-Modell (z.B. Java-Klassen) | Datenbanktabellen | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Δ | |
Δ | |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
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'):
<class name="entity.Artikel"> <id name="id"><generator class="native" /></id> <property name="..." /> <union-subclass name="entity.Speise" table="SPEISEN"> <property name="..." /> </union-subclass> <union-subclass name="entity.Getraenk" table="GETRAENKE"> <property name="..." /> </union-subclass> </class>
OO-Modell (z.B. Java-Klassen) | Datenbanktabellen | ||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||
Δ | |
Δ | |
||||||||||||||||||||||||||||||||||||||||||||||
|
|
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'):
<class name="entity.Artikel"> <id name="id"><generator class="native" /></id> <property name="..." /> <discriminator column="discriminator" type="string" length="1" /> <subclass name="entity.Speise" discriminator-value="S"> <property name="..." /> </subclass> <subclass name="entity.Getraenk" discriminator-value="G"> <property name="..." /> </subclass> </class>