2011-03-27 5 views
4

J'ai lu le "CouchDB - Le guide définitif" et de nombreux articles trouvés sur le web. J'ai compris comment fonctionne Couch mais certaines questions me trottent toujours dans la tête. Supposons que vous travailliez sur une application de blog simple: Dans la page de publication, je souhaite afficher les données de publication et les données de l'auteur. Donc je pense que je dois tout mettre dans le même document. Ok. Si je n'ai besoin de montrer que les données de l'auteur sur une seule page, je peux le faire avec une vue. Ok.CouchDB Blog Application

Mais si l'auteur met à jour ses données, je dois mettre à jour chaque document où l'auteur apparaît? Ou je me trompe? J'aimerais énormément comprendre cette logique.

Merci d'avance.

Répondre

3

Oui, vous devez mettre à jour chaque document. L'idée est que de grandes mises à jour comme celles-là sont rares, donc même si elles sont coûteuses en calcul, vous ne devriez pas avoir à en faire beaucoup.

+0

Ok merci. Est-il logique ou non de stocker les données de l'auteur sur un document séparé et de le charger séparément? (stocker, dans le document post, seulement l'identifiant de l'auteur - dans le style SQL) – user232028

8

Certaines informations peuvent être laissées dans le même document, et dans la plupart des cas cela fonctionnera très bien.

{ 
    "title": "Blog Article Title", 
    "content": "... blah blah blah ...", 
    "author": { 
     "name": "someguy", 
     "email": "[email protected]" 
    }, 
    "type": "post" 
} 

D'autres fois, vous pouvez simplement utiliser le _id d'un autre document afin de créer un lien entre les 2 documents.

{ 
    "_id": "...", 
    "title": "Blog Article Title", 
    "content": "... blah blah blah ...", 
    "author": "someguy", 
    "type": "post" 
} 

{ 
    "_id": "someguy", 
    "name": "Some Guy", 
    "email": "[email protected]", 
    "type": "author" 
} 

À première vue, vous aurez besoin de 2 requêtes distinctes pour récupérer les deux entités. Cependant, il existe une petite astuce que les requêtes de vue peuvent exposer.

function (doc) { 
    if (doc.type === "post") { 
     emit([doc.title, 0], null);    // output the main post 
     emit([doc.title, 1], { _id: doc.author }); // output the author 
    } 
} 

Votre vue Affichera ce résultat: (notez comment la vue est triée)

{ ... 
    "rows": [ 
     { 
      "key": ["Blog Article Title", 0], 
      "value": null 
     }, 
     { 
      "key": ["Blog Article Title", 1], 
      "value": { "_id": "someguy" } 
     } 
    ] 
} 

Ce n'est pas tout ce utile car il est, mais si vous ajoutez include_docs=true à l'URL de votre vue, vous » Vous obtiendrez ce résultat:

{ ... 
    "rows": [ 
     { 
      "key": ["Blog Article Title", 0], 
      "value": null, 
      "doc": { 
       "_id": "...", 
       "title": "Blog Article Title", 
       "content": "... blah blah blah ...", 
       "author": "someguy", 
       "type": "post" 
      }, 
     }, 
     { 
      "key": ["Blog Article Title", 1], 
      "value": { "_id": "someguy" }, 
      "doc": { 
       "_id": "someguy", 
       "name": "Some Guy", 
       "email": "[email protected]", 
       "type": "author" 
      } 
     } 
    ] 
} 

Maintenant, les deux entités sont incluses dans une requête. :)

Consultez la section this article pour plus d'informations sur les relations entre entités dans CouchDB.