`jsonb` no PostgreSQL: quando usar e como indexar
Pergunta
Quando faz sentido guardar dados em uma coluna `jsonb` no Postgres em vez de colunas normais, e como indexar consultas nela?
Resposta esperada
`jsonb` é bom pra dados semiestruturados e variáveis por linha — payload de webhook, atributos de produto que diferem por categoria, snapshot de configuração, metadados que evoluem. Vantagem sobre `json` (texto): é binário, permite operadores (`->`, `->>`, `@>`, `?`) e índices. Ruim quando os campos são estáveis e você faz JOIN/agregação/constraint sobre eles — aí colunas normais com tipos e índices B-tree são melhores (e o banco garante a forma). Indexação: índice GIN pra consultas de contenção/existência (com o operador `@>` passando um objeto, ou o operador `?` testando uma chave); ou índice B-tree numa EXPRESSÃO pra um campo específico muito consultado (um índice sobre `dados->>'email'`). Antipadrão: usar `jsonb` pra tudo e virar um banco 'schemaless' dentro do relacional, perdendo o que ele tem de melhor.
Por que perguntam isso
Pergunta pleno/sênior de Postgres. Sinal de domínio: GIN vs B-tree expressão, e o antipadrão 'schemaless dentro do relacional'.