2012-06-25 8 views
5

में जेसन को स्टोर/क्वेरी करने का एक प्रभावी तरीका चाहिए, मैं एक सेवा लागू कर रहा हूं जहां प्रत्येक उपयोगकर्ता के पास अपना स्वयं का जेसन/दस्तावेज़ डेटाबेस होना चाहिए। उदाहरण के लिए उपयोगकर्ता को जेसन दस्तावेजों से पूछने के लिए, डेटाबेस को कई दस्तावेजों से जुड़े एसीआईडी ​​लेनदेन का भी समर्थन करना चाहिए, इसलिए मैंने सोफे/मोंगो या अन्य नोएसक्यूएल डेटाबेस का उपयोग करके त्याग दिया है (इसे रेवेनडीबी का उपयोग नहीं कर सकता क्योंकि यह यूनिक्स सिस्टम पर चलाना चाहिए)।एसक्यूएल डेटाबेस

इस बात को ध्यान में रखते हुए मैं SQL डेटाबेस के शीर्ष पर इसे लागू करने का एक तरीका समझने की कोशिश कर रहा हूं। यहाँ मैं अब तक के साथ आया है है:

CREATE TABLE documents (
    id INTEGER PRIMARY KEY, 
    doc TEXT 
); 

CREATE TABLE indexes (
    id INTEGER PRIMARY KEY, 
    property TEXT, 
    value TEXT, 
    document_id INTEGER 
) 

प्रत्येक उपयोगकर्ता इन दो तालिकाओं के साथ एक डेटाबेस है, और उपयोगकर्ता घोषित करने के लिए कौन सी फ़ील्ड वह क्वेरी करने के लिए तो सिस्टम ठीक से 'इंडेक्स पॉप्युलेट सके होता 'टेबल। इसलिए यदि उपयोगकर्ता 'ए' 'खाता' और 'आयु' द्वारा प्रश्नों को सक्षम करने के लिए अपने खाते को कॉन्फ़िगर करता है, तो हर बार जब उपयोगकर्ता उस दस्तावेज़ को सम्मिलित करता है जिसमें 'नाम' या 'आयु' संपत्ति होती है, तो सिस्टम 'इंडेक्स' तालिका, जहां 'संपत्ति' कॉलम में नाम/आयु होगी, 'मान' में संपत्ति मान होगा और 'document_id' संबंधित दस्तावेज़ को इंगित करेगा।

INSERT INTO documents (id,doc) VALUES (1, '{"name" : "Foo", "age" 43}'); 
INSERT INTO indexes (property, value, document_id) VALUES ('name', 'foo', 1); 
INSERT INTO indexes (property, value, document_id) VALUES ('age', '43', 1); 
:

'{"name" : "Foo", "age" 43}' 

यह 'अनुक्रमित' तालिका करने के लिए 'दस्तावेज' तालिका करने के लिए एक डालने और दो और आवेषण में परिणाम होगा:

उदाहरण के लिए, मान लीजिए कि उपयोगकर्ता निम्न दस्तावेज़ सम्मिलित करते हैं

'{"name": "Foo", "age": 43}' //(the queries are also json documents). 

इस क्वेरी होगा:

तब की है कि उपयोगकर्ता 'ए' सेवा निम्न क्वेरी भेजा मान लीजिए निम्नलिखित एसक्यूएल करने के लिए अनुवाद किया जा:

SELECT doc FROM documents 
WHERE id IN (SELECT document_id FROM indexes 
      WHERE document_id IN (SELECT document_id FROM indexes 
            WHERE property = 'name' AND value = 'Foo') 
      AND property = 'age' AND value = '43') 

मेरे सवालों का:

  • यह जानते हुए कि उपयोगकर्ता अपने प्रश्नों में स्थिति की एक उच्च संख्या का उपयोग करने में सक्षम हो सकता है कि (20-30 और शर्तों का कहना है की सुविधा देता है), जो सबक्वायरी घोंसले बहुत अधिक हो जाएगा, उपर्युक्त SELECT क्वेरी अधिकांश डेटाबेस सिस्टम (postgres, mysql ...) पर कितनी कुशल होगी?
  • क्या उपरोक्त समाधान डेटाबेस के लिए व्यवहार्य है जिसमें अंत में लाखों/अरबों जेसन दस्तावेज़ होंगे?
  • क्या मेरी आवश्यकताओं को पूरा करने का कोई बेहतर तरीका है?
  • क्या स्केलेबल दस्तावेज़ डेटाबेस है जो कई दस्तावेज़ों सहित एसीआईडी ​​लेनदेन कर सकता है और यूनिक्स सिस्टम पर चलता है?
+0

PostgreSQL 9.2 एक JSON डेटा प्रकार का समर्थन करेगा और कुछ कार्यों (जैसे जावास्क्रिप्ट में लिखा गया) के साथ उपर्युक्त होना चाहिए। उदाहरण के लिए यहां देखें: http://people.planetpostgresql.org/andrew/index.php?/archives/249-Using-PLV8-to-index-JSON.html –

+0

देखें कि क्या कॉच डीबी आपके लिए काम करेगा: "कॉच डीबी प्रदान करता है एसीआईडी ​​अर्थशास्त्र। यह मल्टी-वर्जन कंसुरेंसी कंट्रोल के एक रूप को कार्यान्वित करके करता है, जिसका अर्थ है कि कॉच डीबी बिना किसी संघर्ष के समवर्ती पाठकों और लेखकों की एक उच्च मात्रा को संभाल सकता है। " –

