# Allgemeines SQL: Vererbungshierarchien in relationalen DBMS



## JFreak (5. Mrz 2010)

Ich möchte eine Hierarchie von Daten (Standardbeispiel: Person -> Angestellter -> Manager) so in SQL modellieren, dass ein Tupel immer nur Element einer Unterklasse sein kann. Damit schließt sich schon einmal der Standardansatz (mehrere Kindtabellen, die jeweils als PK den PK der Elterntabelle referenzieren) aus.

Nach einigem Googlen bin ich jetzt auch noch nicht so auf den grünen Zweig gekommen. Gefunden habe ich z. B. Implementing Table Inheritance in SQL Server - SQLTeam.com, das sieht mir mit diesen "Magic Numbers" aber etwas geschustert aus und scheint auch nur beim MS SQL Server gut zu funktionieren.

Ein anderer Ansatz wäre mittels PostgreSQL, siehe dort: PostgreSQL: Documentation: Manuals: PostgreSQL 8.1: Inheritance. Folgendes Verhalten gefällt mir aber nicht:


> Inheritance does not automatically propagate data from INSERT or COPY commands to other tables in the inheritance hierarchy.


Es wäre allerdings schon wünschenswert, wenn das Einfügen eines Tupels des Subtyps dies nach oben propagieren würde (oder habe ich das einfach falsch verstanden?).

Ein weiterer Punkt ist, dass ich aufgrund der Hardware, auf der das Ganze laufen soll, SQLite verwenden möchte. Mit dem Funktionsumfang von SQLite kenne ich mich aber gar nicht aus, und würde eigentlich auch nur ungern Trigger verwenden. Verlange ich da zu viel? Wie ist das Standardvorgehen?


----------



## maki (5. Mrz 2010)

> Verlange ich da zu viel? W


Google doch mal nach "object relational impedance".
RDBMS haben eben keine richtige Vererbung, sind alles nur Krücken, einige davon sogar standartisiert (zB. in JDO und JPA), ist aber nicht der einzige Punkt an dem OO und Relationale Datenbaken so ihre reibereien haben.

Wenn du eine "saubere" Lösung willst, musst du eine richtige Objekt (orientierte) Datenbank nehmen.


----------



## JFreak (5. Mrz 2010)

Sprich, ich sollte PostgreSQL verwenden? Wobei ja da die Vererbung noch nicht komplett implementiert ist. Welches konkrete System ist also anzuraten?


----------



## maki (6. Mrz 2010)

Vergiss PostgreSql, ist nicht wirklich OO.. Google doch mal nach objekt datenbank, dann findest du zB. db4objects 
Man kann aber mit JPA und entsprecheder Implementierung (Hibernate/EclipseLink) mit einem RDBMS schon einiges erreichen, man muss halt die Einschränkungen kennen.


----------



## JFreak (6. Mrz 2010)

Mein Problem hierbei ist, dass ich gern direkt auf die Datenbank (sprich JDBC, an anderer Stelle auch PHP/PDO) zugreifen möchte, ohne größere Abhängigkeiten wie Hibernate etc.
db4o sieht ja schon mal relativ gut aus, allerdings existiert keine PHP-Anbindung. Das würde zwar notfalls auch gehen, aber mit wäre es besser


----------



## Firestorm87 (6. Mrz 2010)

JFreak hat gesagt.:


> Mein Problem hierbei ist, dass ich gern direkt auf die Datenbank (sprich JDBC, an anderer Stelle auch PHP/PDO) zugreifen möchte, ohne größere Abhängigkeiten wie Hibernate etc.
> db4o sieht ja schon mal relativ gut aus, allerdings existiert keine PHP-Anbindung. Das würde zwar notfalls auch gehen, aber mit wäre es besser



Du kannst die Vererbungen natürlich auch "zu Fuß" per JDBC programmieren...
Natürlich bedeutet das ein wenig Arbeit, aber dafür kannst du die Zugriffslogiken nach einmaliger Erarbeitung auch in anderen Sprachen verwenden (Die logik und SQL-Befehle sind dann ja gleich)
im Prinzip ist eine Vererbung ja nichts anderes als ein DB-Join...


----------



## JFreak (7. Mrz 2010)

Völlig richtig. Allerdings muss man der Vollständigkeit halber noch dazu sagen, dass die gängigen RDBMS nicht den kompletten Umfang der ER-Modellierung unterstützen (in diesem Fall betrifft das Spezialisierung/Generalisierung). Diese Einschränkung war mir bei meinem ersten Posting noch nicht klar. Per Join kann man das zwar tun, aber dann habe ich keine Sicherheit per Design, sondern muss immer noch Logik in Form von Triggern, Check-Constraints oder eben Java-Code drumherum bauen. Das wollte ich gerne vermeiden. Offenbar bietet db4o hier Abhilfe, aber ein ähnliches System wo ich auch PHP anbinden kann wäre sehr nützlich 

EDIT: Ein bisschen Googlen zeigt: PHP ist vermutlich zu viel verlangt ... Dann eben folgende Frage: Wie groß ist der Lernaufwand für db4o?


----------



## Gast2 (11. Mrz 2010)

JFreak hat gesagt.:


> Dann eben folgende Frage: Wie groß ist der Lernaufwand für db4o?



Nicht so groß. Ist eigentlich sehr einfach zu verstehen und die Tutorials sind sehr gut.


----------

