In SQL ist das Konzept der Fremdschlüssel ein wichtiges, das in allen professionellen Datenbanken der Branche zu finden ist. Die Kernidee besteht darin, zu verhindern, dass Ihre PostgreSQL-Datenbank inkonsistente Daten speichert, indem Einschränkungen erzwungen werden, die die Korrektheit Ihrer Tabellen sicherstellen (zumindest was die Beziehungen zwischen Objekten betrifft). Referenzielle Integrität ist daher eines der wichtigsten Konzepte, die jemals in der IT erfunden wurden.

Fremdschlüssel führen jedoch zu einigen Problemen, auf die Sie beim Schreiben von Anwendungen achten müssen. Wenn keine Fremdschlüssel vorhanden sind, können Sie Daten in beliebiger Reihenfolge in eine beliebige Tabelle einfügen. PostgreSQL ist das egal. Wenn jedoch ein Fremdschlüssel vorhanden ist, spielt die Reihenfolge eine Rolle (zumindest in einem typischen Szenario, aber dazu später mehr).

Fremdschlüssel und Bestellung

Um die Wichtigkeit der Bestellung zu zeigen, müssen wir zuerst ein Datenmodell erstellen:

Wir möchten Währungen, Produkte sowie Produktbeschreibungen speichern. Grundsätzlich handelt es sich um ein sehr einfaches Datenmodell. Mal sehen, ob wir zufällig in die Produkttabelle einfügen:

Logischerweise wird die erste EINFÜGUNG fehlschlagen, da die Währungsnummer 1 noch nicht existiert. Wenn wir EINFÜGEN möchten, müssen wir einen Nullwert (= unbekannte Währung) verwenden. Mit anderen Worten: Wir müssen zuerst die Währungstabelle füllen, dann Orte einfügen und so weiter. Die Reihenfolge spielt im Standardfall eine Rolle.

Bestimmen der richtigen Einfügereihenfolge für Fremdschlüssel

Wenn Sie ein vorhandenes Datenmodell verwenden müssen, kann es etwas schwierig sein, sich mit diesem Thema zu befassen. Das Auffüllen eines leeren Datenmodells kann etwas schwierig sein. Warum also nicht eine Abfrage schreiben, die uns die Reihenfolge angibt, in der wir Daten einfügen sollen?

Nun, hier ist diese magische Abfrage …

Die Abfrage ist nicht trivial zu lesen, aber ich habe mein Bestes getan, um sie ein wenig zu dokumentieren. Grundsätzlich enthalten die PostgreSQL-Systemtabellen alle Informationen, die wir benötigen, um die richtige Reihenfolge zu bestimmen. Hier ist die Ausgabe:

 table_name | level-----------------+------- t_currency | 1 t_location | 1 t_product | 2 t_product_desc | 3 t_product_stock | 3(5 rows)

Wie Sie sehen, hat uns die Abfrage die Tabellen in der gewünschten Reihenfolge korrekt angegeben. Zuerst müssen wir in alle Tabellen auf Ebene eins einfügen und so weiter. Wenn wir uns an diese Reihenfolge halten, ist die referenzielle Integrität immer gewährleistet (vorausgesetzt, die Daten sind korrekt).

Verwendung von „anfänglich aufgeschobenen“ Einschränkungen

In einigen Fällen kann die Einfügereihenfolge eine unangenehme Sache sein. Was wäre, wenn wir die Möglichkeit hätten, PostgreSQL anzuweisen, die Reihenfolge zu ignorieren und stattdessen die Integrität beim Commit zu überprüfen? Genau das macht „initially deferred“. So funktioniert es:

In diesem Fall können wir Daten in beliebiger Reihenfolge ändern. Solange die Integrität am Ende der Transaktion garantiert ist, ist PostgreSQL vollkommen in Ordnung. PostgreSQL verschiebt die Überprüfung der Einschränkungen und entlastet den Entwickler.

Endlich …

Wenn Sie mehr über Advanced SQL erfahren möchten, sollten Sie sich meinen Blog über einige erweiterte Fensterfunktionen (mit Krawatten) ansehen. Also zieh deine Krawatte an und lies, um mehr zu erfahren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.