Tu as sûrement déjà entendu parler des arrays. Dans différents langages de programmation, ça veut presque toujours dire la même chose. Mais y'a des nuances.
Un array dans PostgreSQL, c'est un type de données qui te permet de stocker un ensemble de valeurs du même type dans une seule colonne d'une table. Comme si tu mettais pas juste une valeur, mais carrément une "boîte" de données dans une cellule. Ça peut être une liste de nombres, de chaînes de caractères, de dates ou même des objets plus complexes.
Pour parler plus abstraitement, un array, c'est comme une boîte à outils. Au lieu de trimballer tout un tas de clés à la main (chaque clé comme une colonne/ligne séparée), tu les mets dans une mallette pratique (une seule colonne qui contient un array).
Deux façons de créer des arrays
Dans PostgreSQL, il y a deux syntaxes principales pour créer des arrays. C'est comme deux façons différentes de faire ta valise — le résultat est le même, mais la méthode change :
- Syntaxe avec les accolades
{}
C'est la façon la plus compacte et souvent utilisée :
-- Array de chaînes de caractères
'{"pomme", "banane", "cerise"}'
-- Array de nombres
'{1, 2, 3, 4, 5}'
-- Array de dates
'{"2023-01-01", "2023-01-02", "2023-01-03"}'
- Syntaxe avec le constructeur
ARRAY[]
Une façon plus explicite et lisible :
-- Array de chaînes de caractères
ARRAY['pomme', 'banane', 'cerise']
-- Array de nombres
ARRAY[1, 2, 3, 4, 5]
-- Array de dates
ARRAY['2023-01-01'::DATE, '2023-01-02'::DATE, '2023-01-03'::DATE]
les deux syntaxes marchent pareil ! Le choix dépend de tes préférences et du contexte. C'est un peu comme choisir entre les boucles for et while dans d'autres langages — c'est équivalent niveau fonctionnalités, mais parfois l'un est plus pratique selon la situation.
Quand utiliser les arrays
Les arrays, c'est un super-pouvoir de PostgreSQL qui te permet de gérer des cas où c'est relou de créer des tables ou colonnes en plus. Ils sont top pour :
- Stocker des listes, tags ou catégories
Imagine qu'on crée une base de données pour une boutique en ligne. Chaque produit peut avoir plusieurs tags, par exemple :
- Pour un t-shirt, ça peut être :
["vêtements", "homme", "sport"]. - Pour des écouteurs :
["électronique", "sans fil", "gadgets"].
Avec les arrays, tu peux garder ces tags dans une seule colonne sans devoir créer une table séparée pour les tags, ça économise de la place et simplifie la structure des données.
-- Table des produits avec un array de tags
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
tags TEXT[] -- Array de chaînes pour les tags
);
-- Exemple de données
INSERT INTO products (name, tags)
VALUES
('T-shirt', ARRAY['vêtements', 'homme', 'sport']),
('Écouteurs', ARRAY['électronique', 'sans fil', 'gadgets']);
- Stocker une liste de commandes
Si tu bosses avec des commandes, un array peut t'aider à garder la liste des produits dans une commande :
-- Table des commandes avec un array d'IDs de produits
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT,
product_ids INTEGER[] -- Array d'identifiants de produits
);
-- Exemple de données
INSERT INTO orders (customer_name, product_ids)
VALUES
('Anna', ARRAY[1, 2, 3]),
('Otto', ARRAY[4, 5]);
Maintenant, chaque commande a la liste des produits achetés. Pratique, non ?
Configurations et préférences simples
Quand tu veux stocker des listes simples de paramètres ou de préférences utilisateur :
CREATE TABLE user_preferences ( user_id INTEGER PRIMARY KEY, notification_types TEXT[], allowed_days INTEGER[] -- jours de la semaine : 1-7 );
Comparer les arrays avec d'autres types de données
Faut bien piger que les arrays, c'est juste un outil de plus dans la boîte à outils PostgreSQL, et c'est pas toujours la meilleure solution. Par exemple, à la place des arrays, tu pourrais utiliser une table de relations (relation "many-to-many") ou le type de données JSON/JSONB.
Arrays vs JSONB
Les arrays sont pratiques quand tu sais exactement que tu vas stocker plusieurs valeurs du même type. C'est plus simple, plus rapide et ça prend moins de place.
JSONB est fait pour des structures plus complexes, genre si tu dois stocker des objets à structure flexible. Mais JSONB peut être plus galère à manipuler.
Exemple d'array et de JSONB pour le même jeu de données :
-- Array
ARRAY['vêtements', 'homme', 'sport']
-- JSONB
'["vêtements", "homme", "sport"]'::JSONB
Si tu dois souvent faire des trucs comme trier, filtrer ou indexer, les arrays seront le meilleur choix.
Exemple d'utilisation des arrays dans des cas réels
Imaginons : tu développes une appli pour gérer la présence à la fac. Chaque cours a la liste des étudiants présents, mais t'as pas besoin de créer une table séparée pour relier étudiants et cours. À la place, tu peux utiliser des arrays :
-- Table des cours avec un array d'étudiants
CREATE TABLE lectures (
id SERIAL PRIMARY KEY,
topic TEXT NOT NULL,
students INTEGER[] -- Array d'identifiants d'étudiants
);
-- Exemple de données
INSERT INTO lectures (topic, students)
VALUES
('Bases de données', ARRAY[101, 102, 103]),
('Algorithmes', ARRAY[104, 105]);
Maintenant tu peux facilement récupérer la liste des étudiants pour n'importe quel cours, et aussi ajouter ou retirer un étudiant de l'array.
Points importants à propos des arrays dans PostgreSQL
- Le type de données à l'intérieur d'un array doit être homogène. PostgreSQL ne te laisse pas mélanger, par exemple, des chaînes et des nombres dans le même array.
-- Ça marche
ARRAY[1, 2, 3] -- Array de nombres
-- Erreur : mélange de chaînes et de nombres
ARRAY['pomme', 42, 'cerise']
- L'indexation des éléments d'un array commence à 1, pas à 0. N'oublie pas si t'es habitué à des langages où ça commence à 0 (Python, JavaScript, C++ etc.).
- Support du NULL : les arrays peuvent contenir des valeurs NULL
- Multidimensionnalité : PostgreSQL gère les arrays multidimensionnels
GO TO FULL VERSION