2012-06-17 29 views
9

Tôi thậm chí không chắc chắn rằng kiểu dữ liệu HStore của Postgres có thể chứa các băm lồng nhau, và nếu chúng có thể, làm thế nào để chèn chúng?Có thể, và cú pháp cho một băm lồng nhau trong kiểu HStore của Postgresql là gì?

Đây là những gì tôi đã cố gắng cho đến nay:

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

Nếu đó là không thể, là có một tiêu chuẩn được chấp nhận/thành ngữ hiện tại để làm việc với băm lồng nhau - có lẽ kéo chúng ra xa nhau và giới thiệu cho họ sử dụng id?

Bất kỳ trợ giúp nào về điều này sẽ được nhiều người đánh giá cao.

Trả lời

14

Từ fine manual:

Keys và các giá trị chỉ đơn giản là chuỗi văn bản.

Vì vậy, không, bạn không thể sử dụng hstore làm giá trị trong một cửa hàng. Nếu bạn nhìn vào số hstore operatorsfunctions, bạn sẽ thấy rằng tất cả đều hoạt động với các giá trị text.

Tôi không biết bất kỳ phương pháp chuẩn nào để giả mạo băm lồng nhau. Tôi nghi ngờ bạn sẽ phải cấu trúc các phím (a.b => c cho a => b => c), sau đó bạn có thể để những thứ như thế này:

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

để lấy "một" miếng mỗi doc rằng có {b => ..., c => ...} "sub-băm" .

Ngoài ra còn có một số JSON type sắp ra mắt có thể phù hợp hơn với nhu cầu của bạn. Nhưng, bạn sẽ phải chờ đợi và tôi không chắc chắn what the final implementation will look like.

+1

Nếu điều này không cung cấp cho bạn muốn, bạn có thể đúc hstore thành văn bản và sau đó thoát khỏi dấu ngoặc kép để nhận chuỗi có thể được lưu dưới dạng giá trị trong một cửa hàng, nhưng có thể sẽ không thuận tiện để sử dụng. Bạn có thể muốn xem xét việc chuẩn hóa dữ liệu nhiều hơn một chút. – kgrittn

+0

Cảm ơn bạn đã xóa thông tin đó, tôi đánh giá cao điều đó. Tôi đã đọc trang đó trong hướng dẫn sử dụng (và nó là một hướng dẫn sử dụng tốt) nhưng nó thậm chí không có một ví dụ về một chèn, vì vậy tự hỏi có lẽ nếu có nhiều ví dụ phức tạp hơn đã được bỏ ra quá. @kgrittn Tôi nghĩ rằng việc đúc sẽ là con đường tôi kết thúc, tôi không cần dữ liệu chuẩn hóa trong trường hợp này, (chỉ là một tài liệu như một blob thực sự), trừ khi đó là cách duy nhất để có được tài liệu vào cơ sở dữ liệu! – iain

0

Nếu bất kỳ ai nhìn thấy điều này xảy ra khi sử dụng ActiveRecord, Nested Hstore cho phép bạn lưu trữ băm lồng nhau trong một cửa hàng. Nó tuần tự hóa các giá trị hstore bằng cách sử dụng JSON và cũng hỗ trợ một số cấu trúc dữ liệu khác.

Các vấn đề liên quan