CodeGym /Cursos /SQL SELF /Trabajando con JSON y JSONB

Trabajando con JSON y JSONB

SQL SELF
Nivel 33 , Lección 0
Disponible

A veces la estructura de los datos no encaja en las típicas filas y números. Por ejemplo, un usuario puede tener una lista de hobbies, configuraciones personalizadas de perfil o parámetros anidados de un pedido. Crear tablas separadas para todo esto es un rollo. Aquí es donde JSON te salva la vida.

PostgreSQL soporta dos formatos para trabajar con estos datos: JSON y JSONB. Los dos te dejan guardar datos estructurados en una sola columna, pero hay diferencias importantes entre ellos.

Vamos a ver cómo funciona esto, cuándo usar cada formato y qué posibilidades te abren.

¿Qué es JSON?

JSON (JavaScript Object Notation) es un formato de texto para intercambiar datos, creado para representar datos estructurados de forma cómoda. Es un formato que cualquier developer web conoce de sobra, y se puede describir como "fácil de leer para humanos" y "fácil de parsear para máquinas". En PostgreSQL este formato se usa para guardar y manejar datos estructurados.

Aquí tienes un ejemplo de objeto JSON:

{
  "name": "Alex Lin",
  "age": 25,
  "skills": ["SQL", "PostgreSQL", "JavaScript"],
  "address": {
    "city": "Berlin",
    "postal_code": "10115"
  }
}

Nota: JSON es solo texto, pero texto con reglas. Por ejemplo, los nombres de las claves siempre van entre comillas.

JSONB: Binary JSON

JSONB es "JSON binario", que también soporta PostgreSQL. A diferencia de JSON, JSONB se puede indexar y está optimizado para búsquedas y cambios rápidos. La diferencia principal entre JSON y JSONB en PostgreSQL es cómo se guardan:

  • JSON se guarda como una cadena de texto tal cual lo pasaste.
  • JSONB convierte los datos a un formato binario, que es más eficiente para la mayoría de operaciones.

JSONB te da cosas como filtrado, indexación, comparación de estructuras anidadas complejas.

Ventajas principales de JSONB

¿Por qué elegir JSONB en vez de JSON? Aquí tienes algunas razones:

  1. Acelera las búsquedas y filtrados

JSONB está pensado para sacar datos rápido. Por ejemplo, si tienes un array grande de objetos, JSONB te deja encontrar el elemento que buscas sin recorrerlo entero.

  1. Posibilidad de indexar

Con la indexación puedes buscar por claves y valores dentro de JSONB, haciendo las consultas rapidísimas. Si tratas JSON como texto (en formato JSON), no puedes indexar.

  1. Comodidad con datos anidados

JSONB va genial con estructuras anidadas. No tienes que crear mil tablas para datos jerárquicos — todo puede ir bien empaquetado.

¿Cuándo usar JSON y cuándo JSONB?

  • JSON es útil si quieres guardar los datos "tal cual" en texto. Por ejemplo, si te importa que los datos se guarden exactamente como los recibes o si solo necesitas un procesamiento mínimo.
  • JSONB te viene bien si vas a hacer muchas consultas, filtrados y modificaciones, o si necesitas indexar.

Ejemplos de objetos JSON

Vamos a ver algunos ejemplos de objetos JSON para que veas cómo pueden ser sus estructuras.

Objeto JSON sencillo.

Estructura clave-valor:

{
  "name": "Ekaterina",
  "age": 29
}

Arrays en JSON

JSON soporta arrays:

{
  "skills": ["Python", "SQL", "Data Analysis"]
}

Objetos anidados

JSON te deja crear composiciones para guardar datos complejos:

{
  "name": "Andrey",
  "contacts": {
    "email": "andrey@example.com",
    "phone": "+79012345678"
  }
}

Combinando arrays y objetos

Puedes mezclar arrays y objetos:

{
  "team": [
    {
      "name": "Elena",
      "role": "manager"
    },
    {
      "name": "Pavel",
      "role": "desarrollador"
    }
  ]
}

JSON y PostgreSQL

PostgreSQL soporta dos tipos de datos distintos para trabajar con JSON:

  • JSON: formato de texto.
  • JSONB: formato binario.

Crear una tabla con columnas JSON y JSONB

Vamos a ver cómo puedes usar JSON/JSONB en tablas de PostgreSQL. Por ejemplo, creamos una tabla para guardar info sobre empleados de una empresa:

-- Creamos una tabla con columnas JSON y JSONB
CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    details JSON,    -- JSON en texto
    profile JSONB    -- JSON binario
);

A primera vista parece que no hay diferencia entre estas columnas. Pero sí la hay: JSON es ideal para guardar datos sin cambios, y JSONB es mejor para filtrar y buscar.

-- Insertamos datos
INSERT INTO employees (name, details, profile)
VALUES
('Alex Lin', '{"age": 30, "city": "Tallinn"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "football"}'),
('Maya Novak', '{"age": 25, "city": "Riga"}', '{"skills": ["Python", "Machine Learning"], "hobby": "reading"}');

Extraer datos de JSONB

Puedes sacar datos de JSONB usando funciones especiales, que veremos en la próxima clase. Por ejemplo, para ver las skills de los empleados:

-- Extraer skills
SELECT name, profile->'skills' AS skills
FROM employees;

Resultado:

name skills
Alex Lin ["SQL", "PostgreSQL"]
Maya Novak ["Python", "Machine Learning"]

Uso de JSON en la vida real

JSON (y JSONB) se usa un montón en aplicaciones reales. Aquí tienes algunos ejemplos:

  1. API y microservicios. JSON es el formato estándar para pasar datos en RESTful API. PostgreSQL lo soporta tanto para guardar como para procesar.
  2. Integración de datos. Si tu base de datos recibe datos de distintos sistemas, trabajar con JSONB es mucho más cómodo.
  3. Gestión de estructuras complejas. Por ejemplo, JSONB va genial para guardar datos de formularios, configuraciones de usuario o metadatos corporativos.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION