0Pricing
SQL Academy · Leçon

Modélisation : quand JSONB l’emporte sur la normalisation

Choisissez entre une colonne JSONB et une table distincte — attributs flexibles ou schémas stricts.

Modélisation : quand JSONB l’emporte sur la normalisation est une leçon SQL Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage SQL Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours SQL Academy comprend 4 leçons au total.

Le choix

Pour chaque donnée susceptible d’être stockée : une colonne ou une clé JSONB ? La réponse détermine la conception du schéma, les performances des requêtes et la facilité de maintenance.

Quand les colonnes sont préférables

Utilisez de vraies colonnes lorsque les données sont :

  • connues et stables
  • fréquemment interrogées avec des index
  • validées par des contraintes CHECK / FK
  • utilisées dans des rapports ou des jointures

Quand JSONB est préférable

Utilisez JSONB lorsque :

  • la structure varie selon la ligne (champs définis par le locataire, métadonnées de modules)
  • le schéma évolue rapidement (pour éviter les migrations)
  • les lectures et écritures de documents entiers sont la norme
  • vous stockez des charges utiles opaques (corps de requêtes webhook)

Le modèle hybride

Le meilleur des deux approches : des colonnes structurées pour le cœur stable et JSONB pour la partie variable :

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  data JSONB NOT NULL DEFAULT '{}'::JSONB
);

Le piège EAV

Le modèle classique « entité-attribut-valeur » — une table contenant des lignes (clé, valeur) — était autrefois le seul choix pour les données creuses. JSONB remplace EAV par une colonne de document :

-- Old EAV:
CREATE TABLE user_attrs (
  user_id BIGINT,
  attr TEXT,
  val TEXT
);

-- Modern:
ALTER TABLE users ADD COLUMN attrs JSONB NOT NULL DEFAULT '{}';

-- JSONB queries are faster and easier than the EAV joins.

Stratégie de migration

Ajouter une colonne à une table très sollicitée entraîne 5 minutes d’indisponibilité sur une grande table. Avec JSONB, ajouter un champ ne nécessite qu’une modification du code de l’application.

Contraintes sur JSONB

Ajoutez des contraintes CHECK pour imposer une structure minimale :

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type'),
  ADD CONSTRAINT type_is_string CHECK (jsonb_typeof(data->'type') = 'string');

Promouvoir les champs très sollicités

Si un champ JSONB est fréquemment interrogé, transformez-le en véritable colonne. Un script UPDATE, un nouvel index et une nouvelle colonne suffisent à accélérer son accès.

Opérations de modification de JSONB

Mettre à jour un seul champ :

UPDATE users
SET attrs = jsonb_set(attrs, '{plan}', '"pro"')
WHERE id = 1;

Ne stockez pas l’argent dans JSONB

Les valeurs financières nécessitent des types NUMERIC exacts et des contraintes. Utilisez toujours de vraies colonnes.

Quand JSONB devient pénalisant

Si vous extrayez et convertissez la même clé JSONB dans chaque requête, c’est le signe qu’elle devrait être une colonne. Le coût cumulé de (data->>'k')::INT sur des millions de lignes finit par devenir important.

Documentation du schéma

Les colonnes JSONB sont faciles à remplir, mais difficiles à documenter. Tenez à jour un schéma externe (JSON Schema, code de l’application) afin que vos collaborateurs sachent à quoi s’attendre.

Récapitulatif

JSONB est un outil puissant : utilisez-le pour les parties variables et de vraies colonnes pour le cœur stable. Transformez les champs très sollicités en colonnes lorsque des habitudes d’utilisation apparaissent.

Vérification rapide

Vous stockez des événements d’audit. Le type d’événement est toujours présent ; certains événements possèdent un tableau d’« acteurs » dont la structure varie. Comment le modéliseriez-vous ?

Questions Fréquemment Posées

La leçon « Modélisation : quand JSONB l’emporte sur la normalisation » est-elle gratuite ?

Oui — le texte complet de « Modélisation : quand JSONB l’emporte sur la normalisation » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours SQL Academy, passe à CoddyKit PRO. Le cours SQL Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Modélisation : quand JSONB l’emporte sur la normalisation » ?

Choisissez entre une colonne JSONB et une table distincte — attributs flexibles ou schémas stricts. Tu pratiques SQL Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer SQL Academy ?

Aucune expérience préalable n'est requise. SQL Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Modélisation : quand JSONB l’emporte sur la normalisation » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon SQL Academy ?

Oui. Chaque leçon SQL Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. JSONB ou JSON : quand utiliser chacun
  2. Opérateurs de chemin : -> ->> @>
  3. Indexer JSONB avec GIN
  4. Modélisation : quand JSONB l’emporte sur la normalisation
← Retour à SQL Academy