CodeGym /Cursos /SQL SELF /Comparando JSON e JSONB: vant...

Comparando JSON e JSONB: vantagens e desvantagens de cada formato

SQL SELF
Nível 33 , Lição 1
Disponível

Uma das diferenças principais entre JSON e JSONB é o formato de armazenamento dos dados. JSON guarda os dados como texto, enquanto JSONB armazena em formato binário. Isso significa que:

  • JSON salva os dados do jeitinho que tu mandou. Por exemplo, se tu inserir a string {"title": "PostgreSQL", "tags": ["database", "SQL"]}, ela vai ser salva exatamente assim.
  • JSONB primeiro faz o parsing do objeto JSON, tira os espaços desnecessários, ordena as chaves, otimiza a estrutura e só depois salva em formato binário.

Essa otimização faz com que o JSONB trabalhe mais rápido com os dados, principalmente quando tu faz consultas mais complexas de filtro, busca e ordenação.

Performance de leitura e escrita

JSON e JSONB têm características diferentes quando o assunto é velocidade de leitura e escrita dos dados:

  • JSON é mais rápido pra gravar no banco, porque não precisa fazer parsing antes de salvar. Mas ler e processar esses dados costuma ser mais lento, já que o PostgreSQL precisa fazer o parsing na hora da consulta.
  • JSONB demora mais pra gravar, porque os dados passam por um processamento antes de serem salvos. Mas a leitura, filtragem e extração de valores é bem mais rápida, o que faz do JSONB a melhor escolha pra tarefas analíticas ou de busca.

Um exemplo pra ficar mais claro:

-- Criando tabelas com JSON e JSONB
CREATE TABLE json_example (data JSON);
CREATE TABLE jsonb_example (data JSONB);

-- Inserindo dados
INSERT INTO json_example VALUES ('{"key": "valor", "tags": ["json", "exemplo"]}');
INSERT INTO jsonb_example VALUES ('{"key": "valor", "tags": ["jsonb", "exemplo"]}');

-- Filtrando dados
SELECT * FROM json_example WHERE data->'key' = '"valor"';  -- Mais lento
SELECT * FROM jsonb_example WHERE data->'key' = '"valor"'; -- Mais rápido

Indexação dos dados

Uma das maiores vantagens do JSONB é o suporte à indexação. O PostgreSQL permite criar índices em colunas JSONB usando o tipo de índice GIN. Isso acelera muito as buscas e filtragens.

Exemplo de criação de índice:

-- Índice em coluna JSONB
CREATE INDEX idx_jsonb_tags ON jsonb_example USING gin (data->'tags');

Já o JSON não suporta indexação, o que deixa ele menos interessante pra operações de busca e filtro mais pesadas.

Quando usar JSON e quando usar JSONB

JSON é melhor pra situações em que:

  • Tu precisa guardar os dados exatamente como eles vieram, sem mexer em nada.
  • Tu não pretende fazer muitas consultas de filtro, busca ou ordenação nesses dados JSON.
  • Os dados JSON vão ser usados principalmente pra enviar pra outros sistemas ou clientes, sem alteração (tipo mandar pro frontend via API).

Exemplo:

-- Guardando JSON sem analisar
CREATE TABLE api_responses (
    id SERIAL PRIMARY KEY,
    response JSON
);

-- Inserindo dados do jeito que vieram da API
INSERT INTO api_responses (response)
VALUES ('{"status": "sucesso", "payload": {"id": 123, "name": "João"}}');

JSONB é a escolha se:

  • Tu vai filtrar, buscar, agrupar ou ordenar os dados pelos valores dentro do JSON.
  • A performance de leitura é mais importante que a de escrita.
  • Tu quer usar indexação pra acelerar as operações com dados JSON.

Exemplo:

-- Guardando JSONB pra análise e trabalhar com objetos aninhados
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    details JSONB
);

-- Inserindo dados
INSERT INTO products (details)
VALUES ('{"name": "Notebook", "price": 1200, "tags": ["eletrônicos", "computadores"]}');

-- Buscando produtos com a tag "eletrônicos"
SELECT * FROM products
WHERE details @> '{"tags": ["eletrônicos"]}';

Tu vai aprender mais sobre o operador @> e --> nas próximas aulas :P

Exemplos de uso de JSON e JSONB

Vamos criar duas tabelas: uma com coluna JSON, outra com JSONB:

CREATE TABLE json_table (
    id SERIAL PRIMARY KEY,
    data JSON
);

CREATE TABLE jsonb_table (
    id SERIAL PRIMARY KEY,
    data JSONB
);

A inserção de dados é igual pras duas tabelas:

INSERT INTO json_table (data)
VALUES ('{"key": "valor", "tags": ["json", "exemplo"]}');

INSERT INTO jsonb_table (data)
VALUES ('{"key": "valor", "tags": ["jsonb", "exemplo"]}');

Agora vamos extrair os dados onde a chave key tem o valor valor:

-- Pra JSON
SELECT * FROM json_table
WHERE data->>'key' = 'valor';

-- Pra JSONB
SELECT * FROM jsonb_table
WHERE data->>'key' = 'valor';

Pra poucos dados, a diferença de performance quase não aparece. Mas se tu trabalhar com milhões de linhas, o JSONB vai ser bem mais rápido, principalmente se tu criar um índice:

CREATE INDEX idx_jsonb_key ON jsonb_table USING gin ((data->>'key'));

Trabalhar com objetos aninhados e arrays também é mais eficiente no JSONB:

-- Extraindo valor de um array
SELECT data->'tags'->>0 AS primeira_tag 
FROM jsonb_table;

Vantagens e desvantagens

Característica JSON JSONB
Armazenamento dos dados Guarda os dados em formato texto original Guarda os dados em formato binário, com as chaves ordenadas
Performance de escrita Mais rápido, porque salva "como está" Mais lento por causa do parsing prévio
Performance de leitura Mais lento, porque precisa fazer parsing na hora da consulta Mais rápido, porque os dados já estão otimizados pra leitura
Indexação Não suporta Suporta (índices GIN, BTREE)
Filtragem Lenta Rápida
Suporte a operações Limitado Amplo

A escolha entre JSON e JSONB depende do tipo de tarefa. Se tu só precisa guardar os dados em texto, sem mexer, pode ir de JSON sem medo. Mas se tu vai trabalhar bastante com os dados dentro das colunas, fazer filtro, busca ou agrupamento, JSONB é mais rápido e prático.

Pra apps mais complexos, onde os dados JSON não são só "armazenamento", mas também são usados em análises, o JSONB é indispensável. Então, se tu ficar na dúvida — vai de JSONB. Quem sabe teu futuro "select mais rápido da vida" não te agradece depois!

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION