Guru-Hinweise

### Primärschlüssel

Beim Design einer Tabelle sollte man stets im Blick behalten, auf welche Weise später auf sie zugegriffen wird. In den meisten Fällen wird ein eindeutiger Schlüsselbegriff erforderlich sein um eine spezifische Zeile jeweils eindeutig identifizieren zu können. Dieser Schlüsselbegriff sollte als Primärschlüssel erzeugt werden. Ein Primärschlüssel muss nicht unbedingt aus einer einzelnen Spalte bestehen; er kann soviel Spalten beinhalten wie nötig um eine Zeile eindeutig zu identifizieren. Wenn hierzu allerdings viele Spalten erforderlich sein sollten (Faustregel: mehr als 3) könnte es eine gute Idee sein eine zusätzliche Spalte mit einem handlichen Datentyp, z.b. serial oder bigserial, einzuführen, welche den eindeutigen Schlüssel enthält.

Nur in seltenen Ausnahmefällen macht das Erzeugen eines Primärschlüssels keinen Sinn. Das bedeutet, dass das Fehlen eines Primärschlüssels in einer Tabelle auf eine unvollständige Definition hinweist; darum kommt der Guru-Hinweis hoch wenn man eine Tabelle ohne Primärschlüssel anzulegen versucht.

Wenn man einen Blick auf die PostgreSQL-Systemtabellen wirft, stellt man fest dass keine von ihnen einen Primärschlüssel aufweist, also was soll das Ganze? Tatsächlich haben alle diese Tabellen eine oder zwei Spalten (typischerweise nur die OID), welche jede Zeile eindeutig identifiziert, welche die zweite Regel für einen Primärschlüssel, nicht NULL enthalten zu dürfen, befolgt, und einen Index für schnelleren Zugriff beinhaltet. Die Verwendung von OIDs hat historische Gründe, und ist nicht gerade erste Wahl wenn es um den Design von User-Tabellen geht. PostgreSQL benutzt diese um Rückwärtskompatibilität zu gewährleisten. Aus heutiger Sicht würde man vermutlich Primärschlüssel verwenden, eine dahingehende Änderung der Systemtabellen ist allerdings nicht zu erwarten.

Wie das Beispiel der Systemtabellen zeigt, kann das Ziel der Eindeutigkeit und des schnellen Zugriffs auch auf andere Weise als mit einem Primärschlüssel erreicht werden. Es ist allerdings sehr empfehlenswert, aus Gründen der Klarheit des Datenmodells stets Primärschlüssel zu verwenden.