Domanda

Proprio per l'interesse di ampliare la mia conoscenza che ho iniziato a guardare le varie opzioni NoSQL. Il primo che ho visitato è RavenDB e sembra interessante. Sto ancora cercando di rompere il mio pensiero relazionale profondo, insieme con le routine tipica di manutenzione RDBMS.

Nel mio giorno per giorno di negoziazione con Entity Framework andiamo attraverso la routine di cambiamenti scripting DB, rinfrescante il modello di mappatura EF, ecc Come funziona in NoSQL roba, soprattutto RavenDB? Una volta che un app ha la vita andata come si fa a fare i cambiamenti ai vari oggetti POCO, ecc e metterlo in produzione? Che cosa succede ai dati memorizzati nelle classi di età POCO?

Non ho scavato in profondità o utilizzati Raven DB rabbia ancora. Ciò può essere evidente una volta che faccio, ma piacerebbe sapere prima mano in modo non lo faccio io stesso codice in un angolo.

Grazie, D.

È stato utile?

Soluzione

rimangono come sono - proprietà non più esistenti vengono ignorati durante il caricamento (e perso sul cambiamento), e le proprietà mancanti torneranno come nullo,

È consigliabile utilizzare operazioni basate impostati per mantenere i dati sotto controllo con modello a oggetti.

Oh, guarda me, io sono su un computer ora!

A destra in modo sostanzialmente, a trasferirsi in un negozio di documento che si sta proprio nel riconoscere che si perde alcune funzionalità e guadagnare un po 'di libertà in quanto in un database di avere uno schema up-front definito e cercando di caricare i dati che non corrispondono tale schema si tradurrà in un errore.

E 'importante riconoscere tuttavia, che v'è una differenza tra lo schema-less e la struttura-di meno, nel senso che i documenti contengono tutti la propria struttura (coppie chiave / valore che denota il nome della proprietà e il valore della proprietà).

Questo lo rende utile per l'intero "solo ottenere il" fattore di scrivere del codice e avere i dati persistenti - ma quando essendo così facile andare in giro a cambiare la struttura del codice può essere più difficile da conciliare che con i tuoi dati già persistito .

A pochi strategie si presentano a questo punto:

  • Fai la tua struttura immutabile, una volta che avete dati permanenti, versione vostre classi
  • Consentire modifica della struttura, ma operazioni insiemistiche basata sull'uso di dati di aggiornamento per abbinare nuova struttura
  • Consentire modifica della struttura, e scrivere il codice per trattare incoerenze quando caricamento dei dati

Il terzo è chiaramente una cattiva idea in quanto porterà a codice impossibile da mantenere, delle versioni vostre classi può funzionare se si sta solo la memorizzazione di eventi o altre tali dati, ma non è davvero appropriato per la maggior parte degli scenari, quindi sei di sinistra con l'opzione di mezzo.

mi consiglia di fare proprio questo, e seguendo alcune semplici regole lungo le stesse linee come ci si seguono quando si tratta di uno schema up-front in un database relazionale.

  • Utilizza il sistema VCS per determinare i cambiamenti tra le versioni distribuite
  • script di scrittura di migrazione che l'aggiornamento da una versione all'altra
  • Fare attenzione di rinomina / rimozione di proprietà - come il caricamento di un documento e salvare il documento si tradurrà in dati persi se non esistono tali proprietà sul nuovo documento

Etc.

Spero che questo è più utile: -)

Altri suggerimenti

RavenDB serializza gli oggetti .NET in formato JSON. Non v'è alcun schema.

Se si aggiungono alcuni oggetti al database, che riceveranno serializzato. Se si aggiungono alcune proprietà per il tipo che si sta serializzazione, gli oggetti che avete già memorizzato mancheranno quelle proprietà.

Questo articolo di Ayende descrive come eseguire una migrazione da 1 alla versione 2 (in questo caso modificando le proprietà "Name" a "Nome" e le proprietà "Cognome".

http://ayende.com/blog/66563/ravendb-migrations- rolling-aggiornamenti

In sostanza un ascoltatore è registrato nella DocumentStore:

documentStore.RegisterListener(new CustomerVersion1ToVersion2Converter())

impementation campione prelevato dal articolo di cui sopra:

public class CustomerVersion1ToVersion2Converter : IDocumentConversionListener
{
    public void EntityToDocument(object entity, RavenJObject document, RavenJObject metadata)
    {
        Customer c = entity as Customer;
        if (c == null)
            return;

        metadata["Customer-Schema-Version"] = 2;
        // preserve the old Name property, for now.
        document["Name"] = c.FirstName + " " + c.LastName;
        document["Email"] = c.CustomerEmail;
    }

    public void DocumentToEntity(object entity, RavenJObject document, RavenJObject metadata)
    {
        Customer c = entity as Customer;
        if (c == null)
            return;
        if (metadata.Value<int>("Customer-Schema-Version") >= 2)
            return;

        c.FirstName = document.Value<string>("Name").Split().First();
        c.LastName = document.Value<string>("Name").Split().Last();
        c.CustomerEmail = document.Value<string>("Email");
    }
}

Come ospite non tanto non hanno la gestione schema come muoversi nella tua codice in modo non c'è mai una mancata corrispondenza tra gli oggetti nel codice e quelli nel database.

La prima parte di gestire i cambiamenti è quello di assicurarsi di utilizzare un serializzatore in grado di gestire mancanti / valori extra - se un campo non è definito nei dati, imposta per nulla. Se un campo nei dati non corrisponde a una proprietà sul vostro oggetto, ignorarlo.

La maggior parte delle modifiche possono essere gestite senza alcun più di questo - o c'è un nuovo campo ed è necessario avere un valore di default per i record esistenti in ogni caso, o c'è un vecchio campo che non si cura di più

Per modifiche più complesse, come la ridenominazione / combinazione di campi o cambiare il formato dei dati, aggiungere un nuovo campo al vostro oggetto senza rimuovere quelle vecchie e avere i vostri dati di trasferimento metodo load dai vecchi campi. Quando si salva il record sarà nel nuovo formato. Questo codice può essere lasciato al suo posto in modo permanente, l'aggiornamento dei dati in base alle esigenze, oppure è possibile impostare un processo una volta per chiamare lo stesso codice per tutti gli oggetti esistenti. Si noti che a differenza di uno script SQL non c'è tempo di inattività richiesto per questo tipo di aggiornamento, anche se ci vuole molto tempo per l'esecuzione su un grande insieme di dati, perché il codice in grado di gestire entrambi i vecchi e nuovi formati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top