2012-06-17 8 views
9

Nie jestem nawet pewien, czy typ danych HStore PostgreSa może zawierać zagnieżdżone skróty, a jeśli tak, to jak je wstawić?Czy jest to możliwe i jaka jest składnia zagnieżdżonego skrótu w hStore PostgreSQL?

Oto, co starałem dotąd:

-- 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 */ 

Jeśli nie jest to możliwe, jest tam obecny akceptowany standard/idiom do pracy z zagnieżdżonych skrótów - może ciągnąć je od siebie i odnosić się do nich za pomocą identyfikatora?

Każda pomoc w tej sprawie byłaby bardzo doceniana.

Odpowiedz

14

Z fine manual:

klucze i wartości są po prostu ciągi tekstowe.

Tak, nie, nie można użyć hstore jako wartości w hstore. Jeśli spojrzysz na hstore operators i functions zobaczysz, że wszystkie działają z wartościami text.

Nie znam żadnego standardowego podejścia do udawania zagnieżdżonych skrótów. Podejrzewam, że trzeba by zorganizować klucze (a.b => c dla a => b => c), a następnie można więc takie rzeczy:

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

chwycić „a” kawałek każdego doc że ma „sub-hash” {b => ..., c => ...} .

Pojawi się również JSON type, który może być lepiej dopasowany do Twoich potrzeb. Ale musisz na to poczekać i nie jestem pewien what the final implementation will look like.

+1

Jeśli to ci nie odpowiada, możesz przesłać plik hstore do tekstu, a następnie uciec od cudzysłowu, aby uzyskać ciąg znaków, który można zapisać jako wartość w hstore, ale prawdopodobnie nie byłoby to możliwe. wygodny w użyciu. Możesz rozważyć normalizację danych nieco bardziej. – kgrittn

+0

Dzięki za wyczyszczenie tego, doceniam to. Przeczytałem tę stronę w podręczniku (i jest to świetny podręcznik), ale nie miał nawet przykładu wstawki, więc zastanawiałem się, czy nie było bardziej złożonych przykładów, które również zostały pominięte. @kgrittn Myślę, że odlewanie będzie trasą, którą podejmuję, nie potrzebuję znormalizowanych danych w tym przypadku, (tylko dokument jako blob), chyba że jest to jedyny sposób na przeniesienie dokumentu do bazy danych! – iain

0

Jeśli ktokolwiek, kto widzi, że dzieje się przy użyciu ActiveRecord, Nested Hstore pozwala na przechowywanie zagnieżdżonych skrótów w hstore. Serializuje wartości hstore za pomocą JSON i obsługuje również wiele innych struktur danych.

Powiązane problemy