Tableaux, plages et types composites
AvancéPostgreSQL offre des types riches, à utiliser quand ils décrivent vraiment la donnée.
Tableaux#
CREATE TABLE articles (id bigint PRIMARY KEY, tags text[] NOT NULL DEFAULT '{}');
SELECT * FROM articles WHERE tags @> ARRAY['postgres']; -- contient
SELECT * FROM articles WHERE 'sql' = ANY (tags); -- l'un des éléments
SELECT unnest(tags) AS tag, count(*) FROM articles GROUP BY 1;
Un index GIN accélère @> et && (chevauchement) sur les tableaux.
Plages (range types)#
SELECT '[2026-09-01, 2026-10-01)'::daterange @> date '2026-09-24'; -- true
SELECT tstzrange(now(), now() + interval '2 hours')
&& tstzrange(now() + interval '1 hour', now() + interval '3 hours'); -- chevauchement : true
Elles se combinent avec EXCLUDE USING gist pour interdire les chevauchements (réservations).
Autres types utiles#
| Type | Usage |
|---|---|
inet, cidr | Adresses et réseaux IP, avec opérateurs de sous-réseau |
uuid | Identifiants globaux |
citext (extension) | Texte insensible à la casse (email) |
ltree (extension) | Chemins hiérarchiques |
hstore (extension) | Paires clé/valeur simples (le plus souvent remplacé par jsonb) |
Piège : un tableau qui contient des identifiants d'autres tables (
article.auteurs int[]) perd les clés étrangères : préférez une table de jointure dès que la relation est métier.