Es gibt einige Hauptgründe für die Verwendung der Tabellenvererbung in Postgres.
Nehmen wir an, wir haben einige Tabellen für Statistiken, die jeden Monat erstellt und gefüllt werden:
statistics
- statistics_2010_04 (inherits statistics)
- statistics_2010_05 (inherits statistics)
In diesem Beispiel haben wir 2.000.000 Zeilen in jeder Tabelle. Jede Tabelle hat eine CHECK-Einschränkung, um sicherzustellen, dass nur Daten für den passenden Monat darin gespeichert werden.
Was macht die Vererbung zu einer coolen Funktion - warum ist es cool, die Daten zu teilen?
- LEISTUNG: Bei der Auswahl von Daten wählen wir * AUS Statistiken aus, wobei das Datum zwischen x und Y liegt, und Postgres verwendet nur die Tabellen, in denen dies sinnvoll ist. Z.B. SELECT * FROM statistics WHERE Datum ZWISCHEN '2010-04-01' UND '2010-04-15' scannt nur die Tabelle statistics_2010_04, alle anderen Tabellen werden nicht berührt - schnell!
- Indexgröße: Wir haben keine große Fetttabelle mit einem großen Fettindex am Spaltendatum. Wir haben kleine Tabellen pro Monat mit kleinen Indizes - schnellere Lesevorgänge.
- Wartung: Wir können Vakuum voll, neu indizieren und Cluster für jede Monatstabelle ausführen, ohne alle anderen Daten zu sperren
Informationen zur korrekten Verwendung der Tabellenvererbung als Leistungssteigerung finden Sie im postgresql-Handbuch. Sie müssen für jede Tabelle CHECK-Einschränkungen festlegen, um der Datenbank mitzuteilen, auf welchem Schlüssel Ihre Daten aufgeteilt (partitioniert) werden.
Ich verwende die Tabellenvererbung stark, insbesondere wenn es darum geht, nach Monat gruppierte Protokolldaten zu speichern. Hinweis: Wenn Sie Daten speichern, die sich nie ändern (Protokolldaten), erstellen oder indizieren Sie mit CREATE INDEX ON () WITH (fillfactor = 100); Dies bedeutet, dass im Index kein Platz für Aktualisierungen reserviert wird - der Index ist auf der Festplatte kleiner.
UPDATE: Der Standardwert für Füllfaktoren ist 100 von http://www.postgresql.org/docs/9.1/static/sql-createtable.html :
Der Füllfaktor für eine Tabelle ist ein Prozentsatz zwischen 10 und 100. 100 (vollständige Verpackung) ist die Standardeinstellung
"Tabellenvererbung" bedeutet etwas anderes als "Klassenvererbung" und dient unterschiedlichen Zwecken.
Bei Postgres dreht sich alles um Datendefinitionen. Manchmal sehr komplexe Datendefinitionen. Bei OOP (im üblichen Java-farbigen Sinne) geht es darum, Verhaltensweisen Datendefinitionen in einer einzelnen Atomstruktur unterzuordnen. Der Zweck und die Bedeutung des Wortes "Vererbung" unterscheiden sich hier erheblich.
In OOP-Land könnte ich definieren (hier sehr locker mit Syntax und Semantik):
Die Tabellen hierfür könnten folgendermaßen aussehen:
CREATE TABLE animal (name varchar(20) PRIMARY KEY, metabolism boolean NOT NULL); CREATE TABLE mammal (hair_color varchar(20) REFERENCES hair_color(code) NOT NULL, PRIMARY KEY (name)) INHERITS (animal); CREATE TABLE human (alcoholic boolean NOT NULL, FOREIGN KEY (hair_color) REFERENCES hair_color(code), PRIMARY KEY (name)) INHERITS (mammal);
Aber wo sind die Verhaltensweisen? Sie passen nirgendwo hin. Dies ist nicht der Zweck von "Objekten", wie sie in der Datenbankwelt diskutiert werden, da sich Datenbanken mit Daten befassen, nicht mit Verfahrenscode. Sie könnten Funktionen in die Datenbank schreiben, um Berechnungen für Sie durchzuführen (oft eine sehr gute Idee, aber nicht wirklich etwas, das in diesen Fall passt), aber Funktionen sind nicht dasselbe wie Methoden - Methoden, wie sie in Form von OOP verstanden werden, von dem Sie sprechen etwa sind bewusst weniger flexibel.
Bei der Vererbung als schematisches Gerät ist noch eines zu beachten: Ab Postgres 9.2 gibt es keine Möglichkeit, eine Fremdschlüsseleinschränkung auf alle Mitglieder der Partitionen / Tabellenfamilie gleichzeitig zu verweisen. Sie können Schecks schreiben, um dies zu tun, oder es auf andere Weise umgehen, aber es ist keine integrierte Funktion (es kommt wirklich auf Probleme mit der komplexen Indizierung an, und niemand hat die Bits geschrieben, die erforderlich sind, um dies automatisch zu machen). Anstatt die Tabellenvererbung für diesen Zweck zu verwenden, besteht eine bessere Übereinstimmung in der Datenbank für die Objektvererbung häufig darin, schematische Erweiterungen für Tabellen vorzunehmen. Etwas wie das:
CREATE TABLE animal (name varchar(20) PRIMARY KEY, ilk varchar(20) REFERENCES animal_ilk NOT NULL, metabolism boolean NOT NULL); CREATE TABLE mammal (animal varchar(20) REFERENCES animal PRIMARY KEY, ilk varchar(20) REFERENCES mammal_ilk NOT NULL, hair_color varchar(20) REFERENCES hair_color(code) NOT NULL); CREATE TABLE human (mammal varchar(20) REFERENCES mammal PRIMARY KEY, alcoholic boolean NOT NULL);
Jetzt haben wir eine kanonische Referenz für die Instanz des Tieres, die wir zuverlässig als Fremdschlüsselreferenz verwenden können, und wir haben eine "ilk" -Spalte, die auf eine Tabelle mit xxx_ilk-Definitionen verweist, die auf die "nächste" Tabelle mit erweiterten Daten verweist ( oder zeigt an, dass es keine gibt, wenn der ilk der generische Typ selbst ist). Das Schreiben von Tabellenfunktionen, Ansichten usw. für diese Art von Schema ist so einfach, dass die meisten ORM-Frameworks genau dies im Hintergrund tun, wenn Sie auf die Klassenvererbung im OOP-Stil zurückgreifen, um Familien von Objekttypen zu erstellen.
quelle
mammal JOIN human
, nur weil es ärgerlich ist, jedes Mal einen Join zu schreiben. Aber nicht vermeiden verbindet . Joins sind das, was das R in RDBMS bringt. Wenn Sie Joins nicht mögen, sollten Sie einen anderen DB-Typ verwenden.Vererbung kann in einem OOP-Paradigma verwendet werden, solange Sie keine Fremdschlüssel in der übergeordneten Tabelle erstellen müssen. Wenn Sie beispielsweise ein Fahrzeug der abstrakten Klasse in einer Fahrzeugtabelle gespeichert haben und ein Tischauto, das davon erbt, werden alle Fahrzeuge in der Fahrzeugtabelle angezeigt, aber ein Fremdschlüssel aus einer Fahrertabelle auf der Fahrzeugtabelle stimmt nicht mit diesen überein Aufzeichnungen.
Die Vererbung kann auch als Partitionierungswerkzeug verwendet werden. Dies ist besonders nützlich, wenn Sie Tabellen haben, die für immer wachsen sollen (Protokolltabellen usw.).
quelle
Die Hauptverwendung der Vererbung ist die Partitionierung, manchmal jedoch auch in anderen Situationen. In meiner Datenbank gibt es viele Tabellen, die sich nur in einem Fremdschlüssel unterscheiden. Meine "abstrakte Klasse" -Tabelle "Bild" enthält eine "ID" (Primärschlüssel dafür muss in jeder Tabelle enthalten sein) und ein PostGIS 2.0-Raster. Vererbte Tabellen wie "site_map" oder "artefakt_drawing" haben eine Fremdschlüsselspalte (Textspalte "site_name" für "site_map", "Artefakt_id" Ganzzahlspalte für die Tabelle "artefakt_drawing" usw.) sowie Primär- und Fremdschlüsseleinschränkungen. Der Rest wird von der "Bild" -Tabelle geerbt. Ich vermute, dass ich in Zukunft möglicherweise allen Bildtabellen eine "Beschreibungs" -Spalte hinzufügen muss, sodass ich mir eine Menge Arbeit ersparen kann, ohne echte Probleme zu machen (na ja,
BEARBEITEN: eine weitere gute Verwendung: Bei der Behandlung von nicht registrierten Benutzern mit zwei Tabellen haben andere RDBMS Probleme mit der Behandlung der beiden Tabellen, aber in PostgreSQL ist dies einfach - fügen
ONLY
Sie einfach hinzu, wenn Sie nicht an Daten in der geerbten Tabelle "nicht registrierter Benutzer" interessiert sind .quelle
Die einzige Erfahrung, die ich mit geerbten Tabellen habe, ist das Partitionieren. Es funktioniert gut, aber es ist nicht der raffinierteste und benutzerfreundlichste Teil von PostgreSQL.
Letzte Woche hatten wir das gleiche OOP-Problem, aber wir hatten zu viele Probleme mit dem Ruhezustand (unser Setup gefiel uns nicht), sodass wir die Vererbung in PostgreSQL nicht verwendeten.
quelle
Ich verwende die Vererbung, wenn ich mehr als 1: 1-Beziehungen zwischen Tabellen habe.
Beispiel: Angenommen, Sie möchten Objektkartenpositionen mit den Attributen x, y, Drehung und Skalierung speichern.
Angenommen, Sie müssen verschiedene Arten von Objekten auf der Karte anzeigen, und jedes Objekt verfügt über eigene Kartenstandortparameter. Kartenparameter werden niemals wiederverwendet.
In diesen Fällen wäre die Tabellenvererbung sehr nützlich, um zu vermeiden, dass nicht normalisierte Tabellen verwaltet oder Standort-IDs erstellt und auf andere Tabellen verwiesen werden müssen.
quelle
Verwenden Sie es so wenig wie möglich. Und das bedeutet normalerweise nie, es läuft darauf hinaus, Strukturen zu schaffen, die gegen das relationale Modell verstoßen, indem beispielsweise das Informationsprinzip gebrochen und Taschen anstelle von Beziehungen geschaffen werden.
Verwenden Sie stattdessen die Tabellenpartitionierung in Kombination mit einer ordnungsgemäßen relationalen Modellierung, einschließlich weiterer Normalformen.
quelle