Tenho uma pergunta que estou tentando responder há algum tempo, mas não consigo descobrir:
Como você projeta ou divide documentos do CouchDB?
Veja uma postagem no blog, por exemplo.
A maneira semi-relacional de fazer isso seria criar alguns objetos:
- Postar
- Do utilizador
- Comente
- Tag
- Snippet
Isso faz muito sentido. Mas estou tentando usar o couchdb (por todas as razões pelas quais isso é ótimo) para modelar a mesma coisa e tem sido extremamente difícil.
A maioria das postagens do blog fornece um exemplo fácil de como fazer isso. Eles basicamente dividem da mesma maneira, mas dizem que você pode adicionar propriedades 'arbitrárias' a cada documento, o que é definitivamente bom. Então, você teria algo parecido com isto no CouchDB:
- Postagem (com tags e trechos de modelos "pseudo" no documento)
- Comente
- Do utilizador
Algumas pessoas diriam até que você poderia lançar o Comentário e o Usuário, então você teria o seguinte:
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
Parece muito bom e fácil de entender. Também entendo como você pode escrever visualizações que extraíram apenas os comentários de todos os seus documentos de postagem, para inseri-los nos modelos de comentários, o mesmo com Usuários e Tags.
Mas então penso: "por que não colocar todo o site em um único documento?":
site {
domain: "www.blog.com"
owner: "me"
pages {
page {
title: "Blog"
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
post {
id: 18091890192984
title: "Second Post"
...
}
}
}
}
}
Você pode facilmente criar visualizações para encontrar o que deseja com isso.
Então a pergunta que tenho é: como você determina quando dividir o documento em documentos menores ou quando fazer "RELAÇÕES" entre os documentos?
Eu acho que seria muito mais "orientado a objetos" e mais fácil mapear para objetos de valor, se estivesse dividido assim:
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author_id: "Lance1231"
tags: ["sample", "post"]
}
}
authors {
author {
id: "Lance1231"
name: "Lance"
age: "23"
}
}
comments {
comment {
id: "comment1"
body: "Interesting Post"
post_id: 123412804910820
}
comment {
id: "comment2"
body: "I agree"
post_id: 123412804910820
}
}
... mas depois começa a parecer mais um Banco de Dados Relacional. E, muitas vezes, herdo algo que se parece com o "site inteiro em um documento", por isso é mais difícil modelá-lo com relações.
Eu já li muitas coisas sobre como / quando usar bancos de dados relacionais versus bancos de dados de documentos, portanto esse não é o principal problema aqui. Só estou pensando: qual é uma boa regra / princípio a ser aplicado ao modelar dados no CouchDB.
Outro exemplo é com arquivos / dados XML. Alguns dados XML possuem mais de 10 níveis de profundidade e eu gostaria de visualizar usando o mesmo cliente (Ajax on Rails, por exemplo, ou Flex) que renderizaria JSON do ActiveRecord, CouchRest ou qualquer outro mapeador de objetos. Às vezes, recebo enormes arquivos XML que são toda a estrutura do site, como a abaixo, e eu preciso mapeá-lo para o Value Objects para usar no meu aplicativo Rails, para que não precise escrever outra maneira de serializar / desserializar dados :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
Portanto, as perguntas gerais do CouchDB são:
- Quais regras / princípios você usa para dividir seus documentos (relacionamentos, etc)?
- É possível colocar o site inteiro em um documento?
- Em caso afirmativo, como você lida com a serialização / desserialização de documentos com níveis arbitrários de profundidade (como o grande exemplo de json acima ou o exemplo de xml)?
- Ou você não os transforma em VOs, apenas decide "estes são aninhados demais ao Mapa Objeto-Relacional, então eu os acessarei usando métodos XML / JSON brutos"?
Muito obrigado por sua ajuda, a questão de como dividir seus dados com o CouchDB tem sido difícil para mim dizer "é assim que devo fazê-lo a partir de agora". Espero chegar lá em breve.
Estudei os seguintes sites / projetos.
- Dados hierárquicos no CouchDB
- CouchDB Wiki
- Sofá - CouchDB App
- CouchDB O Guia Definitivo
- PeepCode CouchDB Screencast
- CouchRest
- Leia-me do CouchDB
... mas eles ainda não responderam a esta pergunta.