Clés primaires : identity, UUID ou clé naturelle ?
IntermédiaireLa clé primaire identifie chaque ligne de façon unique et stable ; son choix influence les index, les jointures et l'exposition dans l'API.
-- Entier auto-incrémenté (recommandé : identity, plutôt que serial)
CREATE TABLE commandes (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
...
);
-- UUID
CREATE TABLE sessions (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
...
);
| Option | Avantages | Inconvénients |
|---|---|---|
bigint identity | Compact (8 octets), index dense, ordre d'insertion | Devinable dans les URLs, génération centralisée |
uuid v4 (aléatoire) | Générable partout, non devinable | 16 octets, insertions dispersées dans l'index (mauvaise localité) |
uuid v7 (ordonné dans le temps) | Non devinable et insertions quasi séquentielles | Révèle l'heure de création ; fonction native uuidv7() depuis PostgreSQL 18, sinon extension ou génération côté application |
| Clé naturelle (email, code pays) | Sens métier | Peut changer, peut être ré-affectée : rarement une bonne clé primaire |
Astuce : une bonne pratique courante : clé primaire technique (
bigintidentity) plus contrainteUNIQUEsur la clé naturelle (
Piège :
serialest l'ancienne syntaxe ; les colonnesGENERATED ... AS IDENTITYsont standard SQL, etALWAYSempêche d'écrire une valeur par erreur.