Возможно ли это, и каков синтаксис вложенного хэша в типе Postgresql HStore?

Я даже не уверен, что тип данных Postgres HStore может содержать вложенные хэши, и если они могут, то как их вставить?

Вот что я пробовал до сих пор:

-- Database: test1

-- DROP DATABASE test1;
/*
CREATE DATABASE test1
  WITH OWNER = iainuser
       ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'en_GB.UTF-8'
       LC_CTYPE = 'en_GB.UTF-8'
       CONNECTION LIMIT = -1;
*/
/* create extension hstore; */
/*drop table my_store;*/
/*
create table my_store (
  id serial primary key not null,
  doc hstore
);

CREATE INDEX my_store_doc_idx_gist
  ON my_store
  USING gist
  (doc);
*/
/* select doc from my_store; */
/*
insert into my_store (doc) values ( '"a" => "1"' );
select doc -> 'a' as first_key from my_store; -- returns "1"
*/

/* insert into my_store (doc) values ( '"b" => "c" => "3"' ); -- doesn't work */
/* insert into my_store (doc) values ( '"b" => ("c" => "3")' ); -- doesn't work */
/* insert into my_store (doc) values ( '"b" => hstore("c" => "3")' ); -- doesn't work */
/* insert into my_store (doc) values ( '"b"' => hstore("c" => "3")' ); -- doesn't work */
/* insert into my_store (doc) values ( "b"=>'"c"=>"3"'::hstore ); -- doesn't work */

Если это невозможно, существует ли принятый в настоящее время стандарт/идиома для работы с вложенными хэшами - возможно, разделить их и ссылаться на них с помощью идентификатора?

Любая помощь в этом будет высоко оценена.


person iain    schedule 17.06.2012    source источник


Ответы (2)


Из отличного руководства:

Ключи и значения — это просто текстовые строки.

Итак, нет, вы не можете использовать hstore как значение в hstore. Если вы посмотрите на операторы hstore и функции вы увидите, что все они работают с text значений.

Я не знаю какого-либо стандартного подхода к подделке вложенных хэшей. Я подозреваю, что вам придется структурировать ключи (a.b => c для a => b => c), тогда вы могли бы делать такие вещи:

select slice(doc, array['a.b', 'a.c'])
from my_store
where doc ?& array['a.b', 'a.c']

чтобы получить фрагмент «a» каждого doc, который имеет «суб-хеш» {b => ..., c => ...}.

Также появится тип JSON, который может лучше подходить для твои нужды. Но вам придется подождать, и я не уверен, как будет выглядеть окончательная реализация.

person mu is too short    schedule 17.06.2012
comment
Если вам это не нужно, вы можете преобразовать hstore в текст, а затем избежать кавычек, чтобы получить строку, которую можно сохранить как значение в hstore, но, вероятно, это будет не так удобно использовать . Возможно, вы захотите еще немного нормализовать данные. - person kgrittn; 17.06.2012
comment
Спасибо, что прояснили это, я ценю это. Я читал эту страницу в руководстве (и это прекрасное руководство), но в нем даже не было примера вставки, поэтому я задавался вопросом, возможно, есть более сложные примеры, которые также были опущены. @kgrittn Я думаю, что кастинг будет тем путем, который я в конечном итоге выберу, мне не нужны нормализованные данные в этом случае (на самом деле просто документ в виде блоба), если только это не единственный способ поместить документ в базу данных! - person iain; 18.06.2012

Если кто-то, кто увидит это, использует ActiveRecord, вложенный Hstore позволяет хранить вложенные хэши в hstore. . Он сериализует значения hstore с использованием JSON, а также поддерживает ряд других структур данных.

person Tom    schedule 17.11.2013