CouchDB Documento modelo Alterações?
-
02-07-2019 - |
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?
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.