Question

Juste pour l'intérêt d'élargir ma connaissance, j'ai commencé à étudier différentes options NoSQL. La première est que j'ai visité RavenDB et il semble intéressant. J'essaie toujours de briser ma pensée relationnelle profonde, ainsi que les routines de maintenance SGBDR typique.

Dans mon Dealing au jour le jour avec Entity Framework, nous passons par la routine des changements de DB de script, l'actualisation du modèle EF cartographie, etc. Comment ça marche dans des choses NoSQL, en particulier RavenDB? Une fois qu'une application a la vie révolu comment peut-on apporter des modifications aux différents objets POCO, etc., et le déployer à la production? Qu'advient-il des données stockées dans les anciennes classes POCO?

Je n'ai pas fouillé profond ou utilisé Raven DB encore en colère. Cela peut être évident une fois que je fais, mais aimerait savoir avant la main si je ne me le code dans un coin.

Merci, D.

Était-ce utile?

La solution

Ils restent comme ils sont - seront ignorés propriétés non plus existantes lors du chargement (et perdu sur le changement), et les propriétés manquantes reviendront comme nulle,

vous recommandons d'utiliser des opérations basées sur des ensembles pour conserver les données en échec avec le modèle objet.

Oh, regardez-moi, je suis sur un ordinateur maintenant!

Droit donc en gros, en déplacement dans un magasin de document que vous avez raison de reconnaître que vous perdez certaines fonctionnalités et d'acquérir une certaine liberté en ce que dans une base de données que vous avez un schéma initial défini et en essayant de télécharger des données qui ne correspondent pas ce schéma se traduira par une erreur.

Il est important de reconnaître cependant qu'il ya une différence entre schéma moins et structure moins dans la mesure où vos documents contiennent toutes leur propre structure (paires de clés / valeur indiquant le nom de la propriété et de la valeur de la propriété).

Ceci le rend utile pour toute la « juste obtenir le » facteur d'écrire un code et d'avoir vos données persistent - mais quand être si facile de se déplacer de changer la structure de votre code, il peut être plus difficile de concilier cela avec vos données déjà persistaient .

Quelques stratégies se présentent à ce stade:

  • Faites votre immuable structure une fois que vous avez les données conservées, version vos classes
  • Permettre la modification de la structure, mais l'utilisation des opérations basées sur des ensembles de données de mise à jour pour correspondre à la nouvelle structure
  • Permettre la modification de la structure, et le code d'écriture pour faire face à des incohérences lorsque les données de chargement

Le troisième est clairement une mauvaise idée que cela conduira à un code ingérable, versioning vos classes peuvent travailler si vous êtes juste stocker des événements ou d'autres données, mais ne sont pas vraiment approprié pour la plupart des scénarios, de sorte que vous êtes de gauche avec l'option intermédiaire.

Je vous conseille de faire tout cela, et suivant quelques règles simples de dans le même sens que vous souhaitez suivre lorsqu'ils traitent avec un schéma initial dans une base de données relationnelle.

  • Utilisez votre système VCS pour déterminer les changements entre les versions déployées
  • scripts de migration d'écriture que la mise à niveau d'une version à une autre
  • Méfiez-vous des renommages / suppression de propriétés - comme le chargement d'un document et l'enregistrement du document entraînera la perte de données si ces propriétés n'existent pas sur le nouveau document

Etc.

J'espère que cela est plus utile: -)

Autres conseils

RavenDB sérialise vos objets .NET au format JSON. Il n'y a pas de schéma.

Si vous ajoutez des objets à votre base de données, ils seront sérialisé. Si vous ajoutez des propriétés du type que vous sérialisation, les objets que vous avez déjà stockés seront manquants ces propriétés.

Cet article décrit comment par Ayende effectuer une migration de 1 à la version 2 (dans ce cas, changer une propriété « Nom » à « FirstName » et propriétés « LastName ».

http://ayende.com/blog/66563/ravendb-migrations- roulement mises à jour

Fondamentalement, un auditeur est inscrit dans le DocumentStore:

documentStore.RegisterListener(new CustomerVersion1ToVersion2Converter())

impementation échantillon prélevé dans l'article mentionné ci-dessus:

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");
    }
}

Vous n'avez pas tant pas de gestion de schéma que déplacer dans votre code afin qu'il n'y a jamais un décalage entre les objets dans votre code et ceux de votre base de données.

La première partie de la manipulation des changements est de vous assurer que vous utilisez un sérialiseur qui peut gérer des valeurs manquantes / supplémentaires - si un champ n'est pas défini dans les données, réglez null. Si un champ dans les données ne correspond pas à une propriété sur votre objet, l'ignorer.

La plupart des changements peuvent être manipulés sans plus que cela - soit il y a un nouveau champ et vous devez avoir une valeur par défaut pour les enregistrements existants de toute façon, ou il y a un champ vieux que vous ne se soucient pas plus

Pour des changements plus complexes tels que renommer / combiner des champs ou de modifier le format de données, ajouter un nouveau champ à votre objet sans enlever les anciens et avoir votre méthode de charge de transfert de données des anciens champs. Lorsque vous enregistrez l'enregistrement, il sera dans le nouveau format. Ce code peut être laissé en place de façon permanente, la mise à jour des données selon les besoins, ou vous pouvez mettre en place un processus unique de temps d'appeler le même code pour tous les objets existants. Notez que contrairement à un script SQL il n'y a aucun temps d'arrêt requis pour ce type de mise à jour même si elle prend beaucoup de temps à courir sur un grand ensemble de données, car le code peut gérer à la fois anciens et nouveaux formats.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top