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:
jsonbgeralmente leva mais espaço em disco para armazenar do quejson(às vezes não)jsonbleva mais tempo para construir a partir de sua representação de entrada do quejsonjsonas operações levam significativamente mais tempo quejsonb(&a análise também precisa ser feita toda vez que você fizer alguma operação em umjsonvalor 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.