Le SQL classique ne permet pas de stocker plusieurs valeurs dans une seule cellule — le modèle relationnel exige une normalisation. Cependant, dans des tâches modernes, on rencontre souvent des champs de type "liste de tags", "échelle de notes", où il est pratique de manipuler un ensemble de valeurs au niveau d'une ligne individuelle. Certaines SGBD (PostgreSQL, Oracle) fournissent des types de données ARRAY ou des mécanismes similaires.
L'utilisation de tableaux viole le principe de normalisation, complique de nombreuses opérations (filtrage, mise à jour, indexation), et rend également le code moins portable entre les SGBD. Mais cela peut s'avérer utile ou inévitable — par exemple, pour le caching ou la recherche rapide dans de petites listes de valeurs.
CREATE TABLE products ( id SERIAL PRIMARY KEY, tags TEXT[] ); -- Insertion : INSERT INTO products(tags) VALUES (ARRAY['eco','sale','hot']); -- Recherche dans un tableau : SELECT * FROM products WHERE 'eco' = ANY (tags);
Caractéristiques clés :
Peut-on indexer des éléments individuels d'un tableau ?
Dans PostgreSQL — oui, via des index GIN/GIST :
CREATE INDEX idx_tags ON products USING GIN (tags);
Comment vérifier rapidement l'appartenance d'une valeur dans un tableau dans une colonne de chaîne via un séparateur ?
Le SQL standard ne le permet pas, on utilise une recherche par modèle :
SELECT * FROM users WHERE ',admin,' like concat('%,',role,',%');
Mais cette approche est peu fiable et lente.
Combien de valeurs peut-on stocker dans un tableau, et qu'est-ce qui limite cela ?
La limite dépend du SGBD — par exemple, dans PostgreSQL, il n'y a qu'une limite sur la taille de la chaîne (1–2 Mo).
Dans un projet e-commerce, les tags de produits ont été stockés sous forme de chaîne séparée par des virgules dans une seule colonne. La recherche rapide des produits par tag était très compliquée, des erreurs de filtrage se produisaient, et la répétition des tags arrivait à cause d'erreurs de parsing.
Avantages :
Inconvénients :
Dans PostgreSQL, pour de petites ensembles immuables (rôles d'utilisateur), on a utilisé ARRAY et un index GIN. Pour les plus grands — une table de rôles séparée.
Avantages :
Inconvénients :