में जेसन को स्टोर/क्वेरी करने का एक प्रभावी तरीका चाहिए, मैं एक सेवा लागू कर रहा हूं जहां प्रत्येक उपयोगकर्ता के पास अपना स्वयं का जेसन/दस्तावेज़ डेटाबेस होना चाहिए। उदाहरण के लिए उपयोगकर्ता को जेसन दस्तावेजों से पूछने के लिए, डेटाबेस को कई दस्तावेजों से जुड़े एसीआईडी लेनदेन का भी समर्थन करना चाहिए, इसलिए मैंने सोफे/मोंगो या अन्य नोएसक्यूएल डेटाबेस का उपयोग करके त्याग दिया है (इसे रेवेनडीबी का उपयोग नहीं कर सकता क्योंकि यह यूनिक्स सिस्टम पर चलाना चाहिए)।एसक्यूएल डेटाबेस
इस बात को ध्यान में रखते हुए मैं 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 ...) पर कितनी कुशल होगी?
- क्या उपरोक्त समाधान डेटाबेस के लिए व्यवहार्य है जिसमें अंत में लाखों/अरबों जेसन दस्तावेज़ होंगे?
- क्या मेरी आवश्यकताओं को पूरा करने का कोई बेहतर तरीका है?
- क्या स्केलेबल दस्तावेज़ डेटाबेस है जो कई दस्तावेज़ों सहित एसीआईडी लेनदेन कर सकता है और यूनिक्स सिस्टम पर चलता है?
PostgreSQL 9.2 एक JSON डेटा प्रकार का समर्थन करेगा और कुछ कार्यों (जैसे जावास्क्रिप्ट में लिखा गया) के साथ उपर्युक्त होना चाहिए। उदाहरण के लिए यहां देखें: http://people.planetpostgresql.org/andrew/index.php?/archives/249-Using-PLV8-to-index-JSON.html –
देखें कि क्या कॉच डीबी आपके लिए काम करेगा: "कॉच डीबी प्रदान करता है एसीआईडी अर्थशास्त्र। यह मल्टी-वर्जन कंसुरेंसी कंट्रोल के एक रूप को कार्यान्वित करके करता है, जिसका अर्थ है कि कॉच डीबी बिना किसी संघर्ष के समवर्ती पाठकों और लेखकों की एक उच्च मात्रा को संभाल सकता है। " –
PostgreSQL के बारे में दिलचस्प युक्ति, मैं इसे देख लूंगा, धन्यवाद –