Pergunta

Rails utiliza o conceito de migrações para lidar com as mudanças do modelo usando a API do ActiveRecord.

CouchDB usa JSON (aninhados mapas e matrizes) para representar seus objetos de modelo.

Ao trabalhar com o CouchDB até agora, não vejo boas maneiras de reconhecer quando a estrutura do documento foi alterado (excepto ser disciplinado como um desenvolvedor), ou para migrar documentos a partir de um antigo para um novo modelo.

Existem recursos existentes ou você tem as melhores práticas para lidar com as mudanças do modelo no CouchDB?

Foi útil?

Solução

Time for RDBMS de-lavagem cerebral. :)

Um dos maiores pontos de projeto sem esquema de couchdb está diretamente destinada a evitar a necessidade de migrações. A representação JSON de objetos facilita a apenas pato digitar seus objetos.

Por exemplo, uma vez que você tiver um aplicativo web tipo de blog com posts e tudo o que fantasia pessoas armazenam em um blog. Seus documentos pós têm campos como autor, título, criado no, etc. Agora você vem e pensa consigo mesmo: "Eu deveria acompanhar o que fase a lua está em quando eu publicar minhas mensagens ..." você pode simplesmente começar a adicionar moon_phase como um atributo para novas mensagens.

Se você quiser ser completa você voltar e adicionar moon_phase para posts antigos, mas isso não é estritamente necessário.

Em seu ponto de vista, você pode acessar moon_phase como um atributo. E vai ser nulo ou causar uma exceção ou algo assim. (Não é um especialista JS, eu acho nula é a resposta certa)

A coisa é, isso realmente não importa. Se você sentir vontade de mudar algo apenas mudá-lo. Apesar de se certificar que seu vistas entender essa mudança. Que na minha experiência realmente não exigem muito.

Além disso, se você é realmente paranóico, você pode armazenar um atributo de versão / tipo, como em:

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

Espero que ajude.

Outras dicas

Se você estiver em ter esquemas e ainda quer usar CouchDB você receber uma "diferença de impedância".

No entanto, tendo "migrações" não é tão difícil. Adicione um elemento schema_version para cada documento. Então, a sua "função de leitura de documentos" incluem atualização. Algo parecido com isto:

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

Se você quiser atualizar toda a DB ao mesmo tempo read(doc_id) chamada apenas para cada documento.

Confira ActiveCouch .

CouchDB é sem esquema de propósito, então não há um mapeamento de 1 para 1 de conceitos das migrações ActiveRecord para um CouchDB equivalente. No entanto, ActiveCouch não inclui migrações para 'pontos de vista' do CouchDB.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top