Question

Rails utilise le concept de migration pour traiter les modifications de modèle à l'aide de l'API ActiveRecord.

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 bonne façon de savoir quand la structure du document a changé (autrement que d'être discipliné en tant que développeur) ou de migrer des documents d'un ancien modèle à un nouveau.

Existe-t-il des fonctionnalités existantes ou existe-t-il des pratiques recommandées pour gérer les modifications de modèle dans CouchDB?

Était-ce utile?

La solution

Il est temps de supprimer le lavage de cerveau dans les SGBDR. :)

L’un des principaux atouts de la conception sans schéma de couchdb vise directement à éviter le besoin de migrations. La représentation JSON des objets facilite la saisie de vos objets.

Par exemple, étant donné que vous avez une application Web de type blog avec des publications et tout ce que les gens aiment à stocker dans un blog. Vos documents de poste ont des champs tels que auteur, titre, créé sur, etc. Maintenant, vous vous posez la question suivante: "Je dois suivre la phase dans laquelle se trouve la lune lorsque je publie mes messages ...". vous pouvez simplement commencer à ajouter moon_phase en tant qu'attribut aux nouveaux messages.

Si vous voulez être complet, vous ajouterez 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 en JS, je pense que null est la bonne réponse)

La chose est, cela n'a pas vraiment d'importance. Si vous avez envie de changer quelque chose, changez-le. Assurez-vous que votre point de vue comprend ce changement. Ce qui dans mon expérience n’exige pas vraiment grand chose.

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

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

L’espoir que cela aide.

Autres conseils

Si vous souhaitez utiliser des schémas et souhaitez toujours utiliser CouchDB, vous obtenez un "décalage 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 ça:

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 à niveau l'intégralité de la base de données en une seule fois, appelez simplement read (doc_id) pour chaque document.

Découvrez ActiveCouch .

CouchDB est délibérément dépourvu de schéma. Il n’existe donc pas de mappage un à un des concepts issus des migrations d’ActiveRecord vers un équivalent de CouchDB. Cependant, ActiveCouch inclut les migrations pour les "vues" de CouchDB.

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