2010-06-03 12 views
6

को देखते हुए इस तरह के RavenDB के रूप में है कि दस्तावेज़ डेटाबेस,, गैर संबंधपरक हैं, तो आप डेटा है कि एक से अधिक दस्तावेज़ में क्या समानता है डुप्लिकेट कैसे से बचने के हैं? यदि आप डुप्लिकेट करना ठीक है तो आप उस डेटा को कैसे बनाए रखें?मैं RavenDB जैसे दस्तावेज़ डेटाबेस में डुप्लिकेट डेटा से कैसे बच सकता हूं?

उत्तर

12
एक दस्तावेज डेटाबेस आप कुछ हद तक अपने डेटा नकल करने के लिए है के साथ

। वह डिग्री क्या है आपके सिस्टम पर निर्भर करेगी और मामलों का उपयोग करेगी।

उदाहरण के लिए हम उन्हें सेट कर सकते हैं अगर हम एक सामान्य ब्लॉग और उपयोगकर्ता समुच्चय है अप के रूप में:

public class User 
    { 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 
    } 

    public class Blog 
    { 
    public string Id { get; set; } 
    public string Title { get; set; } 

    public class BlogUser 
    { 
     public string Id { get; set; } 
     public string Name { get; set; } 
    } 
    } 

इस उदाहरण में मैं की आईडी और नाम गुणों के साथ ब्लॉग वर्ग के भीतर एक BlogUser वर्ग नेस्ट है ब्लॉग के साथ जुड़े उपयोगकर्ता कुल। मैं इन क्षेत्रों को शामिल किया है के रूप में वे केवल क्षेत्रों ब्लॉग वर्ग में रुचि रखता है हैं, यह पता करने के लिए उपयोगकर्ताओं को उपयोगकर्ता नाम या पासवर्ड जब ब्लॉग प्रदर्शित किया जा रहा है की जरूरत नहीं है।

ये घोंसले वाले वर्ग आपके सिस्टम के मामलों पर निर्भर होने जा रहे हैं, इसलिए आपको उन्हें सावधानी से डिजाइन करना होगा, लेकिन सामान्य विचार एग्रीगेट्स को आजमाने और डिजाइन करना है जिसे डेटाबेस से एक ही पढ़ने के साथ लोड किया जा सकता है और उनमें शामिल होगा उन सभी डेटा को प्रदर्शित या कुशल बनाने के लिए आवश्यक है।

यह तो क्या होता है जब User.Name अद्यतन हो जाता है का सवाल होता है।

अधिकांश दस्तावेज़ डेटाबेस के साथ आपको ब्लॉग के सभी उदाहरण लोड करना होगा जो अद्यतन उपयोगकर्ता से संबंधित हैं और Blog.BlogUser.Name फ़ील्ड को अपडेट करें और उन्हें वापस डेटाबेस में सहेजें।

रैवेन थोड़ा अलग है क्योंकि यह अद्यतनों के लिए सेट फ़ंक्शंस का समर्थन करता है, इसलिए आप RavenDB के खिलाफ एक भी अपडेट चलाने में सक्षम हैं, जो कि ब्लॉग यूज़र की तारीख होगी। बिना ब्लॉग के उपयोगकर्ताओं की संपत्ति को उन्हें लोड करना होगा और उन्हें अपडेट करना होगा व्यक्तिगत रूप से।

सभी ब्लॉग के लिए RavenDB भीतर अद्यतन (मैनुअल तरीका) कर रही हो जाएगा के लिए कोड:

public void UpdateBlogUser(User user) 
    { 
    var blogs = session.Query<Blog>("blogsByUserId") 
        .Where(b.BlogUser.Id == user.Id) 
        .ToList(); 

    foreach(var blog in blogs) 
     blog.BlogUser.Name == user.Name; 

    session.SaveChanges() 
    } 

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

+0

यह वास्तव में सेट काम करता है, का समर्थन करता है वैसे भी –

+0

अद्यतन करने के लिए तो यह कहना है कि आप किसी भी डेटा आप अन्यथा दूसरे दस्तावेज से पुनः प्राप्त करेगा और अद्यतन करने के लिए/डुप्लिकेट किए गए डेटा को बनाए रखने के सेट कार्यों का उपयोग करने की आवश्यकता होगी दोहराने चाहिए सुरक्षित है? वह अपडेट कैसा दिखता है (यह आपके उत्तर को इतना बेहतर बना देगा!)। धन्यवाद! –

+0

@ जोन मैंने इसे लंबे समय से करने का एक उदाहरण जोड़ा है, मैंने अभी तक Ravens सेट ऑपरेशंस में नहीं देखा है। मैं इसे देख लूंगा और एक उदाहरण जोड़ूंगा। –

2

अपने प्रश्न IMHO के लिए कोई नहीं "सही" जवाब नहीं है। यह वास्तव में इस बात पर निर्भर करता है कि आप जिस डेटा को डुप्लिकेट कर रहे हैं वह म्यूटेबल है।

दस्तावेज़ डीबी डिजाइन बनाम संबंधपरक के बारे में उत्तर के बहुत सारे के लिए RavenDB documentation पर एक नजर डालें, लेकिन विशेष रूप से Document Structure Design Considerations दस्तावेज़ के "संघों प्रबंधन" अनुभाग में देखें। संक्षेप में, दस्तावेज़ डीबी आईडी द्वारा संदर्भ की अवधारणाओं का उपयोग करते हैं जब वे किसी दस्तावेज़ में साझा डेटा एम्बेड नहीं करना चाहते हैं। ये आईडी एफके की तरह नहीं हैं, वे पूरी तरह से आवेदन करने के लिए आवेदन कर रहे हैं ताकि वे ईमानदारी और समाधान सुनिश्चित कर सकें।

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