Ho una domanda a cui sto cercando di rispondere da un po 'di tempo ma non riesco a capire:
Come progettate o suddividete i documenti CouchDB?
Prendi un post sul blog per esempio.
Il modo semi "relazionale" per farlo sarebbe creare alcuni oggetti:
- Inviare
- Utente
- Commento
- Etichetta
- Frammento
Questo ha molto senso. Ma sto cercando di usare couchdb (per tutti i motivi per cui è fantastico) per modellare la stessa cosa ed è stato estremamente difficile.
La maggior parte dei post sul blog ti danno un semplice esempio di come farlo. Fondamentalmente lo dividono allo stesso modo, ma dicono che puoi aggiungere proprietà "arbitrarie" a ciascun documento, il che è decisamente carino. Quindi avresti qualcosa di simile in CouchDB:
- Post (con tag e snippet "pseudo" modelli nel documento)
- Commento
- Utente
Alcune persone direbbero addirittura che potresti inserire il commento e l'utente lì dentro, quindi avresti questo:
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"
}
}
}
Sembra molto carino ed è facile da capire. Capisco anche come potresti scrivere viste che estraevano solo i commenti da tutti i tuoi documenti di post, per inserirli nei modelli di commento, lo stesso con gli utenti e i tag.
Ma poi penso, "perché non mettere tutto il mio sito in un unico 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"
...
}
}
}
}
}
Potresti facilmente creare visualizzazioni per trovare ciò che desideri.
Quindi la domanda che ho è: come determinare quando dividere il documento in documenti più piccoli o quando creare "RELAZIONI" tra i documenti?
Penso che sarebbe molto più "orientato agli oggetti" e più facile mappare agli oggetti valore, se fosse diviso in questo modo:
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
}
}
... ma poi inizia ad assomigliare più a un database relazionale. E spesso eredito qualcosa che assomiglia al "tutto il sito-in-un-documento", quindi è più difficile modellarlo con le relazioni.
Ho letto molte cose su come / quando utilizzare i database relazionali rispetto ai database dei documenti, quindi non è questo il problema principale qui. Mi chiedo più semplicemente qual è una buona regola / principio da applicare durante la modellazione dei dati in CouchDB.
Un altro esempio è con file / dati XML. Alcuni dati XML hanno una nidificazione di oltre 10 livelli e vorrei visualizzarli utilizzando lo stesso client (Ajax on Rails per esempio, o Flex) che vorrei per eseguire il rendering JSON da ActiveRecord, CouchRest o qualsiasi altro Object Relational Mapper. A volte ottengo enormi file XML che sono l'intera struttura del sito, come quello qui sotto, e dovrei mapparlo su Value Objects da utilizzare nella mia app Rails in modo da non dover scrivere un altro modo di serializzare / deserializzare i dati :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
Quindi le domande generali di CouchDB sono:
- Quali regole / principi usi per suddividere i tuoi documenti (relazioni, ecc.)?
- Va bene mettere l'intero sito in un documento?
- In tal caso, come gestisci la serializzazione / deserializzazione dei documenti con livelli di profondità arbitrari (come il grande esempio json sopra o l'esempio xml)?
- O non li trasformi in VO, decidi semplicemente "questi sono troppo nidificati nella mappa relazionale degli oggetti, quindi li accederò usando metodi XML / JSON non elaborati"?
Grazie mille per il tuo aiuto, la questione di come dividere i tuoi dati con CouchDB è stato difficile per me dire "questo è come dovrei farlo d'ora in poi". Spero di arrivarci presto.
Ho studiato i seguenti siti / progetti.
- Dati gerarchici in CouchDB
- CouchDB Wiki
- Divano - App CouchDB
- CouchDB La guida definitiva
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
... ma non hanno ancora risposto a questa domanda.