Pregunta

Rails usa el concepto de migraciones para lidiar con los cambios del modelo usando la API ActiveRecord.

CouchDB usa JSON (mapas y matrices anidadas) para representar sus objetos modelo.

Al trabajar con CouchDB hasta ahora, no veo buenas maneras de reconocer cuándo ha cambiado la estructura del documento (aparte de ser disciplinado como desarrollador), o de migrar documentos de un modelo antiguo a uno nuevo.

¿Existen características o tiene las mejores prácticas para manejar cambios de modelo en CouchDB?

¿Fue útil?

Solución

Tiempo para el lavado de cerebro de RDBMS. :)

Uno de los puntos más importantes del diseño sin esquema de couchdb está directamente dirigido a evitar la necesidad de migraciones. La representación JSON de los objetos hace que sea más fácil simplemente teclear sus objetos.

Por ejemplo, dado que tienes una aplicación web tipo blog con publicaciones y cualquier cosa elegante que la gente almacene en un blog. Sus documentos de publicación tienen campos como autor, título, creado en, etc. Ahora que viene y piensa, "debería hacer un seguimiento de la fase en la que se encuentra la luna cuando publico mis publicaciones ... " puedes comenzar a agregar moon_phase como un atributo a las nuevas publicaciones.

Si quieres completar, regresas y agregas moon_phase a las publicaciones anteriores, pero eso no es estrictamente necesario.

En tus vistas, puedes acceder a moon_phase como un atributo. Y será nulo o causará una excepción o algo así. (No es un experto en JS, creo que null es la respuesta correcta)

La cosa es que realmente no importa. Si tienes ganas de cambiar algo, simplemente cámbialo. Aunque asegúrate de que tus opiniones entiendan ese cambio. Lo que en mi experiencia no requiere mucho.

Además, si eres realmente paranoico, puedes almacenar un atributo de versión / tipo, como en:

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

Espero que ayude.

Otros consejos

Si te gustan los esquemas y aún quieres usar CouchDB, obtienes una " desajuste de impedancia " ;.

Sin embargo, tener " migraciones " no es tan dificil Agregue un elemento schema_version a cada documento. Luego haga que su " función de lectura de documentos " incluir actualización. Algo como esto:

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 desea actualizar toda la base de datos a la vez, simplemente llame a read (doc_id) para cada documento.

Consulte ActiveCouch .

CouchDB no tiene esquema a propósito, por lo que no hay una asignación de conceptos 1-a-1 de las migraciones de ActiveRecord a un equivalente de CouchDB. Sin embargo, ActiveCouch incluye migraciones para las 'vistas' de CouchDB.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top