2013-02-12 11 views
7

मैं अपने अनुप्रयोग के लिए मोंगो उपयोग करना चाहते हैं $ रेफरी (DBRef) का वास्तविक उद्देश्य क्या है, और जब तक मैं मुद्दों को डिजाइन करने के बारे में सोच रहा था, मैं सवाल के साथ आया था, तो क्या DBRef के फायदे/प्रयोजनों कर रहे हैं?MongoDB

उदाहरण के लिए

:

> names = ['apple', 'banana', 'orange', 'peach', 'pineapple'] 
[ "apple", "banana", "orange", "peach", "pineapple" ] 
> for (i=0; i<5; i++) { 
... db.fruits.insert({_id:i, name:names[i]}) 
... } 
> db.fruits.find() 
{ "_id" : 0, "name" : "apple" } 
{ "_id" : 1, "name" : "banana" } 
{ "_id" : 2, "name" : "orange" } 
{ "_id" : 3, "name" : "peach" } 
{ "_id" : 4, "name" : "pineapple" } 

और मैं एक टोकरी संग्रह में उन लोगों के फल संग्रहीत करना चाहते हैं:

> db.basket.insert({_id:1, items:[ {$ref:'fruits', $id:1}, {$ref:'fruits', $id:3} ] }) 
> db.basket.insert({_id:2, items:[{fruit_id: 1}, {fruit_id: 3}]}) 
> db.basket.find() 
{ "_id" : 1, "items" : [ DBRef("fruits", 1), DBRef("fruits", 3) ] } 
{ "_id" : 2, "items" : [ { "fruit_id" : 1 }, { "fruit_id" : 3 } ] } 

क्या उन दो तकनीकों के बीच वास्तविक अंतर कर रहे हैं? मेरे लिए ऐसा लगता है कि डीबीआरआईफ़ का उपयोग करने के लिए आपको किसी भी फायदे के बिना अधिक डेटा डालना होगा .... अगर मैं गलत हूं तो कृपया मुझे सही करें।

उत्तर

5

मूल रूप से एक DBRef एक आत्म ObjectID जिसमें क्लाइंट साइड सहायक है, जो सभी ड्राइवरों (मैं सभी लगता है) में मौजूद है, आपके आवेदन को आसानी से संबंधित पंक्तियां प्राप्त करने के भीतर क्षमता प्रदान करता है का वर्णन है।

वे नहीं कर रहे हैं:

  • मिलती
  • Cascadeable संबंधों
  • सर्वर साइड संबंधों
  • हल सर्वर साइड

उन्होंने यह भी मानचित्र के भीतर इस्तेमाल नहीं कर रहे हैं कम, sharding के साथ जटिलताओं के कारण कार्यक्षमता बाहर निकाला गया था।

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

4

"MongoDB: यह निश्चित गाइड" से DBRefs आवश्यक नहीं हैं और एक MongoID भंडारण अधिक हल्के है, लेकिन DBRefs निम्नलिखित की तरह कुछ रोचक कार्यक्षमता प्रदान करते हैं:

एक दस्तावेज़ में प्रत्येक DBRef लोड हो रहा है:

var note = db.notes.findOne({"_id":20}); 
note.references.forEach(function(ref) { 
    printjson(db[ref.$ref].findOne({"_id": ref.$id})); 
}); 

वे अगर संदर्भ विभिन्न संग्रह और डेटाबेस भर में जमा हो जाती है भी उपयोगी रहे हैं के रूप में DBRef कि जानकारी शामिल है। यदि आप मोंगोइड का उपयोग करते हैं तो आपको याद रखना होगा कि कौन सा डीबी और संग्रह मोंगोइड के संदर्भ में है।

अपने उदाहरण में एक टोकरी दस्तावेज़ के आइटम सरणी फल संग्रह में संदर्भ शामिल हो सकता है, लेकिन यह भी सब्जियों को इकट्ठा। इस मामले में एक डीबीआरआईफ़ वास्तव में आसान होगा।

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

  • कोई संबंधित समस्या नहीं^_^