web-dev-qa-db-fra.com

Lorsque la clé primaire est également la clé étrangère, dans Postgres

Dans Postgres 12, je fais le suivi des photos. Chacun est grand, environ 6 à 8 Mo chacun. Pour une navigation rapide, je stocke une image miniature avec l'image complète. Les colonnes pleine et miniature sont de type BYTEA.

Pour les performances, je veux éviter de charger l'image complète lorsque seule la vignette est nécessaire. Si je comprends bien, lors de l'accès à une ligne, toutes les valeurs du champ BYTEA seront chargées en mémoire. Ainsi, l'affichage d'une liste de miniatures à l'utilisateur chargera nécessairement les photos complètes sur le serveur même si cela n'est pas explicitement demandé dans la requête.

Je vais donc diviser ce tableau de photos en deux, en stockant la vignette sur le tableau principal et en stockant la vignette dans un tableau enfant séparé, dans un à un.

Dans un tel scénario, la table de photo complète enfant porte l'ID de sa ligne de miniature parent en tant que clé étrangère. Cette colonne de clé étrangère pourrait également servir logiquement de clé primaire.

Puis-je désigner cette colonne d'un enfant à la fois comme clé étrangère et également comme clé primaire? Si oui, y a-t-il des mises en garde à connaître?

4
Basil Bourque

Clé primaire et clé étrangère

Puis-je désigner cette colonne d'un enfant à la fois comme clé étrangère et également comme clé primaire?

Oui absolument:

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

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

PAIN GRILLÉ

Les colonnes bytea sont stockées en dehors des données de colonne normales (appelées "toast tables" ) et ne sont pas récupérées à moins que vous ne les incluiez dans la liste SELECT.

Citation du manuel

Les grandes valeurs des attributs TOASTed ne seront extraites (si elles sont sélectionnées) qu'au moment où l'ensemble de résultats est envoyé au client.

Cela signifie uniquement que même si une requête est forcée d'effectuer une analyse Seq, les colonnes de bytea ne sont pas récupérées jusqu'à ce que les lignes soient identifiées qui doivent être renvoyées. Ainsi, si votre requête effectue une analyse séquentielle sur 1 million de lignes mais qu'une seule ligne est renvoyée, une seule valeur de bytea est lue et envoyée au client.

Notez que les miniatures peuvent en fait être stockées en ligne (pas dans la table des toasts) si elles sont suffisamment petites (TOASTing n'est déclenché que pour les tailles inférieures à environ 2k)

4

Les colonnes sont grillées individuellement, il n'y a donc aucun problème à conserver les deux images dans une seule table. Seule l'image qui apparaît dans la liste SELECT sera détosée.

De plus, si un UPDATE n'affecte pas les colonnes grillées, elles n'auront pas à être réécrites.

1
Laurenz Albe