Thread: hstore or jsonb ?
Hi folks, I'd like to store specs, as they vary a lot from one item to another, hstore or jsonb look like the best solution. Specs can have 2 levels at most. ie: "color": ["white", "black", "blue"]). The indexation is mandatory for fulltext accurate researches in (almost) natural language. So, as the processing is almost the same (maps I/O in Erlang), which one would be the best for my needs, hstore or jsonb ? Also, from what I read, the both of them can be easily indexed, but which index is the best, GIN or RUM ? And furthermore, which index option (XXX_ops), if any, would be the best for the chosen one ? Jean-Yves
On Mon, 2022-11-14 at 15:50 +0100, Bzzzz wrote: > I'd like to store specs, as they vary a lot from one item to another, > hstore or jsonb look like the best solution. > > Specs can have 2 levels at most. > ie: "color": ["white", "black", "blue"]). > > The indexation is mandatory for fulltext accurate researches in > (almost) natural language. > > So, as the processing is almost the same (maps I/O in Erlang), which one > would be the best for my needs, hstore or jsonb ? "hstore" is obsolete; don't use it. > Also, from what I read, the both of them can be easily indexed, but > which index is the best, GIN or RUM ? > > And furthermore, which index option (XXX_ops), if any, would be the best > for the chosen one ? That depends on the query you need to support. I have no idea what you mean by "fulltext accurate search" in a hstore or JSON. Yours, Laurenz Albe
On Mon, 14 Nov 2022 22:03:02 +0100 Laurenz Albe <laurenz.albe@cybertec.at> wrote: > On Mon, 2022-11-14 at 15:50 +0100, Bzzzz wrote: > > I'd like to store specs, as they vary a lot from one item to > > another, hstore or jsonb look like the best solution. > > > > Specs can have 2 levels at most. > > ie: "color": ["white", "black", "blue"]). > > > > The indexation is mandatory for fulltext accurate researches in > > (almost) natural language. > > > > So, as the processing is almost the same (maps I/O in Erlang), > > which one would be the best for my needs, hstore or jsonb ? > > "hstore" is obsolete; don't use it. Oh, I missed that, so jsonb it'll be. > > Also, from what I read, the both of them can be easily indexed, but > > which index is the best, GIN or RUM ? > > > > And furthermore, which index option (XXX_ops), if any, would be the > > best for the chosen one ? > > That depends on the query you need to support. > > I have no idea what you mean by "fulltext accurate search" in a hstore > or JSON. One kind, that will be something like : SELECT websearch_to_tsquery('english', 'switching power supply output tension 5 Vcc 5 A') ; This will be for external, internal queries will specify more to be more accurate/restrictive. I can't put specs into columns because they are very different from one to another family of products, hence the use of json to keep them as malleable as possible. Jean-Yves
On Mon, 14 Nov 2022 22:03:02 +0100 Laurenz Albe <laurenz.albe@cybertec.at> wrote: Oops, I forgot to say that a jsonb entry will automatically feed it's tsvector counterpart. Jean-Yves
On Mon, 2022-11-14 at 22:21 +0100, Bzzzz wrote: > That depends on the query you need to support. > > > > I have no idea what you mean by "fulltext accurate search" in a hstore > > or JSON. > > One kind, that will be something like : > SELECT websearch_to_tsquery('english', 'switching power supply > output tension 5 Vcc 5 A') ; Indexing full text search is simple. If the query is ... WHERE <someexpression> @@ <somequery> the index is to be CREATE INDEX ON tab USING gin ((<someexpression>)); Yours, Laurenz Albe -- Cybertec | https://www.cybertec-postgresql.com
On Mon, Nov 14, 2022 at 10:03:02PM +0100, Laurenz Albe wrote: > On Mon, 2022-11-14 at 15:50 +0100, Bzzzz wrote: > > I'd like to store specs, as they vary a lot from one item to another, > > hstore or jsonb look like the best solution. > > > > Specs can have 2 levels at most. > > ie: "color": ["white", "black", "blue"]). > > > > The indexation is mandatory for fulltext accurate researches in > > (almost) natural language. > > > > So, as the processing is almost the same (maps I/O in Erlang), which one > > would be the best for my needs, hstore or jsonb ? > > "hstore" is obsolete; don't use it. Do you have any support for this claim? Best regards, depesz
On Tue, 2022-11-15 at 09:39 +0100, hubert depesz lubaczewski wrote: > > "hstore" is obsolete; don't use it. > > Do you have any support for this claim? No. But is there anything that hstore can that JSON cannot? Yours, Laurenz Albe
On Tue, Nov 15, 2022 at 06:02:51PM +0100, Laurenz Albe wrote: > On Tue, 2022-11-15 at 09:39 +0100, hubert depesz lubaczewski wrote: > > > "hstore" is obsolete; don't use it. > > > > Do you have any support for this claim? > > No. > > But is there anything that hstore can that JSON cannot? It's faster for some things: https://www.depesz.com/2021/04/21/getting-value-from-dynamic-column-in-pl-pgsql-triggers/ And it can be trivially used to check for differences in update triggers: hstore(NEW) - hstore(OLD) It's "abusability" is lower thanks to lack of nesting. depesz
On Tue, 15 Nov 2022 18:32:24 +0100 hubert depesz lubaczewski <depesz@depesz.com> wrote: > > But is there anything that hstore can that JSON cannot? > > It's faster for some things: > https://www.depesz.com/2021/04/21/getting-value-from-dynamic-column-in-pl-pgsql-triggers/ Thanks for the URL, the difference is indeed quite large. > And it can be trivially used to check for differences in update > triggers: > hstore(NEW) - hstore(OLD) I didn't knew that (and it's not part of the official doc :/) > It's "abusability" is lower thanks to lack of nesting. Yeah, it is a problem as some specs can contain a list, I discovered that last night - so jsonb it'll be. Jean-Yves