Dos documentos do PostgreSQL :
jsonb
não preserva espaços em branco, não preserva a ordem das chaves dos objetos e não mantém chaves de objetos duplicadas. Se chaves duplicadas forem especificadas na entrada, apenas o último valor será mantido.
Eu tenho uma jsonb
coluna que contém alguns dados. Eu extraio dados-chave específicos (que também são json) e faço hash usando sha256, algo como:
SELECT sha256(to_jsonb(rule_element) :: TEXT :: BYTEA);
Onde rule_element
foi extraído dos dados originais. Dado que não mantém a ordem das chaves e a coluna original jsonb
pode ser atualizada no futuro, não creio que seja seguro calcular hashes, pois eles podem mudar.
Posso calcular hashes consistentes para jsonb
colunas? (99% de certeza que não pode, 1% espera facilitar meu trabalho)
Os hashes seriam usados para fins de identificação única, atuando basicamente como uma chave única para diferentes tipos de composições JSON.
Não há garantia oficial de que a implementação (e a representação do texto)
jsonb
não mudará, então eu não dependeria da estabilidade de tais hashes se estivesse lidando com dados que serão usados daqui a 50 anos.No entanto, se a representação no disco for
jsonb
alterada, seria uma versão que interromperia a atualizaçãopg_upgrade
, portanto, não é provável que isso aconteça tão cedo. É claro que a representação da string pode mudar, mas não consigo pensar em uma razão para mudar isso, a menos que a representação das mudanças no discojsonb
.Se você quiser usar os hashes em uma restrição exclusiva, poderá criar uma restrição exclusiva em
jsonb_hash_extended(jsoncol, 0)
. Contanto que você armazene os hashes apenas de uma maneira que não seja interrompida se os valores do hash mudarem durante um despejo/restauração. Eu me sentiria inseguro em usar esses hashes como identificadores imutáveis fora do banco de dados.Mas talvez eu esteja muito preocupado: se o resultado
jsonb_hash_extended()
mudasse em uma versão diferente do PostgreSQL, o particionamento de hashjsonb
seria interrompido durante uma atualização. Então talvez nunca possamos mudar isso de qualquer maneira.