Tout d'abord, hstore
est un module contrib, qui vous permet uniquement de stocker des paires clé => valeur, où les clés et les valeurs ne peuvent être que du text
s (toutefois les valeurs peuvent être sql NULL
s aussi).
Les deux json
&jsonb
vous permet de stocker une valeur JSON valide (défini dans sa spécification).
F. ex. ce sont des représentations JSON valides :null
, true
, [1,false,"string",{"foo":"bar"}]
, {"foo":"bar","baz":[null]}
- hstore
n'est qu'un petit sous-ensemble par rapport à ce que JSON est capable (mais si vous n'avez besoin que de ce sous-ensemble, ça va).
La seule différence entre json
&jsonb
est leur stockage :
json
est stocké dans son format de texte brut, tandis quejsonb
est stocké dans une représentation binaire
Il y a 3 conséquences majeures à cela :
jsonb
prend généralement plus d'espace disque pour stocker quejson
(parfois pas)jsonb
prend plus de temps à construire à partir de sa représentation d'entrée quejson
json
les opérations prennent considérablement plus de temps quejsonb
(&l'analyse doit également être effectuée chaque fois que vous effectuez une opération sur unjson
valeur saisie)
Quand jsonb
sera disponible avec une version stable, il y aura deux cas d'utilisation majeurs, où vous pourrez facilement choisir entre eux :
- Si vous travaillez uniquement avec la représentation JSON dans votre application, PostgreSQL n'est utilisé que pour stocker et récupérer cette représentation, vous devez utiliser
json
. - Si vous effectuez de nombreuses opérations sur la valeur JSON dans PostgreSQL, ou utilisez l'indexation sur un champ JSON, vous devez utiliser
jsonb
.