2008-09-24 11 views
8

Rails utiliza el concepto de migraciones para hacer frente a los cambios del modelo utilizando la API de ActiveRecord.Cambios en el modelo de documentos de CouchDB?

CouchDB utiliza JSON (matrices y mapas anidados) para representar sus objetos de modelo.

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

¿Existen funciones existentes o tiene mejores prácticas para manejar cambios de modelo en CouchDB?

Respuesta

9

Tiempo para RDBMS de-brainwashing. :)

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

Por ejemplo, dado que tiene una aplicación web de tipo blog con publicaciones y todo lo que la gente almacena en un blog. Tus documentos postales tienen campos como autor, título, creado en, etc. Ahora vienes y piensas: "Debería rastrear en qué fase está la luna cuando publique mis publicaciones ...", puedes comenzar a agregar moon_phase como un atributo para nuevas publicaciones.

Si quieres estar completo, regresa y agrega moon_phase a publicaciones antiguas, pero eso no es estrictamente necesario.

En sus puntos de vista, puede acceder a moon_phase como un atributo. Y será nulo o provocará una excepción o algo. (No es un experto en JS, creo que nulo es la respuesta correcta)

Lo que pasa es que realmente no importa. Si tiene ganas de cambiar algo, simplemente cámbielo. Aunque asegúrate de que tus puntos de vista entiendan ese cambio. Que en mi experiencia realmente no requiere mucho.

Además, si usted es realmente paranoico, es posible almacenar un atributo de versión/tipo, como en:

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

Espero que ayude.

3

Salida ActiveCouch: http://code.google.com/p/activecouch/

CouchDB es sin esquema a propósito, así que no hay una correspondencia 1-a-1 de los conceptos de las migraciones ActiveRecord a un equivalente de CouchDB. Sin embargo, ActiveCouch incluye migraciones para las "vistas" de CouchDB.

+1

Parece que activecouch está ahora en GitHub - http://github.com/arunthampi/activecouch/tree/master – Evan

3

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

Sin embargo, tener "migraciones" no es tan difícil. Agregue un elemento schema_version a cada documento. Luego haga que su "función de lectura de documentos" incluya la 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 sólo llamar read(doc_id) para cada documento.

Cuestiones relacionadas