Fala, pessoal! Beleza?
Se você trabalha com desenvolvimento de software ou banco de dados, com certeza já passou (ou viu) aquela clássica discussão: “Usamos banco Relacional ou NoSQL (Documentos/JSON)?”
De um lado, os desenvolvedores adoram o JSON porque ele é super flexível, fácil de ler e mapeia perfeitamente os objetos do código (como uma classe em Java, Python, C# ou Node.js). Do outro lado, nós, os DBAs e engenheiros de dados, puxamos o cabelo porque sabemos que dados duplicados em JSON geram inconsistência, falta de integridade e relatórios lentos.
E se eu te dissesse que a Oracle resolveu esse dilema de uma vez por todas? No Oracle Database 23ai nasceu uma funcionalidade fantástica chamada JSON Relational Duality Views.
Neste post, vou te explicar o que é isso, onde se aplica e mostrar um exemplo prático para você sair testando hoje mesmo!
O que é a tal da “Dualidade”?
Para entender o conceito, pense na palavra Dualidade. Significa que algo pode se manifestar de duas formas diferentes, dependendo de como você olha.
Agora a partir da versão 23ai, o JSON Relational Duality permite exatamente isso:
- Por baixo dos panos (Armazenamento): Os dados continuam salvos em tabelas relacionais normais, totalmente normalizadas, com chaves primárias, chaves estrangeiras, ACID e sem duplicidade.
- Por cima (Para o Desenvolvedor): O banco de dados expõe esses mesmos dados como se fossem documentos JSON prontinhos, através de uma View especial.
O desenvolvedor pode inserir, atualizar e deletar dados enviando um documento JSON simples para o banco. O Oracle intercepta esse JSON, quebra ele em pedacinhos e atualiza as tabelas relacionais correspondentes de forma totalmente automática.
É o fim daquela trabalheira de usar frameworks complexos de ORM (como Hibernate ou Entity Framework) para ficar mapeando tabelas em objetos!
Onde isso se aplica no mundo real?
Imagine um sistema de E-commerce. Nele, você tem as tabelas de Clientes, Pedidos e Itens do Pedido.
Para o desenvolvedor exibir os detalhes de um pedido na tela do aplicativo, no modelo relacional tradicional ele precisaria fazer um JOIN entre essas três tabelas ou fazer três consultas diferentes.
Com o JSON Relational Duality, ele faz apenas uma busca por um único documento JSON que já traz o cliente, o pedido e todos os itens agrupados. Se o cliente mudar o endereço de entrega no app, o app manda o JSON alterado e o Oracle atualiza a tabela de Clientes automaticamente.
Bora pra prática! (Mão na Massa)
Para deixar claro como a mágica acontece, vamos simular um cenário simples de um sistema de gerenciamento de times e jogadores.
1. Criando as tabelas relacionais normais
Primeiro, criamos as estruturas onde o DBA gosta de guardar os dados, garantindo que não haja redundância:
SQL
-- Tabela de Times
CREATE TABLE times (
id_time NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
nome_time VARCHAR2(100) NOT NULL,
cidade VARCHAR2(100)
);
-- Tabela de Jogadores (relacionada com Times)
CREATE TABLE jogadores (
id_jogador NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
nome VARCHAR2(100) NOT NULL,
posicao VARCHAR2(50),
id_time NUMBER REFERENCES times(id_time)
);
2. Criando a mágica: A Duality View
Agora, criamos a camada que o desenvolvedor vai enxergar. Essa view transforma os dados relacionais em documentos JSON. Note a palavra-chave JSON RELATIONAL DUALITY VIEW:
SQL
CREATE OR REPLACE JSON RELATIONAL DUALITY VIEW view_time_documento AS
SELECT JSON {'id' : t.id_time,
'time' : t.nome_time,
'cidade' : t.cidade,
'elenco' : [ SELECT JSON {'id_j' : j.id_jogador,
'nome' : j.nome,
'posicao' : j.posicao}
FROM jogadores j WITH INSERT UPDATE DELETE
WHERE j.id_time = t.id_time ]}
FROM times t WITH INSERT UPDATE DELETE;
Nota: O WITH INSERT UPDATE DELETE diz ao Oracle que o app tem permissão para alterar os dados relacionais através desse nó do JSON.
3. Como o desenvolvedor consome isso?
A partir de agora, o desenvolvedor não precisa saber dar JOIN. Ele simplesmente interage com o JSON.
Inserindo dados via JSON:
SQL
INSERT INTO view_time_documento VALUES (
'{
"time": "Santos FC",
"cidade": "Santos",
"elenco": [
{"nome": "Pelé", "posicao": "Atacante"},
{"nome": "Coutinho", "posicao": "Meia"}
]
}');
Ao executar esse comando, o Oracle cria 1 registro na tabela times e 2 registros na tabela jogadores automaticamente!
Consultando o JSON:
SQL
SELECT data FROM view_time_documento;
O resultado na tela do app já vem formatadinho como um objeto JSON pronto para o front-end consumir.
Resumo da ópera
O JSON Relational Duality tira o peso das costas do desenvolvedor (que ganha uma produtividade absurda consumindo e gravando dados como documentos) e mantém o DBA feliz da vida (com os dados limpos, indexados e consistentes nas tabelas relacionais).
E aí, o que achou dessa novidade do Oracle 23ai? Já conhecia ou já está pensando em usar em algum projeto? Deixe seu comentário aqui embaixo!