it-swarm.com.de

Wenn der Primärschlüssel auch der Fremdschlüssel ist, in Postgres

In Postgres 12 verfolge ich Fotos. Jeder ist groß, ungefähr 6 bis 8 Megas. Zum schnellen Durchsuchen speichere ich ein Miniaturbild zusammen mit dem vollständigen Bild. Sowohl Voll- als auch Miniaturansicht sind Spalten vom Typ BYTEA.

Aus Gründen der Leistung möchte ich vermeiden, das vollständige Bild zu laden, wenn nur die Miniaturansicht benötigt wird. Soweit ich weiß, werden beim Zugriff auf eine Zeile alle BYTEA-Feldwerte in den Speicher geladen. Wenn Sie dem Benutzer eine Liste mit Miniaturansichten anzeigen, werden zwangsläufig die vollständigen Fotos auf den Server geladen, auch wenn dies in der Abfrage nicht explizit angefordert wird.

Also werde ich diese Fototabelle in zwei Teile teilen, die Miniaturansicht auf dem Haupttisch speichern und die Miniaturansicht in einer separaten untergeordneten Tabelle in einer Eins-zu-Eins-Tabelle speichern.

In einem solchen Szenario trägt die untergeordnete Vollfoto-Tabelle die ID der übergeordneten Miniaturbildzeile als Fremdschlüssel. Diese Fremdschlüsselspalte könnte logischerweise auch als Primärschlüssel dienen.

Kann ich diese eine Spalte eines Kindes sowohl als Fremdschlüssel als auch als Primärschlüssel festlegen? Wenn ja, sind einige Vorbehalte zu beachten?

4
Basil Bourque

Primärschlüssel & Fremdschlüssel

Kann ich diese eine Spalte eines Kindes sowohl als Fremdschlüssel als auch als Primärschlüssel festlegen?

Ja absolut:

create table photo 
(
  id integer primary key, 
  ... other columns ...
);

create table thumbnail 
(
  id integer primary key references photo, 
  ... other columns ...
);

TOAST

bytea Spalten werden außerhalb der normalen Spaltendaten (in sogenannten "Toasttabellen" ) gespeichert und nur abgerufen, wenn Sie sie in die SELECT-Liste aufnehmen.

Zitat aus dem Handbuch

Die großen Werte von TOASTed-Attributen werden nur zum Zeitpunkt des Sendens der Ergebnismenge an den Client herausgezogen (sofern überhaupt ausgewählt).

Dies bedeutet nur, dass selbst wenn eine Abfrage zu einem Seq-Scan gezwungen wird, die Bytea-Spalten erst abgerufen werden, wenn die Zeilen identifiziert wurden, die zurückgesendet werden müssen. Wenn Ihre Abfrage einen seq-Scan für 1 Million Zeilen durchführt, aber nur 1 Zeile zurückgegeben wird, wird nur ein Bytea-Wert gelesen und an den Client gesendet.

Beachten Sie, dass die Miniaturansichten möglicherweise tatsächlich inline gespeichert werden (nicht in der Toasttabelle), wenn sie klein genug sind (TOASTing wird nur für Größen unter ca. 2 KB ausgelöst).

Die Spalten werden einzeln geröstet, sodass es kein Problem gibt, beide Bilder in einer einzigen Tabelle zu speichern. Nur das Bild, das in der Liste SELECT angezeigt wird, wird entgast.

Wenn ein UPDATE die gerösteten Spalten nicht beeinflusst, müssen sie nicht neu geschrieben werden.

1
Laurenz Albe