+0

PostgreSQL के बारे में दिलचस्प युक्ति, मैं इसे देख लूंगा, धन्यवाद –

उत्तर

5

आपकी indexes तालिका Entity-Attribute-Value के रूप में जाना जाता है।

ईएवी टेबल जानकारी संग्रहीत करने के लिए ठीक हैं और जब आप इकाई को जानते हैं तो इसे याद करते हैं।

(आपके मामले में, सभी indexes पंक्तियों को ढूँढने के लिए जब आप document_id पता है।) लेकिन वे भयानक दूसरी तरह के आसपास हैं: गुण-मूल्य संयोजन की आपूर्ति एक इकाई के लिए खोज करने के लिए। आपकी अंतिम क्वेरी में आपके पास क्या है। चूंकि अधिक से अधिक इकाइयां समान गुण-मूल्य संयोजन (जैसे name=foo) क्वेरी प्रदर्शन घटती हैं।

तो, अपने पहले दो सवालों के जवाब देने:
1. क्वेरी, लिखित रूप में, n उप प्रश्नों जब n गुण के लिए खोज की आवश्यकता है। n बढ़ने के साथ यह बहुत खराब होगा।
2. रिकॉर्ड की संख्या बढ़ने के साथ ही यह घट जाएगा, खासकर लाखों/अरबों रिकॉर्ड के साथ।

सामान्य रूप से, यदि आप EAV के बारे में पढ़ते हैं, तो लोग दृढ़ता से इससे दूर जाने की सलाह देते हैं।


और, बदतर अभी भी वहाँ नहीं वास्तव में एसक्यूएल के भीतर एक अच्छा विकल्प है। एक खोज को अनुकूलित करने का मानक तरीका एक इंडेक्स के साथ है, जिसे आसानी से सॉर्ट किए गए डेटा-सेट के रूप में मॉडलिंग किया जा सकता है। लेकिन इसके बाद आपको कई इंडेक्स की आवश्यकता होगी:
- पर एक सूचकांक महान है यदि आप सभी तीन कॉलम पर खोज करते हैं।
- लेकिन बेकार करता है यदि आपको परfieldZ पर खोजना है।


आप एक पारंपरिक तालिका के साथ-मॉडल को फिर से तो कर सकते हैं यह, स्तंभों की एक निश्चित संख्या के साथ है, और हर सूचकांक संयोजन क्या तुमने कभी की आवश्यकता होगी लागू करने के लिए जगह है, कि आप सबसे शक्तिशाली मॉडल होगा।

आप स्तंभों की संख्या (नई properties हर समय साथ आ रहा है) को ठीक नहीं कर सकते हैं और/या आप सूचकांक के सभी विभिन्न संयोजनों के लिए जगह नहीं है, तो आप EAV के साथ फंस कर रहे हैं। जो काम करेगा, लेकिन स्केल 'तात्कालिक' परिणामों के संदर्भ में बहुत अच्छी तरह से होगा।

नोट: यदि आप ईएवी के साथ चिपकते हैं, तो क्या आपने इस क्वेरी संरचना का परीक्षण किया है?

SELECT 
    document_id 
    FROM 
    indexes 
    WHERE 
     (property = 'name' AND value = 'Foo') 
    OR (property = 'age' AND value = '43') 
    GROUP BY 
    document_id 
    HAVING 
    COUNT(*) = 2 

मतलब यह है कि (document_id, property, value) अद्वितीय है। अन्यथा एक दस्तावेज़ में ('name', 'foo') दो बार हो सकता है, और इसलिए COUNT(*) खंड पास करें।

+0

मुझे नहीं लगता कि 'इंडेक्स' तालिका 'एंटिटी-एट्रिब्यूट-वैल्यू' विधि का उपयोग कर डेटा मॉडलिंग कर रही है, यह 'दस्तावेज़' तालिका में 'मैन्युअल रूप से' इंडेक्स स्कीमलेस डेटा का एक तरीका है। मैं यह उल्लेख करना भूल गया कि नाम और मूल्य कॉलम भी अनुक्रमित किए जाएंगे, क्या आपको नहीं लगता कि प्रश्न तेजी से चलने के लिए तैयार होंगे? –

+1

@ थियादोड अररुडा - दुर्भाग्यवश, यह बिल्कुल ईएवी है। आपके 'दस्तावेज़' 'संस्थाएं 'हैं। आपकी 'गुण' 'विशेषताएँ 'हैं। और आपके 'मूल्य' हैं, ठीक है, मुझे लगता है कि आपको वह बिंदु मिल गया है। इंडेक्सिंग '(प्रॉपर्टी, वैल्यू, डॉक्यूमेंट_आईडी) 'निश्चित रूप से चीजों को बेहतर नहीं करेगा, लेकिन यह न्यूनतम काम करने की धारणा है। आपको अभी भी ईएवी की सभी कठिनाइयां हैं। यह हमेशा 'पारंपरिक' टेबल की तुलना में काफी धीमी होगी।और किसी भी दिए गए संपत्ति के लिए समान मूल्य साझा करने वाले अधिक रिकॉर्ड, धीमे हो जाएंगे। और जितनी अधिक संपत्तियां आप खोजते हैं, धीमे अभी भी। – MatBailie

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