Unser PostgreSQL-Maskottchen, ein blauer Elefant

PostgreSQL Fähigkeiten

näher betrachtet

 

Mit den SQL Anweisungen UNION, INTERSECT, EXCEPT können Mengenoperationen auf mehreren Tabellen ausgeführt werden. Zeilen aus verschiedenen Tabellen können mit UNION vereinigt werden, mit INTERSECT bilden Sie den Mengendurchschnitt der Zeilen und mit EXCEPT die Mengendifferenz. Voraussetzung ist, dass die Datentypen der Felder in allen Zeilen übereinstimmen.




Das sind Abfragen, die in eine andere Abfrage eingebettet sind. Sie ermöglichen komplexe Queries in einem Schritt. Subselects werden immer von innen nach außen abgearbeitet. Dabei werden die Zwischenergebnisse des Subselects an die jeweils übergeordnete Abfrage 'durchgereicht' und weiterverarbeitet.




Dabei werden SELECT-Kommandos über mehrere Tabellen ausgeführt. Grundlage von Joins ist das kartesische Produkt, das man sich als riesige Tabelle mit allen Spalten der verbundenen Tabellen vorstellen kann, die alle möglichen Kombinationen der Datensätze aller beteiligter Tabellen enthält. Diese Art des Verbundes nennt man CROSS-JOIN. In der Praxis werden meistens QUALIFIED JOINS benutzt, die eine Teilmenge des kartesischen Produkts beschreiben. Bei diesen Verbunden wird eine Beziehung der beteiligten Tabellen vorausgesetzt: Sie müssen mindestens ein Feld mit demselben Datentyp besitzen, über das der Verbund gebildet werden kann. Alle Verbund-Typen, die SQL99 spezifiziert, werden von PostgreSQL unterstützt.




Views (oder Sichten) sind gespeicherte SELECT-Abfragen. Sie werden bei jedem Aufruf neu generiert und reflektieren damit immer den aktuellen Zustand der darunterliegenden Tabellen. Views sind hervorragend geeignet, den Benutzern genau die Daten zur Verfügung zu stellen, die diese für ihre Arbeit brauchen. Zugriffsrechte für diese Views geben den Benutzern diese Daten frei und verbergen alle anderen Inhalte.




Trigger sind Prozeduren, die im Datenbankserver gespeichert sind und beim Auftreten eines bestimmten Ereignisses ausgeführt werden. So können Sie jedesmal, wenn zum Beispiel ein INSERT- oder UPDATE-Kommando für eine bestimmte Tabelle ausgeführt wird, automatisch eine Funktion auslösen. Diese Triggerfunktion kann ihrerseits andere Datenbankoperationen ausführen, wie Zugriffe 'mitschreiben' oder andere Tabellen modifizieren. Diese Funktionen können in allen in PostgreSQL unterstützten prozeduralen Sprachen geschrieben sein.




Mit Regeln kann das Verhalten von Abfragen modifiziert werden. Sie sind an die Tabelle und an das Ereignis gebunden, für das sie definiert wurden. Beispielsweise kann man bei Vorliegen bestimmter Bedingungen veranlassen, daß ein DELETE-Kommando in ein UPDATE-Kommando umformuliert wird oder man kann DELETE, INSERT, SELECT oder UPDATE-Kommandos ganz unterbinden.

Ein Kapitel über das PostgreSQL Rule-System aus dem Buch PostgreSQL Grundlagen, Praxis, Anwendungsentwicklung mit PHP gibt es hier als PDF zum Lesen oder Herunterladen.




Datenbanken modellieren einen Ausschnitt aus der realen Welt. Sie sollten so definiert und organisiert werden, dass sie diesen Ausschnitt mit seinen Eigenschaften und Beziehungen wiedergeben. Fremdschlüssel geben uns die Möglichkeit, Beziehungen zwischen Tabellen auf die Datenbankstruktur abzubilden. So entsteht ein Geflecht von hierarchisch geordneten Tabellen, das die realen Verhältnisse modelliert.

Ein Beispiel: Sie wollen Kunden- und Rechnungsdaten verwalten und haben für beide Entitäten je eine Tabelle. Als Primärschlüssel der Kundentabelle definieren Sie die kunden_id, die Sie in der Rechnungstabelle als Fremdschlüssel referenzieren.

