2011-07-30 22 views
10

मैंने इस पर कुछ विचारों को देखा है जैसे बनाना, अपडेट, सम्मिलित करें, हटाएं (सीआरयूडी) का उपयोग करें और निकालें। अच्छी बात है। हालांकि, मैंने जटिलता से निपटने के तरीके पर अभी तक बहुत कुछ नहीं देखा है। मुझे बताया गया है, "बस आपको आवश्यक प्रत्येक क्वेरी प्रकार के लिए एक विधि लिखें"।क्या NOSQL डेटा लेयर डिज़ाइन पैटर्न हैं?

अधिकांश एनओएसक्यूएल मुझे तब तक ठीक लगता है जब तक कि मैं क्वालीफायर (जहां एक खंड) के बारे में सोचना शुरू करता हूं - वहां कई बदलाव हो सकते हैं। क्या विधि नाम & तर्क सम्मेलनों का उपयोग करके, समझदार तरीके से क्वालिफायर को कार्यान्वित करने के लिए पहले से ही एक अच्छी योजना है? शायद कुछ प्रकार की क्रिया/संज्ञा योजना है जो अच्छी तरह से काम करती है, लेकिन जो कि अपने आप में एक भाषा नहीं है।

मैं 'दाएं' उत्तर के बाद नहीं हूं ... मुझे आशा है कि कुछ ऐसे स्कूल हैं जो मैं सीख सकता हूं। http://ayende.com/blog/4562/ravendb-index-management

हम एक वर्ग पर एक से अधिक सूचकांक को लागू कर सकते हैं:

RavenDB के निर्माता से इस ब्लॉग पोस्ट मिल गया?

मुझे यह भी पता चला कि अज्ञात प्रतिनिधियों को क्रमबद्ध करना संभव हो सकता है http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/06/20/how-to-serialize-anonymous-delegates.aspx मुझे लगता है कि यह संभव है, तो वे इस तरह कुछ उपयोग कर सकते हैं।

लेकिन अगर हमारे पास एक ही असेंबली (जैसे सिल्वरलाइट) तक पहुंच नहीं है तो क्या होगा। इस पोस्ट को यहां मिला: http://ayende.com/blog/4766/accessing-ravendb-from-silverlight

क्या IEnumerable<T> ऑब्जेक्ट क्लाइंट-साइड या सर्वर-साइड खोजा गया है? हम एक अद्वितीय आईडी पर लॉक किए बिना, तार पर वापस भेजने से पहले परिणाम सेट को कम करने में एनओएसक्यूएल में सर्वर पक्ष कैसे प्राप्त कर सकते हैं?

अद्यतन: मैंने रावेनडीबी से अयेंडे को ईमेल करना समाप्त कर दिया। उन्होंने कहा कि कृपया सवाल है कि मैं (नीचे) था उत्तर दिया:

आप क्या कर सकते हैं लिखने है:

public IEnumerable<T> FindAll(Expression<Func<T,bool>> whereClause) 
    { 
     return session.Query<T>().Where(whereClause).ToList(); 
    } 

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

यदि आप पर्याप्त अस्थायी अनुक्रमणिका से पूछते हैं, तो RavenDB इसे स्थायी बना देगा। इस प्रकार, स्वयं अपने परिचालन को अनुकूलित करता है।

क्या आप "सिल्वरलाइट" उपयोग के मामले से बहुत दूर थे?

हम पूरी तरह से सिल्वरलाइट का समर्थन कर रहे हैं।

क्या RavenDB एक से अधिक इंडेक्स सर्वर पक्ष को संभाल सकता है?

हां। असल में, हमारे पास कुछ ग्राहक हैं जिनके पास 500 सूचकांक हैं जिनमें कोई समस्या नहीं है।

एक क्वेरी भाषा (यानी FindAll/जहां/प्रतिनिधि) को डिजाइन करने पर RavenDB

पर Ayende से जानकारी का अंत, मोंगो JSON के माध्यम से इस का एक छोटा प्राप्त करने के लिए लग रहे हैं ... http://www.mongodb.org/display/DOCS/Indexes मैं मैं और अधिक पता था कि इच्छा इसके बारे में। Serializing anonymous delegates in C# serializing पर http://www.mongodb.org/display/DOCS/MapReduce

एक दिलचस्प धागा:

यह करीब लगता है। यह सीधे प्रासंगिक नहीं है ... लेकिन मैं सिर्फ हुड के नीचे देखने की कोशिश कर रहा हूं इसलिए मुझे संभावितताओं के बारे में और पता है।

+0

