Principes pour la Modélisation de CouchDB Documents

J'ai une question que j'ai essayé de répondre pendant un certain temps maintenant, mais ne peuvent pas comprendre:

Comment concevoir, ou de répartir les, Documents des documents?

Prendre un billet de Blog par exemple.

Le semi "relationnel" façon de le faire serait de créer quelques objets:

  • Post
  • Utilisateur
  • Commentaire
  • Tag
  • Extrait de

Cela fait beaucoup de sens. Mais je suis en train d'utiliser couchdb (pour toutes les raisons que c'est génial) pour modéliser la même chose et ça a été extrêmement difficile.

La plupart des messages de blog là vous donner un exemple simple de comment faire cela. Ils se sont contentés de le diviser de la même façon, mais dire que vous pouvez ajouter "arbitraire" des propriétés de chaque document, ce qui est certainement agréable. Donc, si vous voulez avoir quelque chose comme ceci dans CouchDB:

  • Post (avec des balises et des extraits de "pseudo" modèles dans la doc)
  • Commentaire
  • Utilisateur

Certaines personnes disent même que vous pourrait jeter le Commentaire et l'Utilisateur, de sorte que vous auriez à ceci:


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"
        }
    }
} 

Qui a l'air très sympa et facile à comprendre. Je comprends aussi la façon dont vous pouvez écrire des vues extraites juste les Commentaires de tous vos Post les documents, les mettre en Commentaire les modèles, même avec les Utilisateurs et les Balises.

Mais je pense, "pourquoi ne pas simplement mettre mon site entier en un seul document?":


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"
                    ...
                }
            }
        }
    }
} 

Vous pouvez facilement faire des vues de trouver ce que tu voulais avec qui.

Alors la question que je me pose est, comment voulez-vous déterminer le moment de diviser le document en petits documents, ou le moment de faire les "RELATIONS" entre les documents?

Je pense qu'il serait beaucoup plus "Orienté Objet", et plus facile à la carte pour des Objets de Valeur, si elle était divisée comme suit:


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
    }
} 

... mais ensuite, il se lance à la recherche de plus comme une Base de données Relationnelle. Et bien souvent, je hériter de quelque chose qui ressemble à la "toute-site-dans-un-document", il est donc plus difficile à modéliser avec les relations.

J'ai lu beaucoup de choses sur comment et quand utiliser les Bases de données Relationnelles vs Document de Bases de données, ce qui n'est pas le problème ici. Je suis plus juste de se demander, ce qui est une bonne règle/principe à appliquer lors de la modélisation de données CouchDB.

Est un autre exemple avec des fichiers XML/données. Certaines données XML a imbrication de+ de 10 niveaux de profondeur, et je voudrais visualiser qu'en utilisant le même client (Ajax sur des Rails par exemple, ou Flex) que je voudrais rendre JSON de ActiveRecord, CouchRest, ou tout autre Objet Relational Mapper. Parfois, je reçois des fichiers XML énormes qui sont toute la structure du site, comme celle ci-dessous, et j'aurais besoin de la carte pour des Objets de Valeur à utiliser dans mon application Rails, donc je n'ai pas à écrire une autre façon de sérialisation/désérialisation des données:


<pages>
    <page>
        <subPages>
            <subPage>
                <images>
                    <image>
                        <url/>
                    </image>
                </images>
            </subPage>
        </subPages>
    </page>
</pages> 

De sorte que le général CouchDB questions sont les suivantes:

  1. Quelles sont les règles/principes utilisez-vous pour diviser vos documents (rapports, etc)?
  2. Est-il correct de mettre le site en entier en un seul document?
  3. Si oui, comment avez-vous gérer la sérialisation/désérialisation des documents arbitraire de niveaux de profondeurs (comme le grand json exemple ci-dessus, ou l'exemple de xml)?
  4. Ou ne vous mettez pas dans VOs, avez-vous venez de décider "ceux-ci sont trop imbriqués pour Objet-Relationnel Carte, donc je vais juste y accéder à l'aide de matières XML/JSON méthodes"?

Merci beaucoup pour votre aide, le problème de la manière de partager vos données avec CouchDB a été difficile pour moi de dire "c'est comment je dois faire à partir de maintenant". J'espère y arriver bientôt.

J'ai étudié les sites suivants/projets.

  1. Des Données hiérarchiques dans CouchDB
  2. CouchDB Wiki
  3. Canapé - CouchDB App
  4. CouchDB Le Guide Définitif
  5. PeepCode CouchDB Screencast
  6. CouchRest
  7. CouchDB README

...mais ils n'ont toujours pas répondu à cette question.

  • wow vous avez écrit tout un essai ici... 🙂
  • hey, c'est une bonne question