CREATE TABLE kunden (
  kunden_id SERIAL PRIMARY KEY,
  name varchar(30),
  ...
);

CREATE TABLE rechnungen (
  rechng_id SERIAL PRIMARY KEY,
  rechn_date timestamp,
  ...
  kunde INTEGER NOT NULL,
  FOREIGN KEY (kunde) REFERENCES kunden (kunden_id)
);


Wenn Sie nun eine Rechnung für einen Kunden anlegen möchten, der noch nicht in der Kundentabelle existiert, meldet PostgreSQL eine Verletzung der referentiellen Integrität und die Aktion wird abgebrochen. Genauso können Sie keinen Kunden löschen, wenn es zu ihm noch eine Rechnung in der Rechnungstabelle gibt.

PostgreSQL übernimmt diese Kontrolle der Abhängigkeiten und bietet verschiedene Optionen, wie im Falle von Aktualisierungen oder Löschungen mit abhängigen Datensätzen verfahren werden soll. Zum Beispiel kann man sie ebenfalls löschen oder auf Standardwerte zurücksetzen.




Mit dem Begriff Transaktion wird eine Folge von SQL-Kommandos verstanden, die direkt hintereinander bearbeitet werden. Diese Anweisungen sind in einen Block eingeschlossen, der Beginn und Ende der Anweisungsfolge kennzeichnet. Die Abarbeitung einer Transaktion kann nicht von einerm anderen Prozess unterbrochen werden. Wenn alle Kommandos aus dem Block ausgeführt sind, werden die Änderungen in die Datenbank geschrieben. Dieser Schreibvorgang heisst COMMIT. Erst jetzt sind die Änderungen allen anderen Benutzern zugänglich. Bricht die Verarbeitung eines Transaktionsblocks wegen eines Fehlers ab, dann werden alle Modifikationen dieser Transaktion verworfen und es findet kein Schreibvorgang statt. Die Datenbank behält somit den ursprünglichen Zustand. In diesem Fall spricht man von einem ROLLBACK, weil die Änderungen der Transaktion wieder zurückgesetzt oder zurückgerollt werden. Transaktionen arbeiten nach dem Alles-oder-Nichts-Prinzip, sie werden entweder vollständig und fehlerfrei oder gar nicht ausgeführt.

Allgemein lassen sich die Forderungen, denen eine Transaktion genügen muss, durch das ACID-Prinzip beschreiben. Dies ist eine Abkürzung für die Begriffe:

  • Atomicity, Unteilbarkeit: Eine Transaktion ist eine unteilbare Verarbeitungseinheit. Sie wird entweder ganz oder gar nicht ausgeführt.
  • Consistency, Konsistenz: Eine Transaktion muss eine Datenbank von einem konsistenten Zustand wieder in einen konsistenten Zustand überführen.
  • Isolation, Isolierung: Eine Transaktion muss so ablaufen, als sei sie die einzige im System. Zwischenzustände von Transaktionen dürfen für andere Transaktionen nicht sichtbar sein.
  • Durability, Dauerhaftigkeit: Änderungen einer erfolgreich beendeten Transaktion sind dauerhaft gespeichert und überleben den nächsten Fehler.

PostgreSQL verwendet MVCC (Multi-Version Concurrency Control) als Strategie für das Transaktionsmanagement. Das bedeutet, dass jeder Transaktion eine eigene Kopie des Momentanzustands der Datenbank zur Verfügung gestellt wird. Auf diesem Schnappschuss kann sie ihre Modifikationen durchführen und muss dabei nie auf Zugriffe von andern Transaktionen warten. Am Ende der Transaktion werden die Änderungen mit einem COMMIT in die Datenbank geschrieben. Erst zum Zeitpunkt des Schreibens können Kollisionen mit anderen Transaktionen auftreten, wenn zwei Transaktionen konkurrierend denselben Datensatz beschreiben wollen. In diesem Fall werden, in Abhänngigkeit von der eingestellten Isolationsstufe fuer Transaktionen, entweder Wartezeiten erzwungen oder Transaktionen abgebrochen.

 
PostgreSQL powered