Guru-Hinweise

### Fremdschlüssel abdeckende Indizes

Ein Fremdschlüssel koppelt zwei Tabellen auf logische Weise, und beschränkt Änderungen die auf sie angewendet werden können.

Es fängt mit einer Mastertabelle an, welche die Referenzierte Tabelle wird. Sie muß einen Primärschlüssel haben (streng genommen müssen die referenzierten Spalten nur nicht-NULL sein und mit einem eindeutigen Index versehen sein, aber es ist gute Praxis das über einen Primärschlüssel zu implementieren). Die Slave-Tabelle hängt von der Mastertabelle ab, in dem Sinne dass Spalten auf die der Fremdschlüssel definiert ist für jeden Wert passende Einträge in der Mastertabelle erfordert. Die Slave-Tabelle ist die referenzierende Tabelle des Fremdschlüssels.

Der Fremdschlüssel beschränkt allerdings nicht nur die referenzierende Tabelle, sondern auch die referenzierte. Die Geschmacksrichtung kann dabei zwischen RESTRICT, CASCADE und SET NULL variieren. Dies bedeutet, dass sobald eine Zeile in der referenzierten Tabelle geändert wird (Update oder Delete), alle referenzierenden Tabellen geprüft werden müssen ob die Operation gültig ist, und ob weitere Aktionen ausgelöst werden müssen; siehe hierzu auch die PostgreSQL-Dokumentation über Fremdschlüssel (Foreign Keys).

Dies bedeutet, dass Änderungen an einer bestimmten Zeile in der referenzierten Tabelle zusätzliche Lesezugriffe in allen referenzierenden Tabellen auslöst, mit den Fremdschlüssel als Zugriffsbegriff. In der Konsequenz sollten alle Designregeln für performanten Lesezugriff auch auf die Fremdschlüsselspalten angewendet werden. Für gute Zugriffsgeschwindigkeiten ist in der Regel ein Index empfehlenswert. PostgreSQL verlangt dies nicht unbedingt, es liegt daher in der Verantwortung des Datenbankdesigners für das Anlegen eines passenden Index zu sorgen.

Zur Steigerung des Komforts und des allgemeinen Wohlbefindens bietet pgAdmin III eine Checkbox an, mit deren Hilfe auf einen passenden Index geprüft wird und dieser bei Bedarf angelegt wird soweit noch nicht vorhanden. Wie bei allen Indizes gibt es Fälle in denen Indizes die Gesamtperformance verringern können; in aller Regel ist ein Index zu wenig jedoch wesentlich schlimmer als einer zuviel.