मेरा एक प्रश्न है जिसे मैं पिछले कुछ समय से उत्तर देने की कोशिश कर रहा हूं लेकिन समझ नहीं पा रहा हूं:
आप CouchDB दस्तावेज़ कैसे डिज़ाइन या विभाजित करते हैं?
उदाहरण के लिए एक ब्लॉग पोस्ट लो।
यह करने के लिए अर्ध "संबंधपरक" तरीका कुछ वस्तुओं को बनाने के लिए होगा:
- पद
- उपयोगकर्ता
- टिप्पणी
- टैग
- टुकड़ा
यह बहुत अच्छा समझ में आता है। लेकिन मैं एक ही चीज़ को मॉडल करने के लिए काउचडब (सभी कारणों से बहुत बढ़िया है) का उपयोग करने की कोशिश कर रहा हूं।
वहाँ से बाहर अधिकांश ब्लॉग पोस्ट आपको यह करने का एक आसान उदाहरण देते हैं। वे मूल रूप से इसे उसी तरह से विभाजित करते हैं, लेकिन कहते हैं कि आप प्रत्येक दस्तावेज़ में 'मनमानी' गुण जोड़ सकते हैं, जो निश्चित रूप से अच्छा है। तो आपके पास CouchDB में ऐसा कुछ होगा:
- पोस्ट (टैग और स्निपेट्स के साथ डॉक्टर में "छद्म" मॉडल)
- टिप्पणी
- उपयोगकर्ता
कुछ लोग कहेंगे कि आप टिप्पणी और उपयोगकर्ता को वहां फेंक सकते हैं, इसलिए आपके पास यह होगा:
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
यह बहुत अच्छा लग रहा है और समझने में आसान है। मैं यह भी समझता हूं कि आप अपने सभी पोस्ट दस्तावेज़ों से केवल टिप्पणियों को निकालने वाले विचार कैसे लिख सकते हैं, उन्हें टिप्पणी मॉडल में लाने के लिए, उपयोगकर्ताओं और टैग के साथ भी।
लेकिन फिर मुझे लगता है, "क्यों न सिर्फ एक दस्तावेज़ में मेरी पूरी साइट डाल दी जाए?"
site {
domain: "www.blog.com"
owner: "me"
pages {
page {
title: "Blog"
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
post {
id: 18091890192984
title: "Second Post"
...
}
}
}
}
}
आप आसानी से विचार कर सकते हैं कि आप क्या चाहते थे।
फिर मेरे पास सवाल है कि आप दस्तावेज़ को छोटे दस्तावेजों में विभाजित करने के लिए, या दस्तावेजों के बीच "संबंध" बनाने के लिए कब निर्धारित करते हैं?
मुझे लगता है कि यह बहुत अधिक "ऑब्जेक्ट ओरिएंटेड" होगा, और वैल्यू ऑब्जेक्ट्स के लिए मैप करना आसान होगा, अगर इसे इस तरह विभाजित किया गया था:
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author_id: "Lance1231"
tags: ["sample", "post"]
}
}
authors {
author {
id: "Lance1231"
name: "Lance"
age: "23"
}
}
comments {
comment {
id: "comment1"
body: "Interesting Post"
post_id: 123412804910820
}
comment {
id: "comment2"
body: "I agree"
post_id: 123412804910820
}
}
... लेकिन फिर यह एक रिलेशनल डेटाबेस की तरह दिखने लगता है। और अक्सर बार मुझे कुछ ऐसी चीज़ विरासत में मिलती है जो "संपूर्ण-साइट-इन-द-डॉक्यूमेंट" की तरह लगती है, इसलिए इसे संबंधों के साथ जोड़ना अधिक कठिन है।
मैंने रिलेशनल डेटाबेस बनाम डॉक्यूमेंट डेटाबेस का उपयोग कैसे / कब किया जाए, इसके बारे में बहुत सारी बातें पढ़ी हैं, इसलिए यहाँ मुख्य मुद्दा नहीं है। मैं और अधिक सोच रहा हूँ, CouchDB में मॉडलिंग डेटा लागू करने के लिए एक अच्छा नियम / सिद्धांत क्या है।
एक अन्य उदाहरण XML फ़ाइलों / डेटा के साथ है। कुछ XML डेटा में 10+ का स्तर गहरा होता है, और मैं उसी क्लाइंट (उदाहरण के लिए पटरियों पर Ajax) का उपयोग करके कल्पना करना चाहूंगा कि मुझे JSON को ActiveRecord, CouchRest, या किसी भी अन्य रिलेशनल मैपर से रेंडर करना होगा। कभी-कभी मुझे बहुत बड़ी XML फाइलें मिलती हैं जो पूरी साइट की संरचना होती हैं, जैसे नीचे दी गई हैं, और मुझे अपने रेल एप्लिकेशन में उपयोग करने के लिए इसे वैल्यू ऑब्जेक्ट्स पर मैप करने की आवश्यकता होगी, इसलिए मुझे डेटा को क्रमबद्ध / डीसरीलाइज़ करने का दूसरा तरीका नहीं लिखना होगा। :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
तो सामान्य CouchDB प्रश्न हैं:
- आप अपने दस्तावेज़ों (रिश्तों आदि) को विभाजित करने के लिए किन नियमों / सिद्धांतों का उपयोग करते हैं?
- क्या पूरी साइट को एक दस्तावेज़ में रखना ठीक है?
- यदि हां, तो आप मनमाने ढंग से गहराई के स्तर के साथ क्रमांकन / डिसरियलाइज़िंग दस्तावेजों को कैसे संभालते हैं (जैसे ऊपर बड़ा उदाहरण, या xml उदाहरण)?
- या क्या आप उन्हें वीओ में नहीं बदलते हैं, क्या आप सिर्फ यह तय करते हैं कि "ये लोग ऑब्जेक्ट-रिलेशनल मैप के लिए बहुत नेस्टेड हैं, इसलिए मैं सिर्फ कच्चे XML / JSON विधियों का उपयोग करके उन्हें एक्सेस करूंगा"?
आपकी मदद के लिए बहुत बहुत धन्यवाद, CouchDB के साथ अपने डेटा को विभाजित करने का मुद्दा मेरे लिए यह कहना मुश्किल है "यह है कि मुझे इसे अभी से कैसे करना चाहिए"। मुझे जल्द ही वहां पहुंचने की उम्मीद है।
मैंने निम्नलिखित साइटों / परियोजनाओं का अध्ययन किया है।
- CouchDB में पदानुक्रमित डेटा
- काउचडीबी विकी
- सोफा - काउचडीबी ऐप
- CouchDB निश्चित गाइड
- PeepCode CouchDB Screencast
- CouchRest
- काउचबडी README
... लेकिन उन्होंने अभी भी इस सवाल का जवाब नहीं दिया है।