2009-10-24 12 views
36

कुंजी-वैल्यू डेटाबेस में निर्देशिका पदानुक्रम/पेड़ को संग्रहीत करने के लिए एक स्वच्छ/कुशल विधि क्या है (मेरे मामले में मोंगोडीबी लेकिन उनमें से कोई भी)?एक कुंजी-मूल्य डेटा स्टोर में निर्देशिका पदानुक्रम संग्रह

उदाहरण के लिए एक वृक्ष संरचना

- Cars 
    + Audi 
    + BMW 
     - M5 
    + Ford 
- Color 
    + Red 
     - Apple 
     - Cherry 
    + Purple 
- Funny 

विधि मैं अब का उपयोग कर रहा है, यह करने के लिए प्रत्येक वस्तु लिंक माता पिता

{ 
    dir: "red" 
    parent-dir: "color" 
} 

यह बहुत ही कुशल/तेजी से डालें और के किसी भी पहलू को पुन: व्यवस्थित करने के लिए बनाता है पेड़ (उदाहरण के लिए यदि मैं रेड और उसके सभी बच्चों को कार निर्देशिका में ले जाना चाहता हूं)।

लेकिन जब मैं सभी उपनिर्देशिकाओं और उनके बच्चों को एक दी गई निर्देशिका के लिए दोबारा जोड़ना चाहता हूं तो यह विधि बेकार हो जाती है। यह कुशल पार्स करने के लिए मैं उदाहरण

{ 
    dir: "red" 
    children: "audi, bmw, ford" 
} 

{ 
    dir: "bmw" 
    children: "m5" 
} 

के लिए एक ढांचा हो सकता है लेकिन अगर मैं पेड़ संशोधित करना चाहते हैं, वस्तुओं की एक पूरी गुच्छा को छुआ और संशोधित करने की जरूरत बनाने के लिए।

क्या केवी स्टोर में निर्देशिका संरचना को संग्रहीत करने के लिए कोई और तरीका है?

+3

वास्तव में यह प्रश्न अधिक सामान्य है ... केवी डेटा स्टोर में किसी भी पदानुक्रमित डेटा को स्टोर करने का सबसे अच्छा तरीका क्या है ... – dicroce

+1

+1: मुझे इस केवी-प्रवृत्ति के बारे में पता नहीं था। मैंने कुछ नया सीखा, धन्यवाद। – slashmais

+1

पीएस: मेरे जैसे लोगों के लिए, यहां केवी का एक सभ्य प्रदर्शन है: http://www.readwriteweb.com/enterprise/2009/02/is-the-relational-database-doomed.php – slashmais

उत्तर

57

जिस विधि का आप वर्तमान में उपयोग करते हैं उसे adjacency list model कहा जाता है।

एक (संबंधपरक) डेटाबेस में पदानुक्रमित डेटा स्टोर करने का एक और मॉडल nested set model है। इसका implementation in SQL databases is well known है। this article for the modified preorder tree traversal algorithm भी देखें।

एक बहुत ही सरल विधि: आप वस्तु प्रति एक पथ संग्रहीत कर सकती है - उन के साथ यह NoSQL डेटाबेस में पेड़ क्वेरी करने के लिए आसान होना चाहिए:

{ path: "Color", ... } 
{ path: "Color.Red", ... } 
{ path: "Color.Red.Apple", ... } 
{ path: "Color.Red.Cherry", ... } 

जब नोड्स हटाया या नाम बदलकर कुछ रास्तों अद्यतन किया जाना चाहिए किया जाएगा। लेकिन सामान्य रूप से, यह विधि आशाजनक लगती है। आपको बस एक विशेष चरित्र को विभाजक के रूप में आरक्षित करना होगा। स्टोरेज स्पेस ओवरहेड नगण्य होना चाहिए।

संपादित करें: इस विधि materialized path

अंत में कहा जाता है, यहाँ a comparison of different methods for hierarchical data in NOSQL databases है।

+3

पेन्ग स्टोर करने की संभावनाओं के बारे में मोंगोडीबी दस्तावेज़ीकरण में एक बहुत अच्छा लेख है: http: //www.mongodb .org/डिस्प्ले/डीओसीएस/पेड़ + + मोंगोडीबी – amiuhle

+0

@ फ्रुन्सी इस जानकारी को स्टोर करने के लिए ज़ूकीपर का उपयोग क्यों न करें क्योंकि यह पदानुक्रम के लिए निर्मित समर्थन में आता है – Itachi

+0

@ इटाची: क्यों? क्यों नहीं? यह ऑफ-विषय जैसा है जैसे कि मैं आपसे पूछूंगा कि कार में गाड़ी चलाते समय आप हमेशा बाल सुरक्षा सीट का उपयोग क्यों नहीं करते हैं। – Frunsi

1

मैं NoSQL अनुभव की एक बड़ी राशि की जरूरत नहीं है, तो यह एक निश्चित जवाब नहीं है, लेकिन यहाँ है मैं इसे कैसे दृष्टिकोण चाहते हैं:

मैं संभावना अपना पहला दृष्टिकोण, आप जहां का प्रयोग करेंगे:

{ 
    dir: 'dir_name', 
    parent_dir: 'parent_dir_name' 
} 

और फिर निर्देशिका के बच्चों से तुरंत पूछने के लिए मानचित्र-कमी सेट अप करें। MongoDB के नक्शे-को कम कार्यक्षमता अभी भी विकास शाखा में ही उपलब्ध है और मैं इसके साथ अभी तक काम नहीं किया है, लेकिन CouchDB (और मैं कुछ संशोधन के साथ मान, MongoDB में,) में आप की तरह कुछ कर सकता है:

map: 
function(doc) { 
    emit(doc.parent_dir, doc.dir); 
} 

reduce: 
function(key, values) { 
    return(values); 
} 

जो आपको प्रत्येक मूल निर्देशिका के लिए उप-निर्देशिकाओं की सूची देगा।

-1

मैं आईडी डेटा वस्तुओं के के लिए एक ढेर के भंडारण के सुझाव देते हैं। मुझे लगता है कि यह सबसे अच्छी योजना है। यदि आपको बहुत सारी चीजों की आवश्यकता है और बहुत सारी चीजें किसी भी ढेर तत्व को अन्य ढेर के लिए एक सूचकांक हो सकता है।

जैसे

{ "id:xxx", "id:yyy", "sub-heap-id:zzz"....}

यदि यह स्पष्ट पोस्ट एक टिप्पणी नहीं है और मैं और अधिक की व्याख्या जब मैं घर मिल जाएगा।