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:
- 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.
- 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.
- 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:
- API y microservicios. JSON es el formato estándar para pasar datos en RESTful API. PostgreSQL lo soporta tanto para guardar como para procesar.
- Integración de datos. Si tu base de datos recibe datos de distintos sistemas, trabajar con JSONB es mucho más cómodo.
- Gestión de estructuras complejas. Por ejemplo, JSONB va genial para guardar datos de formularios, configuraciones de usuario o metadatos corporativos.
GO TO FULL VERSION