Estou projetando um banco de dados postgres no qual existe uma tabela que possui uma coluna do tipo jsonb. Eu gostaria que esta coluna fosse única. Não há necessidade de ter dois objetos com exatamente a mesma configuração json na tabela. No futuro, isso me pouparia cerca de 5 minutos de tempo de computação por duplicata não salva no banco de dados. Estou ciente do risco de exclusividade do JSON quando se trata de dictos (a ordem das chaves não é garantida), mas acho que um bom codificador JSON pode mitigar isso.
Minha preocupação é com o desempenho do banco de dados. Quero ter certeza de que estamos fazendo todo o possível para garantir que as inserções não sejam terrivelmente retardadas com essa restrição de exclusividade no jsonb. Quão ruim seria uma restrição de exclusividade em jsonb comparada a uma exclusividade em varchar ou int? Estamos falando de milissegundos, segundos ou minutos?
Examinei o índice Hash , que parece ser tudo o que eu precisaria para obter o desempenho ideal. Mas. Somente o tipo de índice de árvore B pode ser único, o que é estranho. Por que?
Vou ignorar a pergunta "por que". Veja os arquivos pgsql-hackers; é tudo de código aberto.
Você precisa de um índice de árvore B para uma restrição exclusiva.
Colocar o índice diretamente na coluna JSON não é uma opção, porque um valor JSON pode facilmente ser maior que o máximo permitido para uma entrada de índice de árvore B.
Você pode criar um índice exclusivo em um hash da coluna JSON. Supondo que o tipo de dados seja
jsonb
(onde você não precisa se preocupar com a ordem dos atributos), isso poderia serSempre há um pequeno risco de colisões de hash falso positivo...