2008-09-24 8 views
8

Rails utilise le concept des migrations pour gérer les modifications de modèle à l'aide de l'API ActiveRecord.Modifications du modèle de document CouchDB?

CouchDB utilise JSON (cartes et tableaux imbriqués) pour représenter ses objets de modèle. En travaillant avec CouchDB jusqu'à présent, je ne vois pas de bonnes façons de reconnaître quand la structure du document a changé (autre que d'être discipliné en tant que développeur), ou de migrer des documents d'un ancien vers un nouveau modèle.

Existe-t-il des fonctionnalités existantes ou avez-vous les meilleures pratiques pour gérer les modifications de modèle dans CouchDB?

Répondre

9

Temps pour le lavage de cerveau RDBMS. :)

L'un des plus grands points de la conception sans schéma de couchdb vise directement à éviter les migrations. La représentation JSON des objets permet de simplement taper vos objets. Par exemple, étant donné que vous avez une application Web de type blog avec des messages et tout ce que les gens peuvent stocker dans un blog. Vos documents postaux ont des champs comme auteur, titre, créé à, etc. Maintenant vous venez et réfléchissez à vous-même, "Je devrais suivre la phase dans laquelle se trouve la lune lorsque je publie mes messages ..." vous pouvez commencer à ajouter moon_phase comme un attribut aux nouveaux messages. Si vous voulez être complet, vous pouvez revenir en arrière et ajouter moon_phase aux anciens messages, mais ce n'est pas strictement nécessaire.

Dans vos vues, vous pouvez accéder à moon_phase en tant qu'attribut. Et ce sera nul ou provoquera une exception ou quelque chose. (Pas un expert JS, je pense que nul est la bonne réponse)

Chose est, cela n'a pas vraiment d'importance. Si vous avez envie de changer quelque chose, changez-le. Cependant, assurez-vous que vos opinions comprennent ce changement. Ce qui dans mon expérience ne nécessite pas vraiment beaucoup.

Aussi, si vous êtes vraiment paranoïaque, vous pouvez stocker un attribut de version/type comme dans:

{ 
    _id: "foo-post", 
    _rev: "23490AD", 
    type: "post", 
    typevers: 0, 
    moon_phase: "full" 
} 

espoir qui aide.

3

Check out ActiveCouch: http://code.google.com/p/activecouch/

CouchDB est schéma moins sur le but, donc il n'y a pas 1 à 1 cartographie des concepts des migrations ActiveRecord à un équivalent CouchDB. Cependant, ActiveCouch inclut des migrations pour les "vues" de CouchDB.

+1

On dirait qu'activecouch est maintenant sur GitHub - http://github.com/arunthampi/activecouch/tree/master – Evan

3

Si vous voulez avoir des schémas et que vous voulez toujours utiliser CouchDB, vous obtenez une "différence d'impédance".

Néanmoins, avoir des "migrations" n'est pas si difficile. Ajoutez un élément schema_version à chaque document. Ensuite, ayez votre "fonction de lecture de document" inclure la mise à jour. Quelque chose comme ceci:

def read(doc_id): 
    doc = db.get(doc_id) 
    if doc.schema_version == 1: 
     # version 1 had names broken down too much 
     doc.name = "%s %s" % (doc.first, doc.last) 
     del doc.first 
     del doc.last 
     doc.schema_version = 2 
     db.put(doc) 
    if doc.schema_version == 2: weight 
     # version 2 used kg instead of g 
     doc.weight_g = doc.weight_kg * 1000 
     del doc.volume_kg 
     doc.schema_version = 3 
     db.put(doc) 
    return doc 

Si vous souhaitez mettre à jour l'ensemble DB à la fois juste appeler read(doc_id) pour chaque document.

Questions connexes