2012-04-18 12 views
5

मैं रावेनडीबी के लिए नया हूं। मैं एक मल्टी मैप इंडेक्स सुविधा का उपयोग करने की कोशिश कर रहा हूं, हालांकि मुझे यकीन नहीं है कि यह मेरी समस्या का सबसे अच्छा तरीका है या नहीं। तो मेरे पास तीन दस्तावेज हैं: यूनिट, कार, लोग।रावेनडीबी मल्टीमैप इंडेक्स

कार दस्तावेज़ इस तरह दिखता है:

{ 
Id: "cars/123", 
PersonId: "people/1235", 
UnitId: "units/4321", 
Make: "Toyota", 
Model: "Prius" 
} 

लोग दस्तावेज़ इस तरह दिखता है:

{ 
    Id: "people/1235", 
    FirstName: "test", 
    LastName: "test" 
} 

और इकाई डॉक:

{ 
    Id: "units/4321", 
    Address: "blah blah" 
} 

यह एक संक्षिप्त उदाहरण के लिए, में मेरा असली है ऐप में और अधिक फ़ील्ड हैं, इसलिए डेटा डी-सामान्यीकरण मेरा आखिरी उपाय होगा।

मुझे बनाने और अनुक्रमण करने की आवश्यकता है कि इन तीनों दस्तावेज़ों में से एक दस्तावेज़ में शामिल हो जाएगा। कुछ इस तरह:

{ 
    CarId: "cars/123", 
    PersonId: "people/1235", 
    UnitId: "units/4321", 
    Make: "Toyota", 
    Model: "Prius" 
    FirstName: "test", 
    LastName: "test" 
    Address: "blah blah" 
} 

// same unit different person owns a different car 

{ 
    CarId: "cars/122", 
    PersonId: "people/1236", 
    UnitId: "units/4321", 
    Make: "Toyota", 
    Model: "4runner" 
    FirstName: "test", 
    LastName: "test" 
    Address: "blah blah" 
} 

एक संबंधपरक डेटाबेस में मैं सिर्फ दो का प्रयोग करेंगे आईडी से लोग और यूनिट तालिकाओं के लिए जुड़ जाता है और अपनी कार की मेज एक समग्र इकाई होगी।

यहाँ सूचकांक परिभाषा है कि मैं है:

public class MyMultiIndex : AbstractMultiMapIndexCreationTask<JoinedDocument> 
{ 
    public MyMultiIndex() 
    { 
     // creating maps 
     AddMap<Car>(cars => cars.Select(e => new { e.CarId, e.Make, e.Model, PersonId = e.PersonId, UnitId = e.UnitId, FirstName = (null)string, LastName = (null)string, Address = (nul)string })); 
     AddMap<People>(people => people.Select(e => new { CarId = (string)null, Make = (string)null, Model = (string)null, PersonId = e.Id, UnitId = (null)string, FirstName = e.FirstName, LastName = e.LastName, Address = (nul)string })); 
     AddMap<Unit>(people => people.Select(e => new { CarId = (string)null, Make = (string)null, Model = (string)null, PersonId = (null)string, UnitId = e.null, FirstName = (nul)string , LastName = (nul)string , Address = e.Address })); 

     Reduce = results => from result in results 
          group result by result.CarId 
          into g 
          select new JoinedDocument 
          { 
           CarId = g.Key, 
           PersonId = g.First(e => e.CarId == g.Key).PersonId, 
           UnitId = g.First(e => e.CarId == g.Key).UnitId, 
           Model = g.First(e => e.CarId == g.Key).Model, 
           Make = g.First(e => e.CarId == g.Key).Make, 

           **// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for people document did not work.** 

           FirstName = results.First(e => e.PersonId == g.First(ie => ie.CarId == g.Key).PersonId).FirstName, 

           **// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for people document did not work.** 

           LastName = results.First(e => e.PersonId == g.First(ie => ie.CarId == g.Key).PersonId).LastName, 

           **// this never works. It is like result set does not contain anything with this personId. It looks like AddMap for unit document did not work.** 

           UnitAddress = results.First(e => e.UnitId == g.First(ie => ie.CarId == g.Key).UnitId).LastName, 
          }; 
     Index(map => map.Model, FieldIndexing.Analyzed); 
     Index(map => map.Make, FieldIndexing.Analyzed); 
     Index(map => map.LastName, FieldIndexing.Analyzed); 
     Index(map => map.FirstName, FieldIndexing.Analyzed); 
     Index(map => map.Make, FieldIndexing.Analyzed); 
     Index(map => map.UnitAddress, FieldIndexing.Analyzed); 
    } 
} 

जब RavenDb इस सूचकांक मैं त्रुटियों को देखने जब यह मैं प्रदान की है कम समारोह को चलाने के लिए कोशिश कर रहा है चलाता है। यह त्रुटि तब फेंकता है जब मैं एक रिकॉर्ड से मिलान करने की कोशिश कर रहा हूं जहां व्यक्ति का पहला नाम और अंतिम नाम मौजूद है, वही इकाई के साथ होता है।

+0

मेलिंग सूची के साथ क्रॉस पोस्ट: https://groups.google.com/forum/?fromgroups#!topic/ravendb/Uym2tkvMaH8 –

+3

[यह पोस्ट] (http://ayende.com/blog/156225/relational -सार्चिंग-बेकार-डोनर्सक्वॉ-टी-ट्राई-टू-रीप्लिकेट-इट) इस सवाल को सीधे संबोधित करता है। –

उत्तर

1

ऐसा लगता है कि आप किसी ऑब्जेक्ट मॉडल के साथ दस्तावेज़ डेटाबेस को फिट करने का प्रयास कर रहे हैं जिसमें संबंध हैं। इस ब्लॉग में आपकी मदद कर सकता है:

Keeping a Domain Model Pure with RavenDB

ध्यान रखें कि इस RavenDB की सिफारिश उपयोग नहीं है, लेकिन कभी कभी यह आवश्यक है, और यह इसे संभाल करने के लिए एक अच्छा तरीका है।

+0

तो जैसा कि मैं समझता हूं, denormlization यहां सबसे आसान और अनुशंसित दृष्टिकोण होगा? – milagvoniduak

+1

मुझे लगता है कि अगर आप RavenDB के लिए सच रहना चाहते हैं, तो हाँ। –

+2

-1 यह एक बहुत ही भंगुर समाधान है, लेखक मॉडल को शुद्ध रखने के बारे में बात करते हैं लेकिन संबंधों का अर्थ संबंधों के अर्थ को अनदेखा करना है, जो ओआरएम के साथ काम करते समय बाहर निकलने वाले सभी बकवास की ओर जाता है। –

1

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

+0

हां, यह अनिवार्य रूप से मुझे करना था। – milagvoniduak

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