Às vezes, a estrutura dos dados não cabe só em strings e números. Por exemplo, um usuário pode ter uma lista de hobbies, configurações de perfil aleatórias ou parâmetros aninhados de um pedido. Criar tabelas separadas pra tudo isso é chato. É aí que entra o JSON.
O PostgreSQL suporta dois formatos pra lidar com esses dados: JSON e JSONB. Os dois deixam você guardar dados estruturados numa coluna só, mas tem diferenças importantes entre eles.
Bora entender como funciona, quando usar cada formato e o que dá pra fazer com eles.
O que é JSON
JSON (JavaScript Object Notation) é um formato de texto pra trocar dados, criado pra facilitar a representação de dados estruturados. É um formato que todo dev web conhece bem, e dá pra dizer que é "de boa pra ler" e "fácil de ser lido por máquina". No PostgreSQL, esse formato é usado pra guardar e manipular dados estruturados.
Aqui vai um exemplo de objeto JSON:
{
"name": "Alex Lin",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JavaScript"],
"address": {
"city": "Berlin",
"postal_code": "10115"
}
}
Obs: JSON é só texto, mas texto com regras. Por exemplo, os nomes das chaves sempre vão entre aspas.
JSONB: Binary JSON
JSONB é o "JSON binário", que também é suportado pelo PostgreSQL. Diferente do JSON, o JSONB pode ser indexado e é otimizado pra buscas rápidas e alterações. A diferença principal entre JSON e JSONB no PostgreSQL é o jeito que eles são guardados:
- JSON é guardado como uma string de texto, do jeito que você mandou os dados.
- JSONB transforma os dados num formato binário, que é mais eficiente pra maioria das operações.
O JSONB te dá umas paradas maneiras: filtragem, indexação, comparação de estruturas aninhadas complexas.
Principais vantagens do JSONB
Por que escolher JSONB e não JSON? Olha só alguns motivos:
- Acelera buscas e filtragens
O JSONB foi feito pra extrair dados rapidão. Por exemplo, se você tem um array grandão de objetos, o JSONB deixa achar o item certo sem ter que passar por tudo.
- Dá pra indexar
Com indexação, você pode buscar por chaves e valores dentro do JSONB, deixando as queries voando. Tratar JSON como texto (no formato JSON) não permite indexação.
- Facilidade pra lidar com dados aninhados
O JSONB manda muito bem com estruturas aninhadas. Não precisa criar um monte de tabelas pra dados hierárquicos — dá pra guardar tudo de boa numa coluna só.
Quando usar JSON e quando usar JSONB
- JSON é legal se você quer guardar os dados "do jeito que vieram", em texto. Tipo, se é importante manter o registro exato dos dados ou se não vai mexer muito neles.
- JSONB é melhor se você vai fazer muita busca, filtragem e alteração nos dados, ou se precisa de indexação.
Exemplos de objetos JSON
Bora ver uns exemplos de objetos JSON pra sacar como pode ser a estrutura deles.
Objeto JSON simples.
Estrutura chave-valor:
{
"name": "Ekaterina",
"age": 29
}
Arrays no JSON
JSON suporta arrays:
{
"skills": ["Python", "SQL", "Data Analysis"]
}
Objetos aninhados
JSON deixa você montar estruturas pra guardar dados mais complexos:
{
"name": "Andrey",
"contacts": {
"email": "andrey@example.com",
"phone": "+79012345678"
}
}
Combinando arrays e objetos
Dá pra misturar arrays e objetos:
{
"team": [
{
"name": "Elena",
"role": "gerente"
},
{
"name": "Pavel",
"role": "desenvolvedor"
}
]
}
JSON e PostgreSQL
O PostgreSQL suporta dois tipos de dados separados pra trabalhar com JSON:
JSON: formato de texto.JSONB: formato binário.
Criando tabela com colunas JSON e JSONB
Vamos ver como usar JSON/JSONB em tabelas do PostgreSQL. Por exemplo, bora criar uma tabela pra guardar informações dos funcionários da empresa:
-- Criando tabela com colunas JSON e JSONB
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
details JSON, -- JSON em texto
profile JSONB -- JSON binário
);
De cara, parece que não tem diferença entre essas colunas. Mas tem sim: JSON é perfeito pra guardar dados sem mudar nada, já o JSONB é melhor pra filtrar e buscar.
-- Inserindo dados
INSERT INTO employees (name, details, profile)
VALUES
('Alex Lin', '{"age": 30, "city": "Tallinn"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "football"}'),
('Maya Novak', '{"age": 25, "city": "Riga"}', '{"skills": ["Python", "Machine Learning"], "hobby": "reading"}');
Extraindo dados do JSONB
Dá pra extrair dados do JSONB usando funções especiais, que a gente vai ver na próxima aula. Por exemplo, pra saber as skills dos funcionários:
-- Extraindo skills
SELECT name, profile->'skills' AS skills
FROM employees;
Resultado:
| name | skills |
|---|---|
| Alex Lin | ["SQL", "PostgreSQL"] |
| Maya Novak | ["Python", "Machine Learning"] |
Usando JSON na vida real
JSON (e JSONB) é muito usado em apps de verdade. Olha só alguns exemplos:
- API e microsserviços. JSON é o formato padrão pra trocar dados em RESTful API. O PostgreSQL suporta isso tanto pra guardar quanto pra manipular.
- Integração de dados. Se seu banco recebe dados de vários sistemas, trabalhar com JSONB facilita muito.
- Lidar com estruturas complexas. Por exemplo, JSONB é ótimo pra guardar dados de formulários, configs de usuário ou metadados corporativos.
GO TO FULL VERSION