CodeGym /Cours /SQL SELF /Comparaison entre JSON et JSONB

Comparaison entre JSON et JSONB : avantages et inconvénients de chaque format

SQL SELF
Niveau 33 , Leçon 1
Disponible

Un des trucs principaux qui différencie JSON et JSONB, c’est leur format de stockage. JSON garde les données en mode texte, alors que JSONB les stocke en binaire. En gros, ça veut dire :

  • JSON garde les données exactement comme tu les as envoyées. Par exemple, si tu insères {"title": "PostgreSQL", "tags": ["database", "SQL"]}, ça sera stocké tel quel.
  • JSONB va d’abord parser l’objet JSON, virer les espaces inutiles, trier les clés, optimiser la structure et seulement après, il le stocke en binaire.

Grâce à cette optimisation, JSONB est plus rapide pour bosser avec les données, surtout quand tu fais des requêtes complexes de filtrage, recherche ou tri.

Performance en lecture et écriture

JSON et JSONB n’ont pas les mêmes perfs pour la lecture et l’écriture :

  • JSON s’écrit plus vite dans la base, vu qu’il n’y a pas besoin de parser avant de stocker. Mais la lecture et le traitement sont souvent plus lents, parce que PostgreSQL doit parser à chaque requête.
  • JSONB prend plus de temps à l’écriture, car il traite les données avant de les stocker. Mais la lecture, le filtrage et l’extraction sont bien plus rapides, donc JSONB est top pour l’analytique ou la recherche.

Petit exemple pour illustrer :

-- Création de tables avec JSON et JSONB
CREATE TABLE json_example (data JSON);
CREATE TABLE jsonb_example (data JSONB);

-- Insertion de données
INSERT INTO json_example VALUES ('{"clé": "valeur", "tags": ["json", "exemple"]}');
INSERT INTO jsonb_example VALUES ('{"clé": "valeur", "tags": ["jsonb", "exemple"]}');

-- Filtrage des données
SELECT * FROM json_example WHERE data->'clé' = '"valeur"';  -- Plus lent
SELECT * FROM jsonb_example WHERE data->'clé' = '"valeur"'; -- Plus rapide

Indexation des données

Un des gros avantages de JSONB, c’est l’indexation. PostgreSQL te permet de créer des index sur les colonnes JSONB avec le type d’index GIN. Ça accélère grave la recherche et le filtrage.

Exemple de création d’index :

-- Index sur une colonne JSONB
CREATE INDEX idx_jsonb_tags ON jsonb_example USING gin (data->'tags');

JSON, par contre, ne supporte pas l’indexation, donc il est moins adapté pour les recherches ou filtrages complexes.

Quand utiliser JSON et quand JSONB

JSON est le mieux quand :

  • Tu veux stocker les données telles quelles, sans modif.
  • Tu ne comptes pas faire beaucoup de requêtes de filtrage, recherche ou tri sur les données JSON.
  • Les données JSON servent surtout à être envoyées à d’autres systèmes ou clients sans modif (genre pour filer au frontend via une API).

Exemple :

-- Stockage de JSON sans analyse
CREATE TABLE api_responses (
    id SERIAL PRIMARY KEY,
    response JSON
);

-- Insertion des données telles qu’elles arrivent de l’API
INSERT INTO api_responses (response)
VALUES ('{"statut": "succès", "payload": {"id": 123, "nom": "John"}}');

JSONB est à privilégier si :

  • Tu comptes filtrer, chercher, grouper ou trier sur les valeurs à l’intérieur du JSON.
  • La perf d’accès aux données est plus importante que la perf d’écriture.
  • Tu veux utiliser l’indexation pour accélérer les opérations sur les données JSON.

Exemple :

-- Stockage de JSONB pour l’analyse et le travail avec des objets imbriqués
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    details JSONB
);

-- Insertion de données
INSERT INTO products (details)
VALUES ('{"nom": "Laptop", "prix": 1200, "tags": ["électronique", "ordinateurs"]}');

-- Recherche de produits avec le tag "électronique"
SELECT * FROM products
WHERE details @> '{"tags": ["électronique"]}';

Tu verras plus sur les opérateurs @> et --> dans les prochains cours :P

Exemples de manip avec JSON et JSONB

On va créer deux tables : une avec une colonne JSON, l’autre avec JSONB :

CREATE TABLE json_table (
    id SERIAL PRIMARY KEY,
    data JSON
);

CREATE TABLE jsonb_table (
    id SERIAL PRIMARY KEY,
    data JSONB
);

L’insertion de données est la même pour les deux :

INSERT INTO json_table (data)
VALUES ('{"clé": "valeur", "tags": ["json", "exemple"]}');

INSERT INTO jsonb_table (data)
VALUES ('{"clé": "valeur", "tags": ["jsonb", "exemple"]}');

Maintenant, on va extraire les lignes où la clé clé vaut valeur :

-- Pour JSON
SELECT * FROM json_table
WHERE data->>'clé' = 'valeur';

-- Pour JSONB
SELECT * FROM jsonb_table
WHERE data->>'clé' = 'valeur';

Pour des petits volumes de données, la différence de perf sera quasi invisible. Mais si tu bosses avec des millions de lignes, JSONB sera bien meilleur, surtout si tu crées un index :

CREATE INDEX idx_jsonb_clé ON jsonb_table USING gin ((data->>'clé'));

Travailler avec des objets imbriqués et des tableaux est aussi plus efficace avec JSONB :

-- Extraction d’une valeur depuis un tableau
SELECT data->'tags'->>0 AS premier_tag 
FROM jsonb_table;

Avantages et inconvénients

Caractéristique JSON JSONB
Stockage des données Stocke les données en texte brut Stocke en binaire, trie les clés
Performance à l’écriture Plus rapide, car stocké "tel quel" Plus lent à cause du parsing préalable
Performance à la lecture Plus lent, car il faut parser à chaque requête Plus rapide, car optimisé pour la lecture
Indexation Non supportée Supportée (index GIN, BTREE)
Filtrage Lent Rapide
Support des opérations Limité Étendu

Le choix entre JSON et JSONB dépend de ce que tu veux faire. Si tu veux juste stocker des données en texte sans modif, prends JSON. Mais si tu comptes bosser à fond avec les données dans les colonnes, faire du filtrage, de la recherche ou du groupement, JSONB sera plus performant et plus pratique.

Pour les applis complexes où les données JSON servent pas juste de “stockage”, mais sont utilisées pour de l’analytique, JSONB est carrément indispensable. Donc si t’hésites — prends JSONB. Peut-être que ton futur “requête la plus rapide de ta vie” te dira merci !

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION