Wenn Du in PostgreSQL arbeitest und mit der Herausforderung konfrontiert wirst, gemeinsame Attribute in mehreren Tabellen zu speichern, kann die Tabellenvererbung eine elegante Lösung bieten. Dieser Artikel erklärt Dir, was Tabellenvererbung ist, welche Vorteile und Einschränkungen sie hat und wie Du sie in Deiner eigenen Datenbank nutzen kannst.
Was ist Tabellenvererbung?
Tabellenvererbung in PostgreSQL ist ein Konzept, bei dem eine Tabelle (Elterntabelle) ihre Struktur und Constraints an andere Tabellen (Kindtabellen) weitergibt. So kannst Du eine Basistabelle mit gemeinsamen Spalten erstellen und verschiedene spezialisierte Tabellen davon erben lassen. Das macht Dein Datenmodell flexibler und wiederverwendbarer.
Ein einfaches Beispiel
Stell Dir vor, Du möchtest eine Tabelle für verschiedene Arten von Entitäten erstellen, z. B. Personen
. Jede Person hat einen Namen, aber es gibt unterschiedliche Arten von Personen – etwa Mitarbeiter
und Kunden
, die jeweils zusätzliche Informationen benötigen. Mit Tabellenvererbung kannst Du eine gemeinsame Person
-Tabelle erstellen und dann spezialisierte Tabellen für Mitarbeiter
und Kunden
, die von dieser Basisstruktur erben.
CREATE TABLE person (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE mitarbeiter (
gehalt NUMERIC NOT NULL
) INHERITS (person);
CREATE TABLE kunde (
rabatt INT NOT NULL
) INHERITS (person);
In diesem Beispiel erben die Tabellen mitarbeiter
und kunde
die Spalten id
und name
von der Tabelle person
. Zusätzlich haben sie ihre eigenen spezifischen Spalten – gehalt
für mitarbeiter
und rabatt
für kunde
.
Vorteile der Tabellenvererbung
Die Vererbung in PostgreSQL bietet einige klare Vorteile:
1. Wiederverwendbarkeit und DRY-Prinzip
Das Prinzip „Don’t Repeat Yourself“ (DRY) gilt auch bei Datenbanken. Indem Du die gemeinsamen Felder in einer Basistabelle definierst, vermeidest Du redundante Datenstrukturen und erleichterst die Pflege Deines Datenmodells. Änderungen in der Elterntabelle werden automatisch auf die Kindtabellen angewendet.
2. Einfachere Abfragen
Eine große Stärke der Tabellenvererbung ist, dass Abfragen an die Elterntabelle automatisch auch Daten aus den Kindtabellen einbeziehen. Das ermöglicht es Dir, alle Daten aus den verschiedenen vererbenden Tabellen mit nur einer Abfrage abzurufen.
SELECT * FROM person;
Mit dieser Abfrage erhältst Du alle Einträge aus person
, mitarbeiter
und kunde
, da die Daten aus den Kindtabellen automatisch miteinbezogen werden.
3. Flexible Datenmodelle
Wenn Du Dein Datenmodell erweitern möchtest, kannst Du einfach neue Kindtabellen hinzufügen, die von der Elterntabelle erben. So kannst Du Dein Schema dynamisch an neue Anforderungen anpassen, ohne bestehende Tabellen zu ändern.
Einschränkungen der Tabellenvererbung
Trotz der vielen Vorteile gibt es auch einige Einschränkungen, die Du bei der Nutzung der Tabellenvererbung beachten solltest:
1. Keine automatische Fremdschlüssel-Vererbung
Fremdschlüssel-Beziehungen, die auf die Elterntabelle zeigen, werden nicht automatisch auf die Kindtabellen übertragen. Wenn Du zum Beispiel einen Fremdschlüssel auf person
definierst, wird er nicht automatisch für mitarbeiter
und kunde
gelten. Du musst Fremdschlüssel für jede Kindtabelle separat definieren.
2. Probleme mit UNIQUE
und PRIMARY KEY
Constraints
Wenn Du in der Elterntabelle einen UNIQUE
oder PRIMARY KEY
-Constraint definierst, gilt dieser nicht automatisch für die Kindtabellen. Das bedeutet, dass Du in jeder Kindtabelle dieselbe id
haben könntest, was zu Dateninkonsistenzen führen kann. Dieses Verhalten kann in bestimmten Szenarien problematisch sein, insbesondere wenn Eindeutigkeit in den Kindtabellen notwendig ist.
3. Keine automatischen Joins
PostgreSQL führt keine automatischen Joins zwischen Elterntabellen und Kindtabellen durch. Das bedeutet, dass Du in komplexeren Abfragen explizit darauf achten musst, wie Du Daten aus verschiedenen Tabellen kombinierst.
Ein praktisches Beispiel
Angenommen, Du hast eine Datenbank, in der Du verschiedene Arten von Nutzern speichern möchtest – Mitarbeiter
und Kunden
. Jeder Nutzer hat einen name
, aber die beiden Typen haben zusätzliche, unterschiedliche Informationen (z. B. gehalt
für Mitarbeiter und rabatt
für Kunden).
CREATE TABLE person (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE mitarbeiter (
gehalt NUMERIC NOT NULL
) INHERITS (person);
CREATE TABLE kunde (
rabatt INT NOT NULL
) INHERITS (person);
Nun kannst Du Daten sowohl in die Tabelle person
als auch in die vererbenden Tabellen mitarbeiter
und kunde
einfügen:
INSERT INTO mitarbeiter (name, gehalt) VALUES ('Max Mustermann', 50000);
INSERT INTO kunde (name, rabatt) VALUES ('Erika Mustermann', 10);
Wenn Du nun eine Abfrage auf die Tabelle person
ausführst:
SELECT * FROM person;
Wirst Du sowohl die Daten von Mitarbeiter
als auch von Kunden
sehen. Wenn Du jedoch nur die Daten von Mitarbeitern abfragen möchtest, kannst Du direkt auf die mitarbeiter
-Tabelle zugreifen:
SELECT * FROM mitarbeiter;
Fazit
Tabellenvererbung in PostgreSQL ist ein mächtiges Werkzeug, das Dir hilft, Dein Datenmodell sauber, flexibel und wiederverwendbar zu halten. Durch die Möglichkeit, gemeinsame Spalten und Constraints in einer Basistabelle zu definieren, kannst Du Redundanzen vermeiden und Dein Schema leichter pflegen. Es gibt jedoch einige Einschränkungen, insbesondere in Bezug auf Fremdschlüssel und Constraints, die Du bei der Entscheidung berücksichtigen solltest.
Wenn Du Deine Datenbankstruktur modular und flexibel gestalten möchtest, ist die Tabellenvererbung eine Überlegung wert. Es lohnt sich, dieses Werkzeug in Dein Arsenal der Datenmodellierungstechniken aufzunehmen.