Eu adoro trabalhar com bancos de dados NoSQL!!! Eles me dão uma flexibilidade ímpar e um desempenho fenomenal, quando utilizados corretamente!
No PGConf 2018 eu tive o prazer de falar sobre o uso do PostgreSQL como um BD NoSQL. Se quiser ver o vídeo da minha palestra, ele está disponível neste link.
O PostgreSQL é um banco de dados objeto-relacional… Mas ele com ele podemos ir além, e armazenar dados no formato JSON. Esses dados também poderiam ser armazenados como text, mas os tipos de dados JSON têm a vantagem de impor que cada valor armazenado seja válido de acordo com as regras JSON (JSON é o acrônimo para “JavaScript Object Notation”, é um formato padrão e leve para intercâmbio de dados.)A grande sacada do PG é que ele vai além do armazenamento… Ele permite a manipulação de dados no formato JSON de forma muito eficiente, uma vez que possui funções e operadores específicos disponíveis para os dados armazenados com estes tipos.
Para armazenar documentos JSON, temos dois data types dispponíveis, o tipo JSON e o tipo JSONB.
O tipo JSON foi introoduzido no PostgreSQL na versão 9.2, aceita somente JSONs válidos e permite que façamos CRUD com eles. Existem operadores específicos para este data type e ele pemite tb usar um documento JSON (ou partes dele) na cláusula WHERE.
O tipo JSONB é um tipo binário JSONB, que em muitas operações é mais rápido que o tipo JSON, isso acontece porque o tipo JSONB pode ser indexado, não armazena espaços em branco, e o processamento é muito mais rápido porque não precisa converter da informação sempre que for usá-la.
O tipo JSONB tem as mesmas funções e operadores do tipo JSON com excessão das funções para geração de objetos json (to_json, json_agg, etc.).
Embora eu prefira usar o tipo JSONB na maioria das situações, é preciso destacar que com ele a escrita é mais lenta, ele ocupa mais espaço em disco e as consultas agregadas podem ser mais lentas.
Sendo assim, use o tipo JSON se a informação será somente armezada, sem manipulações ou operações , e se for necessário executar muitas escritas e consultas com agregações.
O grande motivo para eu curtir tanto o tipo JSONB são os índices GIN. Eles são fenomenais! E não funcionam com o tipo de dados JSON.
Em resumo… Existem dois tipos de dados JSON: JSONe JSONB. Eles aceitam conjuntos quase idênticos de valores como entrada. A principal diferença prática é a eficiência. O tipo JSON armazena uma cópia exata do texto de entrada, cujas funções de processamento devem ser reexaminadas em cada execução; enquanto tipo JSONB armazena os dados em um formato binário decomposto que o torna um pouco mais lento para a entrada devido à sobrecarga da conversão, mas significativamente mais rápido para processar, já que não é necessária qualquer reparação. JSONB também suporta indexação, o que pode ser uma vantagem significativa.
Uma das coisas que me deixa muito irritada com o MongoDB é que apesar de existir a possibilidade de garantir a qualidade dos dados usando o JSON Schema, quando um erro de validação acontece não conseguimos saber onde o erro aconteceu, porque a mensagem de erro não é explicita.
Quando usamos os tipos JSON e JSONB podemos validar os dados usando constraints, e se colocarmos nelas nomes claros e coerentes podemos saber em que parte do documento o erro aconteceu.
Um aspecto muito relevante quando optamos por usar o tipo JSON ou JSONB é esclarecido de forma linda na documentação do PostgreSQL:
“Representar dados como JSON pode ser consideravelmente mais flexível do que o modelo tradicional de dados relacionais, que é atraente em ambientes onde os requisitos são fluidos. É bem possível que ambas as abordagens coexistam e se complementem dentro do mesmo aplicativo. No entanto, mesmo para aplicativos em que a flexibilidade máxima é desejada, ainda é recomendável que os documentos JSON tenham uma estrutura fixa. A estrutura é tipicamente não-reforçada (embora seja possível impor algumas regras de negócios de forma declarativa), mas ter uma estrutura previsível torna mais fácil escrever consultas que resumem utilmente um conjunto de “ documentos ” (datums) em uma tabela. Os dados JSON estão sujeitos às mesmas considerações de controle de simultaneidade que qualquer outro tipo de dados quando armazenados em uma tabela. Emborao armazenamento de documentos grandes seja praticável, lembre-se de que qualquer atualização adquire um bloqueio em nível de linha em toda a linha. Considere limitar documentos JSON a um tamanho gerenciável para diminuir a contenção de bloqueios entre as transações de atualização. Idealmente, os documentos JSONdevem cada um representar um dado atômico que as regras de negócios ditam que não podem ser razoavelmente subdivididos em datums menores que poderiam ser modificados independentemente.”
Enfim… Podemos usar o PostgreSQL como um excelente banco de dados NoSQL orientado a documentos, garantindo desempenho e qualidade, desde que tenhamos cuidado no design dos documentos que serão armazenados. A ideia de criar documentos sem a menor governança deve ser abolida… Porque em pouco tempo pode trazer grandes problemas.
Links úteis:
https://www.youtube.com/watch?v=CbmEXILX9is&list=LLAhMgZRoZtAnJETcbYG51WQ&index=3
https://www.postgresql.org/docs/10/datatype-json.html
http://www.postgresqltutorial.com/postgresql-json/
Entenda a diferença entre JSON e JSONB no PostgreSQL
2 Comentários
Oi, Dani.
Ótimo post!
Parabéns! \o/
Daniela,
Fico muito feliz em saber que vc gostou!!!
Obrigado pelo feedback ❤️
Bjs
Dani