2011-02-09 1 views
3

Je veux essayer CouchDb en développant une petite application PhotoAlbum où différents utilisateurs peuvent avoir beaucoup d'albums avec beaucoup de photos dedans. Est-ce que je le fais bien si je crée un document pour chaque utilisateur, qui contient un tableau d'albums, qui contient des photos avec des pièces jointes?Comment structurer un design de base de données pour un simple album photo dans couchdb?

{ 
    user: "Dominik", 
    albums: [ 
     { name: "USA Trip", photos: 
      [ 
       { title: "Golden Gate Bridge", _attachments: [ the photo ] }, 
       { another photo } 
      ] 
     }, 
     { ...} ] 
} 

ou existe-t-il un autre moyen de le faire? Ou est-il préférable de stocker les utilisateurs, les albums et les photos dans des documents différents? Cela nécessiterait des clés étrangères comme dans mysql?

{ type: "user", name: "Dominik", albums: [ "a1", "a2", "a3" ] } 
{ type: "album", _id: "a1", title: "USA Trip", photos: [ "p1", "p2" ... ] } 
{ type: "photo", _id: "p1", _attachments: {...}, title: "Golden Gate Bridge" } 

...

ou l'inverse ?:

{ type: "user", _id: "u1", name: "Dominik" } 
{ type: "album", _id: "a1", title: "USA Trip", user: "u1" } 
{ type: "photo", _id: "p1", _attachments: {...}, title: "Golden Gate Bridge", album: "a1" } 

Répondre

1

De mon point de vue, il est préférable de diviser vos données en petites portions de celui-ci. Mais ceci est seulement votre choix. J'ai choisi de diviser parce que j'étais confronté à une limite de 1 Mo pour memcached-server par "key-value-instance" (nous mettons en cache les documents CouchDB dans memcached), donc nous ne pouvions pas stocker nos données dans un document.

Mais bien sûr, il y a des avantages à stocker vos données dans un seul document. J'espère que d'autres personnes parleront de leur expérience et que vous choisirez ce qui vous convient le mieux.

+1

J'ai oublié de mentionner un autre avantage de stocker des parties de données séparément: si vous changez le titre de vos photos dans votre album , le document entier sera mis à jour (et ETag aussi), ce qui n'est souvent pas très bon. –

1

1999 est exact. Deux points plus mineurs:

  1. Rappelez-vous, Apache CouchDB supporte les transactions atomiques — mais seulement dans un document. Vous pouvez changer n'importe quoi dans un document avec une seule opération atomique.
  2. Dans le cadre de sécurité CouchDB, votre politique de sécurité est appliquée un document à la fois, à l'isolement. La fonction validate_doc_update ne peut pas voir les documents étrangers lorsqu'il doit décider ce qu'un utilisateur peut faire. (Si vous n'utilisez pas CouchDB pour les comptes et l'authentification, ceci n'est pas pertinent.)
+0

validation est un bon point, je vais devoir l'utiliser, merci –

Questions connexes