JSON (JavaScript Object Notation) é um formato de dados super popular pra trocar informação entre sistemas. Ele é leve, fácil de ler e perfeito pra representar dados estruturados, tipo objetos ou arrays.
O PostgreSQL suporta dois tipos de dados pra trabalhar com JSON:
JSON: armazena os dados como string. É uma representação puramente textual do JSON, sem otimização interna.JSONB: representação binária do JSON. É mais eficiente pra leitura, filtragem e processamento, porque o PostgreSQL já faz o parsing do JSON e otimiza o armazenamento.
Por que a galera geralmente escolhe JSONB? Porque:
- É mais rápido nas consultas por causa do armazenamento binário.
- Dá pra criar índice, então é perfeito pra conjuntos de dados grandes.
- Salva as chaves ordenadas e remove duplicatas, o que facilita o processamento.
Exemplo de estrutura JSON:
{
"name": "Alice",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JSONB"]
}
Por que JSONB é útil?
Armazenar dados semiestruturados. No mundo real, os dados muitas vezes chegam como objetos complexos (tipo metadados, configurações, perfis de usuário). JSONB deixa você guardar tudo isso sem precisar criar centenas de tabelas e relações.
Modelar dados que mudam. Quando a estrutura do objeto muda toda hora (tipo adicionando ou removendo campos), JSONB deixa o armazenamento bem flexível.
Trabalhar com API. Muitos apps web mandam dados em formato JSON. Em vez de converter tudo, dá pra guardar "do jeito que veio" e trabalhar direto com eles.
Criando uma tabela com JSONB
Bora pra prática! Imagina que a gente tá criando um banco pra guardar perfis de usuários.
A coluna profile vai guardar todas as infos extras (tipo idade, interesses, contatos) em formato JSON. Isso é massa quando a estrutura dos dados muda de um usuário pra outro.
| id | name - VARCHAR(100) | profile - JSONB |
|---|---|---|
| 1 | Alice | {"age": 25, "skills": ["SQL", "PostgreSQL", "JSONB"], "location": "New York"} |
| 2 | Bob | {"age": 30, "interests": ["hiking", "photography"], "location": "Denver"} |
| 3 | Charlie | {"email": "charlie@example.com", "verified": true} |
| 4 | Diana | {"age": 22, "skills": ["Python"], "bio": "Data enthusiast", "location": "Berlin"} |
| 5 | Eve | {"age": 28, "skills": [], "preferences": {"theme": "dark", "notifications": false}} |
Os dados em JSON podem ser inseridos como strings. O PostgreSQL converte automaticamente pro formato JSONB.
Extraindo dados do JSONB
Agora que já temos dados, bora ver como extrair eles. O PostgreSQL tem vários operadores pra trabalhar com JSONB.
Acessando o valor de um campo
Usa o operador -> pra pegar o valor de um campo:
-- Mostra a idade do usuário
SELECT profile->'age' AS age FROM users;
Convertendo valor pra texto
O operador ->> deixa você extrair o valor como string:
-- Mostra o local de residência do usuário
SELECT profile->>'location' AS location FROM users;
Filtrando dados com JSONB
O poder do JSONB aparece mesmo nas consultas com filtro. Dá pra usar operadores SQL padrão pra trabalhar com JSON.
Exemplo de filtro por chave:
-- Achar usuários que moram em "New York"
SELECT * FROM users
WHERE profile->>'location' = 'New York';
Buscando em array
JSON suporta arrays, e o PostgreSQL sabe procurar valores dentro deles:
-- Achar usuários que sabem SQL
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills'));
A função jsonb_array_elements_text transforma os elementos do array em strings pra poder comparar.
Tem um jeito mais curto usando o operador @>:
-- Achar usuários que sabem SQL
SELECT * FROM users
WHERE profile->'skills' @> '["SQL"]';
Depois a gente fala mais sobre funções e jeitos de trabalhar com JSON, quando chegar a hora :P
Resumo rápido: quando usar JSONB
JSONB é top pra:
- Armazenar dados estruturados complexos.
- Trabalhar com dados vindos de APIs externas.
- Quando a estrutura do objeto muda bastante.
Mas não esquece: usar JSONB demais pode complicar a indexação e a administração do banco. Se a estrutura dos dados for estável, é melhor usar o modelo relacional.
GO TO FULL VERSION