Hoy tenemos la tarea de entender más a fondo los arrays y también compararlos más en detalle con JSONB, ver sus puntos fuertes y débiles y elegir las mejores prácticas para usarlos en tareas reales.
Arrays vs JSONB: mini-tortugas de datos vs flexibilidad en una cajita
Ya sabes bien que en los arrays de PostgreSQL puedes guardar valores de un solo tipo de dato: un array de números, de strings o de fechas. Por ejemplo: una lista de notas de un estudiante, donde todos los elementos son números.
-- Tabla con estudiantes y sus notas
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT,
grades INTEGER[] -- array de notas
);
JSONB, a diferencia del array, es guardar datos en forma de estructura JSON. Es muy parecido a un objeto de JavaScript, pero con la ventaja de parseo rápido e indexación. En JSONB puedes guardar tanto listas ordenadas como objetos con claves y valores.
-- Tabla con estudiantes y varios datos sobre ellos
CREATE TABLE students_details (
id SERIAL PRIMARY KEY,
name TEXT,
details JSONB -- estructura JSON flexible
);
Ejemplo de datos en JSONB:
{
"grades": [90, 82, 77],
"address": {
"city": "Berlin",
"zip": "352912"
}
}
Así que, los arrays son una forma sencilla de trabajar con listas de valores, mientras que JSONB te da muchas más posibilidades para datos complejos.
Diferencias principales entre arrays y JSONB
| Característica | Arrays | JSONB |
|---|---|---|
| Tipo de estructura | Estructura de datos lineal | Estructura de datos jerárquica |
| Tipos de elementos | Solo un tipo de dato | Diferentes tipos de datos |
| Tamaño de la estructura | Fijo (lineal) | Flexible, puede incluir listas y objetos |
| Velocidad de acceso | Alta con datos fijos | Más lenta en búsquedas complejas |
| Indexación | Soporta bien la indexación | Requiere indexación tipo GIN |
| Aplicación | Lista simple o array de valores | Datos complejos: objetos/listas anidados |
Ahora vamos a ver cómo funciona todo esto en la práctica.
¿Cuándo usar arrays?
Supón que tienes una base de datos con libros, donde cada libro puede pertenecer a varios géneros. Aquí un array es una buena opción.
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title TEXT,
genres TEXT[] -- array de géneros
);
-- Ejemplo de insertar un libro con varios géneros
INSERT INTO books (title, genres)
VALUES ('1984', ARRAY['Dystopia', 'Political Fiction', 'Science Fiction']);
Los arrays molan si tienes claro que:
- tus datos se pueden guardar estrictamente como una lista,
- las listas serán pequeñas y de un solo tipo (por ejemplo, strings o números),
- solo necesitas guardar y sacar listas (sin operaciones complicadas).
Ventajas de los arrays
- Sencillez para guardar datos del mismo tipo.
- Perfectos para listas pequeñas como tags, categorías o notas.
¿Cuándo usar JSONB?
Ahora imagina que quieres guardar datos más complejos sobre los libros, incluyendo géneros, ISBN y rating. Aquí los arrays ya no valen — es el momento de JSONB.
CREATE TABLE books_details (
id SERIAL PRIMARY KEY,
title TEXT,
details JSONB -- detalles del libro en JSONB
);
-- Ejemplo de insertar info compleja sobre un libro
INSERT INTO books_details (title, details)
VALUES (
'1984',
'{"genres": ["Dystopia", "Political Fiction", "Science Fiction"],
"isbn": "9780451524935",
"rating": 8.9}'
);
JSONB mola si necesitas:
- guardar datos complejos o de diferentes tipos (números, strings, listas, objetos),
- añadir parámetros dinámicamente sin cambiar la estructura de la tabla,
- guardar datos anidados (por ejemplo, direcciones, características, configuraciones).
Ventajas de JSONB
- Mucha flexibilidad. Puedes añadir nuevas claves y valores sin cambiar la estructura de la tabla.
- Perfecto para guardar datos complejos, como respuestas JSON de una API.
Elegir entre arrays y JSONB
Si solo necesitas guardar listas de datos del mismo tipo — usa arrays. Por ejemplo:
-- Guardar IDs de participantes de eventos
CREATE TABLE events (
id SERIAL PRIMARY KEY,
participant_ids INTEGER[]
);
Si los datos son variados o complejos — mejor usa JSONB. Por ejemplo:
-- Guardar info de clientes con direcciones
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
info JSONB
);
Para indexar, arrays y JSONB tienen enfoques distintos. Para arrays se suele usar índices GIN, y para JSONB — GIN y BTREE, según la estructura de los datos.
Rendimiento
Los arrays se procesan más rápido en búsquedas típicas. JSONB es un poco más lento, pero gana en flexibilidad. Si solo quieres buscar elementos (por ejemplo, géneros o IDs), los arrays serán más rápidos:
-- Usar arrays con índice GIN
CREATE INDEX idx_genres ON books USING GIN(genres);
-- Filtrar libros por género
SELECT * FROM books WHERE genres @> ARRAY['Science Fiction'];
Comprobar existencia de datos
En JSONB tienes más opciones para filtrar por claves:
-- Comprobar si existe la clave "genres"
SELECT * FROM books_details WHERE details ? 'genres';
-- Comprobar si hay un elemento en la lista
SELECT * FROM books_details WHERE details->'genres' ?| ARRAY['Fantasy', 'Dystopia'];
Con arrays puedes buscar valores directamente:
-- Comprobar si hay un elemento en el array
SELECT * FROM books WHERE genres @> ARRAY['Fantasy'];
Flexibilidad de estructuras
JSONB es imprescindible si los datos tienen estructuras anidadas complejas:
{
"genres": ["Fantasy", "Adventure"],
"ratings": {"goodreads": 8.5, "amazon": 4.7}
}
Con arrays esto sería imposible sin normalizar o añadir más campos.
En resumen, arrays y JSONB no son rivales, sino herramientas para tareas distintas. Si los datos son como una lista — usa arrays. Si tienes datos complejos, anidados o variados — ve a por JSONB sin miedo. ¡Lo importante es no olvidar el rendimiento y la indexación!
GO TO FULL VERSION