2012-06-17 7 views
9

मुझे यह भी यकीन नहीं है कि पोस्टग्रेर्स के एचस्टोर डेटा प्रकार में नेस्टेड हैंश हो सकते हैं, और यदि वे कर सकते हैं, तो उन्हें कैसे सम्मिलित करें?क्या यह संभव है, और पोस्टग्रेस्क्ल के एचस्टोर प्रकार में नेस्टेड हैश के लिए वाक्यविन्यास क्या है?

यहाँ क्या मैं अब तक की कोशिश की है:

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

यदि यह संभव नहीं है, वहाँ एक वर्तमान स्वीकृत मानक/नेस्ट हैश के साथ काम करने के लिए मुहावरा है - शायद उन्हें अलग खींच और पहचान-पत्र का उपयोग कर उन्हें?

इसके साथ कोई भी मदद की सराहना की जाएगी।

उत्तर

14

fine manual से:

कुंजी और मूल्यों बस पाठ हैं।

तो, नहीं, आप एक hstore में एक मूल्य के रूप में एक hstore का उपयोग नहीं कर सकते हैं। यदि आप hstore operators और functions देखते हैं तो आप देखेंगे कि वे सभी 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'] 

प्रत्येक doc की "एक" हिस्सा उठाने का {b => ..., c => ...} "उप हैश" है ।

एक JSON type भी आ रहा है जो आपकी आवश्यकताओं के लिए बेहतर हो सकता है। लेकिन, आपको इसके लिए इंतजार करना होगा और मुझे यकीन नहीं है कि what the final implementation will look like

+1

यदि यह आपको नहीं देता है, तो आप टेक्स्ट में एक हिस्टोर डालने में सक्षम हो सकते हैं और फिर एक स्ट्रिंग प्राप्त करने के लिए उद्धरण से बच सकते हैं जिसे एक हस्तर में मूल्य के रूप में सहेजा जा सकता है, लेकिन शायद यह नहीं होगा इस्तेमाल करने में आसान। आप डेटा को थोड़ा और सामान्य करने पर विचार करना चाहेंगे। – kgrittn

+0

इसे साफ़ करने के लिए धन्यवाद, मैं इसकी सराहना करता हूं। मैंने मैनुअल में उस पृष्ठ को पढ़ा था (और यह एक अच्छा मैनुअल है) लेकिन इसमें एक डालने का उदाहरण भी नहीं था, इसलिए शायद आश्चर्य हुआ कि अगर वहां अधिक जटिल उदाहरण भी छोड़े गए थे। @kgrittn मुझे लगता है कि कास्टिंग वह मार्ग होगा जो मैं समाप्त कर रहा हूं, मुझे इस उदाहरण में सामान्यीकृत डेटा की आवश्यकता नहीं है, (वास्तव में केवल एक दस्तावेज़ को ब्लॉब के रूप में), जब तक डेटाबेस में दस्तावेज़ प्राप्त करने का यही एकमात्र तरीका न हो! – iain

0

यदि कोई इसे देखता है तो ActiveRecord का उपयोग होता है, Nested Hstore आपको घोंसला में नेस्टेड हैश स्टोर करने देता है। यह JSON का उपयोग करके hstore मानों को क्रमबद्ध करता है और कई अन्य डेटा संरचनाओं का भी समर्थन करता है।

संबंधित मुद्दे