JSON ou JSONB no PostgreSQL?
A escolha entre json e jsonb depende de como o dado semi-estruturado será armazenado, consultado e manipulado dentro do sistema.
Recentemente precisei utilizar, no PostgreSQL, um formato para armazenar dados semi-estruturados. Usei esse recurso para armazenar permissões, porque ele garante um schema mais flexível.
No MySQL, eu já utilizava o tipo JSON, que funciona bem, embora não seja tão eficiente em alguns cenários. No PostgreSQL, porém, existem dois tipos de dados para esse propósito: json e jsonb.
Mas qual deles usar? A resposta depende diretamente de como esses dados serão utilizados.
O tipo json no PostgreSQL é armazenado como texto. Ele garante que o conteúdo esteja em um formato JSON válido, mas oferece recursos limitados para consultas mais elaboradas.
Por isso, costuma ser interessante em cenários de inserção de dados em massa, quando a preocupação principal é apenas armazenar o payload, sem necessidade de consultas frequentes ou manipulações internas.
Por outro lado, esse formato se torna menos eficiente quando há necessidade de consultar ou alterar partes específicas do conteúdo, já que operações mais complexas exigem a reescrita do documento.
Já o tipo jsonb é armazenado em um formato binário interno, o que o torna mais eficiente para leitura e manipulação. Ele permite a criação de índices, como os do tipo GIN, possibilita consultas mais complexas e permite atualizar campos específicos dentro da estrutura JSON.
O custo disso é um desempenho menor em inserções em massa, devido ao processamento adicional necessário. Em contrapartida, ele se destaca quando o JSON faz parte ativa das consultas e das regras do sistema.
Em resumo: se a ideia é apenas armazenar o documento como payload, json pode ser suficiente. Se o conteúdo será consultado, filtrado, indexado ou manipulado com frequência, jsonb tende a ser a escolha mais adequada.