</>
Plan du cours — 38/64

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#

TypeUsage
inet, cidrAdresses et réseaux IP, avec opérateurs de sous-réseau
uuidIdentifiants 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.