CodeGym /Cursos /SQL SELF /Comparação de Arrays e JSONB

Comparação de Arrays e JSONB

SQL SELF
Nível 36, Lição 0
Disponível

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!

2
Tarefa
SQL SELF, nível 36, lição 0
Bloqueado
Usando arrays para armazenar dados
Usando arrays para armazenar dados
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION