CodeGym /Cursos /SQL SELF /Trabalhando com JSON e JSONB

Trabalhando com JSON e JSONB

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

À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:

  1. 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.

  1. 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.

  1. 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:

  1. 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.
  2. Integração de dados. Se seu banco recebe dados de vários sistemas, trabalhar com JSONB facilita muito.
  3. Lidar com estruturas complexas. Por exemplo, JSONB é ótimo pra guardar dados de formulários, configs de usuário ou metadados corporativos.
2
Tarefa
SQL SELF, nível 33, lição 0
Bloqueado
Criação de tabela com JSONB
Criação de tabela com JSONB
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION