tengo una pregunta que me he estado tratando de responder desde hace algún tiempo, pero no puedo averiguar:Principios para Documentos Modelado CouchDB
¿Cómo se diseña, o dividir, documentos CouchDB?
Tome una publicación de blog por ejemplo.
La forma semi "relacional" de hacerlo sería crear unos objetos:
- Pon
- usuario
- comentario
- Tag
- fragmentos
Esto tiene mucho sentido. Pero estoy tratando de usar couchdb (por todas las razones por las que es genial) para modelar lo mismo y ha sido extremadamente difícil.
La mayoría de las entradas de blog que hay a continuación le dan un ejemplo fácil de cómo hacerlo. Básicamente lo dividen de la misma manera, pero dicen que puede agregar propiedades 'arbitrarias' a cada documento, lo que es definitivamente bueno. Por lo que tendría algo como esto en CouchDB:
- Post (con etiquetas y fragmentos de los modelos de "pseudo" en el doc)
- Comentario
- usuario
Algunas personas incluso dicen que podría lanzar el comentario y usuario de allí, por lo que tendría esto:
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" } } }
Eso se ve muy bien y es fácil de entender. También entiendo cómo puede escribir vistas que extraen solo los comentarios de todos sus documentos de publicación, para incluirlos en los modelos de comentarios, lo mismo con los usuarios y las etiquetas.
Pero luego pienso, "¿por qué no acaba de poner toda mi sitio en un solo 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" ... } } } } }
Desde aquí se puede tomar puntos de vista para encontrar lo que quería con eso.
Entonces la pregunta que tengo es, ¿cómo se determina cuándo dividir el documento en documentos más pequeños, o cuándo hacer "RELACIONES" entre los documentos?
creo que sería mucho más "orientado a objetos", y más fácil de asignar a valorar los objetos, si se divide así:
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 } }
... pero luego empieza a buscar más como una base de datos relacional. Y muchas veces heredo algo que se parece al "sitio completo en un documento", por lo que es más difícil modelarlo con relaciones.
He leído muchas cosas sobre cómo/cuándo usar Bases de datos relacionales vs. Bases de datos de documentos, por lo que ese no es el problema principal aquí.Me pregunto más, ¿cuál es una buena regla/principio para aplicar al modelar datos en CouchDB?
Otro ejemplo es con archivos/datos XML. Algunos datos XML tienen más de 10 niveles de anidamiento, y me gustaría visualizar que usando el mismo cliente (Ajax on Rails por ejemplo, o Flex) me gustaría renderizar JSON desde ActiveRecord, CouchRest o cualquier otro Object Relational Mapper. A veces obtengo enormes archivos XML que son la estructura completa del sitio, como la que se muestra a continuación, y necesito asignarlos a Value Objects para utilizarlos en mi aplicación Rails, así no tengo que escribir otra forma de serializar/deserializar los datos :
<pages> <page> <subPages> <subPage> <images> <image> <url/> </image> </images> </subPage> </subPages> </page> </pages>
Así que las preguntas generales CouchDB son:
- qué reglas/principios que utiliza para dividir sus documentos (relaciones, etc)?
- ¿Está bien colocar todo el sitio en un solo documento?
- En caso afirmativo, ¿cómo maneja la serialización/deserialización de documentos con niveles de profundidad arbitrarios (como el ejemplo grande json anterior, o el ejemplo xml)?
- ¿O no los convierte en VO, simplemente decide "estos están demasiado anidados en el Mapa Relacional de Objetos, así que solo accederé a ellos utilizando métodos XML/JSON sin formato"?
Muchas gracias por su ayuda, la cuestión de cómo dividir sus datos con CouchDB ha sido difícil para mí decir "así es como debería hacerlo a partir de ahora". Espero llegar pronto
He estudiado los siguientes sitios/proyectos.
- Hierarchical Data in CouchDB
- CouchDB Wiki
- Sofa - CouchDB App
- CouchDB The Definitive Guide
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
... pero todavía no han respondido esta pregunta.
wow has escrito un ensayo completo aquí ... :-) – Eero
hey, esa es una buena pregunta – elmarco