0Pricing
SQL Academy · Lección

Modelado: cuándo JSONB supera a la normalización

Decida entre una columna JSONB y una tabla independiente: atributos flexibles frente a esquemas estrictos.

Modelado: cuándo JSONB supera a la normalización es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.

La elección

Para cada dato que pueda almacenar: ¿columna o clave JSONB? La respuesta determina el diseño del esquema, el rendimiento de las consultas y la facilidad de mantenimiento.

Cuándo ganan las columnas

Utilice columnas reales cuando los datos sean:

  • Conocidos y estables
  • Consultados con frecuencia mediante índices
  • Validados mediante restricciones CHECK o FK
  • Utilizados en informes o combinaciones

Cuándo gana JSONB

Utilice JSONB cuando:

  • La estructura varíe según la fila (campos definidos por el inquilino, metadatos de plugins)
  • El esquema evolucione rápidamente (para evitar migraciones)
  • Las lecturas y escrituras del documento completo sean lo habitual
  • Almacene cargas opacas (cuerpos de webhooks)

El patrón híbrido

Lo mejor de ambos: columnas estructuradas para el núcleo estable y JSONB para la parte 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
);

La trampa de EAV

El modelo clásico de «entidad-atributo-valor», una tabla con filas de (clave, valor), solía ser la única opción para datos dispersos. JSONB sustituye EAV por una única columna de documento:

-- 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.

Estrategia de migración

Añadir una columna a una tabla con mucha actividad implica 5 minutos de inactividad en una tabla grande. Con JSONB, añadir un campo solo requiere cambiar el código de la aplicación.

Restricciones en JSONB

Añada restricciones CHECK para imponer una estructura mínima:

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

Promover los campos críticos

Si un campo JSONB se consulta con frecuencia, promuévalo a una columna real. Un script de UPDATE, un índice nuevo y una columna nueva harán que sea rápido.

Operaciones de modificación de JSONB

Actualice un único campo:

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

No almacene dinero en JSONB

Los valores financieros necesitan tipos NUMERIC exactos y restricciones. Utilice siempre columnas reales.

Cuándo JSONB perjudica el rendimiento

Si se encuentra extrayendo y convirtiendo la misma clave JSONB en cada consulta, es una señal de que debería ser una columna. El coste acumulado de (data->>'k')::INT en millones de filas acaba siendo considerable.

Documentación del esquema

Las columnas JSONB son fáciles de escribir, pero difíciles de documentar. Mantenga un esquema externo (JSON Schema, código de la aplicación) para que sus colaboradores sepan qué esperar.

Resumen

JSONB es una herramienta potente: utilícelo para las partes variables y columnas reales para el núcleo estable. Promueva los campos críticos cuando aparezcan patrones de uso.

Comprobación rápida

Está almacenando eventos de auditoría. El tipo de evento siempre está presente; algunos eventos tienen un array de "actors" cuya estructura varía. ¿Cómo lo modelaría?

Preguntas frecuentes

¿La lección «Modelado: cuándo JSONB supera a la normalización» es gratis?

Sí — el texto completo de «Modelado: cuándo JSONB supera a la normalización» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Modelado: cuándo JSONB supera a la normalización»?

Decida entre una columna JSONB y una tabla independiente: atributos flexibles frente a esquemas estrictos. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar SQL Academy?

No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Modelado: cuándo JSONB supera a la normalización»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de SQL Academy?

Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. JSONB frente a JSON: cuándo usar cada uno
  2. Operadores de rutas: -> ->> @>
  3. Indexación de JSONB con GIN
  4. Modelado: cuándo JSONB supera a la normalización
← Volver a SQL Academy