Hoje a missão é entender melhor arrays e também comparar eles com JSONB, ver os pontos fortes e fracos de cada um e sacar as melhores práticas pra usar eles na vida real.
Arrays vs JSONB: mini-tartarugas de dados vs flexibilidade na caixinha
Você já manja que nos arrays do PostgreSQL dá pra guardar valores de um único tipo de dado: array de números, strings ou datas. Exemplo: lista de notas de um estudante, onde tudo é número.
-- Tabela com estudantes e suas notas
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name TEXT,
grades INTEGER[] -- array de notas
);
JSONB, diferente do array, é tipo guardar dados em formato de estrutura JSON. Parece muito com aquele objeto do JavaScript que todo mundo conhece, mas com a vantagem de parse rápido e indexação. No JSONB dá pra guardar listas ordenadas e também objetos com chave e valor.
-- Tabela com estudantes e vários dados sobre eles
CREATE TABLE students_details (
id SERIAL PRIMARY KEY,
name TEXT,
details JSONB -- estrutura JSON flexível
);
Exemplo de dados em JSONB:
{
"grades": [90, 82, 77],
"address": {
"city": "Berlin",
"zip": "352912"
}
}
Então, arrays são um jeito simples de lidar com listas de valores, enquanto JSONB te dá muito mais possibilidades pra dados mais complexos.
Principais diferenças entre arrays e JSONB
| Característica | Arrays | JSONB |
|---|---|---|
| Tipo de estrutura | Estrutura de dados linear | Estrutura de dados hierárquica |
| Tipos de elementos | Apenas um tipo de dado | Vários tipos de dados |
| Tamanho da estrutura | Fixo (linear) | Flexível, pode ter listas e objetos |
| Velocidade de acesso | Alta quando os dados são fixos | Mais lenta em buscas complexas |
| Indexação | Suporta indexação de boa | Precisa de índice tipo GIN |
| Uso | Lista simples ou array de valores | Dados complexos: objetos/listas aninhados |
Bora ver como isso tudo funciona na prática.
Quando usar arrays?
Imagina que temos um banco de dados de livros, onde cada livro pode ter vários gêneros. Array aqui é uma escolha massa.
CREATE TABLE books (
id SERIAL PRIMARY KEY,
title TEXT,
genres TEXT[] -- array de gêneros
);
-- Exemplo de inserir um livro com vários gêneros
INSERT INTO books (title, genres)
VALUES ('1984', ARRAY['Distopia', 'Ficção Política', 'Ficção Científica']);
Arrays são bons se você tem certeza que:
- seus dados podem ser guardados certinho como lista,
- as listas vão ser pequenas e de um tipo só (tipo strings ou números),
- você só precisa guardar e buscar listas (sem muita firula).
Vantagens dos arrays
- Fácil de guardar dados do mesmo tipo.
- Ótimo pra listas pequenas, tipo tags, categorias ou notas.
Quando usar JSONB?
Agora pensa que você quer guardar dados mais complexos sobre livros, tipo gêneros, ISBN e nota. Aqui array já não serve — é hora do JSONB.
CREATE TABLE books_details (
id SERIAL PRIMARY KEY,
title TEXT,
details JSONB -- detalhes do livro em JSONB
);
-- Exemplo de inserir info complexa de um livro
INSERT INTO books_details (title, details)
VALUES (
'1984',
'{"genres": ["Distopia", "Ficção Política", "Ficção Científica"],
"isbn": "9780451524935",
"rating": 8.9}'
);
JSONB é top se você precisa:
- guardar dados complexos ou variados (números, strings, listas, objetos),
- adicionar parâmetros dinamicamente sem mudar a estrutura da tabela,
- guardar dados aninhados (tipo endereços, características, configs).
Vantagens do JSONB
- Muita flexibilidade. Dá pra adicionar novas chaves e valores sem mexer na tabela.
- Perfeito pra guardar dados complexos, tipo resposta de API em JSON.
Escolhendo entre arrays e JSONB
Se precisa guardar só listas de dados do mesmo tipo — vai de array. Por exemplo:
-- Guardando IDs de participantes de eventos
CREATE TABLE events (
id SERIAL PRIMARY KEY,
participant_ids INTEGER[]
);
Se os dados são variados ou complexos — melhor usar JSONB. Por exemplo:
-- Guardando info de clientes com endereços
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
info JSONB
);
Pra indexação, arrays e JSONB têm jeitos diferentes. Pra arrays geralmente se usa índice GIN, e pra JSONB — GIN e BTREE, depende da estrutura dos dados.
Performance
Arrays são mais rápidos pra buscas simples. JSONB é um pouco mais lento, mas ganha na flexibilidade. Se você só quer buscar elementos (tipo gêneros ou IDs), arrays são mais rápidos:
-- Usando arrays com índice GIN
CREATE INDEX idx_genres ON books USING GIN(genres);
-- Filtrando livros por gênero
SELECT * FROM books WHERE genres @> ARRAY['Ficção Científica'];
Checando se tem dado
No JSONB dá pra filtrar por chave de vários jeitos:
-- Checando se existe a chave "genres"
SELECT * FROM books_details WHERE details ? 'genres';
-- Checando se tem elemento na lista
SELECT * FROM books_details WHERE details->'genres' ?| ARRAY['Fantasia', 'Distopia'];
Arrays deixam você buscar valores direto:
-- Checando se tem elemento no array
SELECT * FROM books WHERE genres @> ARRAY['Fantasia'];
Flexibilidade das estruturas
JSONB é imbatível se os dados têm estruturas aninhadas e complexas:
{
"genres": ["Fantasia", "Aventura"],
"ratings": {"goodreads": 8.5, "amazon": 4.7}
}
Com arrays isso não rola sem normalizar ou criar campos extras.
No fim das contas, arrays e JSONB não são rivais, mas ferramentas pra situações diferentes. Se os dados são tipo lista — vai de array. Se for complexo, aninhado ou variado — pode usar JSONB sem medo. O importante é lembrar da performance e da indexação!
GO TO FULL VERSION