प्रासंगिक प्रश्न [रेवेन डीबी के साथ डाटा एक्सेस आर्किटेक्चर] (http://stackoverflow.com/questions/5909400/data-access-architectures-with-raven-db) – oleksii

+0

@olesii। धन्यवाद। मैंने एक नज़र भर देखा। ऐसा लगता है कि उन्होंने इसी तरह के मुद्दों को मारा है। खोजें क्या? आप क्वालीफायर कैसे लगा सकते हैं? मैं देख सकता हूं कि कैसे कैशिंग, या सदस्यता आधारित परिदृश्य अच्छी तरह से काम करेंगे, लेकिन ऐसा कुछ भी नहीं जो उससे अधिक जटिल है। मैं उत्सुक हूँ। – sgtz

+0

मैंने एक उत्तर पोस्ट किया। वर्तमान भंडार के साथ मैं 'खोज' करने में सक्षम हूं, जो आवश्यक होने पर सभी रिकॉर्ड वापस कर सकता है। लेकिन ... मुझे यकीन नहीं है कि यह बिल्कुल सही तरीका है। लोगों को यह कहने का अधिकार है कि मैं यहां बिल्कुल गलत हूं। हालांकि मैं कोई बेहतर समाधान खोजने में विफल रहा। – oleksii

उत्तर

4

मुझे यकीन नहीं है कि यह NoSQL पर लागू है, लेकिन मैंने रेवेन डीबी के साथ जेनेरिक रिपोजिटरी पैटर्न लागू किया और यहां एक स्निपेट है।

सबसे पहले, मैं कुछ इंटरफेस

internal interface ISessionProvider : IDisposable 
{ 
    IDocumentSession OpenSession(); 
    void CloseSession(); 
} 

public interface IDataAccessManager : IDisposable 
{ 
    void Initialize(); 
    void OpenSession(); 
    void CloseSession(); 
} 

public interface IRepository<T> where T : Entity 
{ 
    IQueryable<T> Query(); 
    IEnumerable<T> Find(Func<T, bool> exp); 
    T FirstOrDefault(Func<T, bool> exp); 

    void Delete(T entity); 
    void Add(T entity); 
    void Save(); 

    string PutAttachment(string key, byte[] data); 
    Attachment GetAttachment(string key); 
    void DeleteAttachment(string key); 
} 

परिभाषित और यह एक छोटा कार्यान्वयन

internal class SessionProvider : ISessionProvider 
{ 
    ... 

    public IDocumentSession OpenSession() 
    { 
     session = store.OpenSession(); 
     return session; 
    } 

    public void CloseSession() 
    { 
     if (session != null) 
     { 
      session.Dispose(); 
     } 
    } 
} 

public class DataAccessManager : IDataAccessManager 
{ 
    ... 

    public void Initialize() 
    {  
     store = new DocumentStore 
     { 
      ConnectionStringName = ConnectionString 
     }; 
     store.Initialize(); 
     store.DatabaseCommands.EnsureDatabaseExists(dbName); 

     provider = new SessionProvider(store); 
    } 

    public void OpenSession() 
    { 
     session = provider.OpenSession(); 
    } 

    public void CloseSession() 
    { 
     provider.CloseSession(); 
    } 
} 


public class Repository<T> : IRepository<T> where T : Entity 
{ 
    ... 

    public IEnumerable<T> Find(Func<T, bool> exp) 
    { 
     return AsQuaribale().Where(exp); 
    } 

    public void Add(T entity) 
    { 
     session.Store(entity); 
    } 

    public void Save() 
    { 
     session.SaveChanges(); 
    } 

    public string PutAttachment(string key, byte[] data) 
    { 
     Guid? etag = null; 
     var metadata = new RavenJObject 
     { 
      {"owner", Thread.CurrentPrincipal.Identity.Name}, 
      {"filename", key} 
     }; 
     session.Advanced.DatabaseCommands.PutAttachment(key, etag, data, metadata); 

     return key; 
    } 

    public Attachment GetAttachment(string key) 
    { 
     return session.Advanced.DatabaseCommands.GetAttachment(key); 
    } 

    private IQueryable<T> AsQuaribale() 
    { 
     return session.Query<T>().Customize(x => x.WaitForNonStaleResultsAsOfNow(Timeout)); 
    } 
} 

प्रयोग नमूना

private void SendData() 
{ 
    try 
    { 
     dataManager.OpenSession(); 
     repository = new Repository<MyDomainType>(); 

     ... 

     foreach (string path in paths) 
     {   
      //read file to memory 
      byte[] data = File.ReadAllBytes(path); 
      string fName = Path.GetFileName(path); 
      myDomainType.Name = fName; 

      //save data in memory and metadata to the database 
      string key = repository.PutAttachment(
       myDomainType.Id.ToString(), data); 

      repository.Add(myDomainType); 
     } 

     repository.Save(); 
    } 
    catch (Exception ex) 
    { 
     AppManager.LogException(ex); 
    } 
    finally 
    { 
     dataManager.CloseSession(); 
     dataManager.Dispose();  
    } 
} 

नमूना बनाने के लिए परीक्षण, जो ढूँढें का उपयोग करें (FirstOrDefault)

पर जोर देने के लिए विधि
[Test] 
public void CreateValueTest() 
{ 
    var repository = ContainerService.Instance.Resolve<IRepository<DummyType>>(); 
    var expected = new DummyType(); 
    repository.Add(expected); 
    repository.Save(); 
    DummyType actual = repository.FirstOrDefault(item => item.Id == expected.Id); 

    Assert.IsTrue(expected == actual); 
} 
+0

@olesii +1 धन्यवाद। बुरा नहीं। मुझे लगता है कि आप कुछ और साफ करने के लिए अनाम विधियों का उपयोग कर सकते हैं। क्या आपका खोज (Func एक्सप) क्लाइंट-साइड या सर्वर-साइड निष्पादित करता है? – sgtz

+0

@sgtz गुणवत्ता में सुधार करने के लिए उत्तर को संपादित करने के लिए स्वतंत्र महसूस करें (अनाम विधियां जोड़ें)। देखें, मुझे लगता है कि सर्वर पर अभिव्यक्ति exequted है। यह सिर्फ क्लाइंट, रावेन डीबी पर पार्स किया गया है, फिर बस 'session.Query () ...'। मुझे 99% यकीन है कि रावेन डीबी क्लाइंट को सभी इकाइयों को लोड करने के लिए मजबूर नहीं करता है और उन्हें वहां फ़िल्टर करता है - नहीं, इसके बजाय यह IQuariable में ले जाता है और इसे अपने सर्वर की तरफ निष्पादित करता है। इस प्रकार केवल आवश्यक फ़िल्टर किए गए परिणाम को फिर से शुरू किया गया। – oleksii

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