Primeiro,
hstore
é um módulo contrib, que só permite armazenar pares de chave => valor, onde chaves e valores só podem ser text
s (porém os valores podem ser sql NULL
s também). Ambos
json
&jsonb
permite armazenar um valor JSON válido (definido em sua especificação). F.ex. estas são representações JSON válidas:
null
, true
, [1,false,"string",{"foo":"bar"}]
, {"foo":"bar","baz":[null]}
- hstore
é apenas um pequeno subconjunto comparado ao que o JSON é capaz (mas se você precisar apenas desse subconjunto, tudo bem). A única diferença entre
json
&jsonb
é o seu armazenamento:json
é armazenado em seu formato de texto simples, enquantojsonb
é armazenado em alguma representação binária
Há 3 grandes consequências disso:
jsonb
geralmente leva mais espaço em disco para armazenar do quejson
(às vezes não)jsonb
leva mais tempo para construir a partir de sua representação de entrada do quejson
json
as operações levam significativamente mais tempo quejsonb
(&a análise também precisa ser feita toda vez que você fizer alguma operação em umjson
valor digitado)
Quando
jsonb
estará disponível com uma versão estável, haverá dois casos de uso principais, quando você poderá selecionar facilmente entre eles:- Se você trabalha apenas com a representação JSON em seu aplicativo, o PostgreSQL é usado apenas para armazenar e recuperar essa representação, você deve usar
json
. - Se você fizer muitas operações no valor JSON no PostgreSQL ou usar indexação em algum campo JSON, use
jsonb
.