JSON (JavaScript Object Notation) — c’est un format de données super populaire pour échanger des infos entre systèmes. C’est léger, lisible par les humains et parfait pour représenter des données structurées comme des objets ou des tableaux.
PostgreSQL gère deux types de données pour bosser avec du JSON :
JSON: stocke les données comme une chaîne de caractères. C’est juste une représentation texte du JSON, sans optimisation interne.JSONB: représentation binaire du JSON. C’est plus efficace pour lire, filtrer et manipuler, car PostgreSQL parse le JSON à l’avance et optimise son stockage.
Pourquoi on choisit souvent JSONB ? Parce que :
- C’est plus rapide pour les requêtes grâce au stockage binaire.
- On peut l’indexer, ce qui est top pour de gros volumes de données.
- Il garde les clés triées et vire les doublons, ce qui simplifie le traitement.
Exemple de structure JSON :
{
"nom": "Alice",
"âge": 25,
"compétences": ["SQL", "PostgreSQL", "JSONB"]
}
Pourquoi JSONB est utile ?
Stockage de données semi-structurées. Dans la vraie vie, les données arrivent souvent sous forme d’objets complexes (genre des métadonnées, des paramètres, des profils utilisateurs). JSONB permet de les stocker sans devoir créer des centaines de tables et de relations.
Modélisation de données qui changent. Quand la structure d’un objet change souvent (genre on ajoute ou enlève des champs), JSONB permet de stocker ça de façon flexible.
Travailler avec des API. Beaucoup d’applis web envoient des données au format JSON. Au lieu de transformer les requêtes, tu peux les stocker “tel quel” et bosser direct dessus.
Créer une table avec JSONB
Allez, on passe à la pratique ! Imagine qu’on crée une base de données pour stocker des profils utilisateurs.
La colonne profile va contenir toutes les infos supplémentaires (genre âge, centres d’intérêt, contacts) au format JSON. C’est pratique si la structure des données varie d’un utilisateur à l’autre.
| id | nom - VARCHAR(100) | profil - JSONB |
|---|---|---|
| 1 | Alice | {"âge": 25, "compétences": ["SQL", "PostgreSQL", "JSONB"], "lieu": "New York"} |
| 2 | Bob | {"âge": 30, "intérêts": ["randonnée", "photographie"], "lieu": "Denver"} |
| 3 | Charlie | {"email": "charlie@example.com", "vérifié": true} |
| 4 | Diana | {"âge": 22, "compétences": ["Python"], "bio": "Passionné de données", "lieu": "Berlin"} |
| 5 | Eve | {"âge": 28, "compétences": [], "préférences": {"thème": "sombre", "notifications": false}} |
Tu peux insérer des données JSON comme des chaînes de caractères. PostgreSQL les convertit automatiquement en format JSONB.
Extraire des données depuis JSONB
Maintenant qu’on a des données, voyons comment les extraire. PostgreSQL propose plein d’opérateurs pour bosser avec JSONB.
Accéder à la valeur d’un champ
On utilise l’opérateur -> pour récupérer la valeur d’un champ :
-- Afficher l’âge de l’utilisateur
SELECT profile->'âge' AS âge FROM users;
Convertir la valeur en texte
L’opérateur ->> permet d’extraire la valeur comme une chaîne de caractères :
-- Afficher le lieu de résidence de l’utilisateur
SELECT profile->>'lieu' AS lieu FROM users;
Filtrer des données avec JSONB
La puissance de JSONB se révèle dans les requêtes avec filtrage. On peut utiliser les opérateurs SQL classiques pour bosser avec du JSON.
Exemple de filtrage par clé :
-- Trouver les utilisateurs qui habitent à "New York"
SELECT * FROM users
WHERE profile->>'lieu' = 'New York';
Recherche dans un tableau
JSON gère les tableaux, et PostgreSQL sait chercher dedans :
-- Trouver les utilisateurs qui maîtrisent SQL
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'compétences'));
La fonction jsonb_array_elements_text transforme les éléments du tableau en chaînes de caractères pour pouvoir les comparer.
Il y a aussi une version plus courte avec l’opérateur @> :
-- Trouver les utilisateurs qui maîtrisent SQL
SELECT * FROM users
WHERE profile->'compétences' @> '["SQL"]';
On parlera plus en détail des fonctions et des façons de bosser avec JSON plus tard, quand ce sera le bon moment :P
Résumé rapide : quand utiliser JSONB
JSONB est top pour :
- Stocker des structures de données complexes.
- Gérer des données venant d’API externes.
- Les situations où la structure de l’objet change.
Mais n’oublie pas, abuser de JSONB peut compliquer l’indexation et la gestion de ta base de données. Si la structure des données est stable, mieux vaut utiliser le modèle relationnel.
GO TO FULL VERSION