First, hstore is a contrib module, which only allows you to store key => value pairs, where keys and values can only be texts (however values can be sql NULLs too).
Both json & jsonb allows you to store a valid JSON value (defined in its spec).
F.ex. these are valid JSON representations: null, true, [1,false,"string",{"foo":"bar"}], {"foo":"bar","baz":[null]} – hstore is just a little subset compared to what JSON is capable (but if you only need this subset, it’s fine).
The only difference between json & jsonb is their storage:
jsonis stored in its plain text format, whilejsonbis stored in some binary representation
There are 3 major consequences of this:
jsonbusually takes more disk space to store thanjson(sometimes not)jsonbtakes more time to build from its input representation thanjsonjsonoperations take significantly more time thanjsonb(& parsing also needs to be done each time you do some operation at ajsontyped value)
When jsonb will be available with a stable release, there will be two major use cases, when you can easily select between them:
- If you only work with the JSON representation in your application, PostgreSQL is only used to store & retrieve this representation, you should use
json. - If you do a lot of operations on the JSON value in PostgreSQL, or use indexing on some JSON field, you should use
jsonb.