Ich habe eine Frage, die ich seit einiger Zeit zu beantworten versuche, aber nicht herausfinden kann:
Wie entwerfen oder teilen Sie CouchDB-Dokumente auf?
Nehmen Sie zum Beispiel einen Blog-Beitrag.
Der halb "relationale" Weg, dies zu tun, wäre, ein paar Objekte zu erstellen:
- Post
- Benutzer
- Kommentar
- Etikett
- Snippet
Das macht sehr viel Sinn. Aber ich versuche, couchdb zu verwenden (aus all den Gründen, aus denen es großartig ist), um dasselbe zu modellieren, und es war äußerst schwierig.
Die meisten Blog-Beiträge geben Ihnen ein einfaches Beispiel dafür. Sie teilen es im Grunde auf die gleiche Weise auf, sagen aber, dass Sie jedem Dokument 'beliebige' Eigenschaften hinzufügen können, was auf jeden Fall schön ist. Sie hätten also so etwas in CouchDB:
- Post (mit Tags und Snippets "Pseudo" -Modelle im Dokument)
- Kommentar
- Benutzer
Einige Leute würden sogar sagen, dass Sie den Kommentar und den Benutzer dort hineinwerfen könnten, also hätten Sie Folgendes:
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"
}
}
}
Das sieht sehr gut aus und ist leicht zu verstehen. Ich verstehe auch, wie Sie Ansichten schreiben können, die nur die Kommentare aus all Ihren Post-Dokumenten extrahieren, um sie in Kommentarmodelle zu integrieren, genau wie Benutzer und Tags.
Aber dann denke ich: "Warum nicht einfach meine gesamte Website in einem einzigen Dokument zusammenfassen?":
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"
...
}
}
}
}
}
Sie könnten leicht Ansichten machen, um zu finden, was Sie damit wollten.
Dann ist die Frage, die ich habe, wie Sie bestimmen, wann Sie das Dokument in kleinere Dokumente aufteilen oder wann Sie "BEZIEHUNGEN" zwischen den Dokumenten herstellen sollen.
Ich denke, es wäre viel "objektorientierter" und einfacher, Wertobjekten zuzuordnen, wenn es so aufgeteilt würde:
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
}
}
... aber dann sieht es eher aus wie eine relationale Datenbank. Und oft erbe ich etwas, das wie die "ganze Site in einem Dokument" aussieht, daher ist es schwieriger, es mit Beziehungen zu modellieren.
Ich habe viele Dinge darüber gelesen, wie / wann relationale Datenbanken im Vergleich zu Dokumentdatenbanken verwendet werden sollen, daher ist dies hier nicht das Hauptproblem. Ich frage mich nur, was eine gute Regel / ein gutes Prinzip ist, wenn Daten in CouchDB modelliert werden.
Ein weiteres Beispiel sind XML-Dateien / -Daten. Einige XML-Daten haben eine Tiefe von mehr als 10 Ebenen, und ich möchte dies mit demselben Client (z. B. Ajax on Rails oder Flex) visualisieren, mit dem ich JSON aus ActiveRecord, CouchRest oder einem anderen objektrelationalen Mapper rendern würde. Manchmal erhalte ich große XML-Dateien, die die gesamte Site-Struktur aufweisen, wie die folgende, und ich muss sie Value Objects zuordnen, um sie in meiner Rails-App zu verwenden, damit ich keine andere Methode zum Serialisieren / Deserialisieren von Daten schreiben muss ::
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
Die allgemeinen CouchDB-Fragen lauten also:
- Welche Regeln / Prinzipien verwenden Sie, um Ihre Dokumente (Beziehungen usw.) aufzuteilen?
- Ist es in Ordnung, die gesamte Site in einem Dokument zusammenzufassen?
- Wenn ja, wie gehen Sie mit dem Serialisieren / Deserialisieren von Dokumenten mit beliebigen Tiefenstufen um (wie im obigen großen JSON-Beispiel oder im XML-Beispiel)?
- Oder verwandeln Sie sie nicht in VOs? Entscheiden Sie einfach, "diese sind zu verschachtelt für die objektrelationale Zuordnung, sodass ich nur mit XML / JSON-Rohmethoden darauf zugreifen kann"?
Vielen Dank für Ihre Hilfe. Die Frage, wie Sie Ihre Daten mit CouchDB aufteilen können, war für mich schwierig zu sagen: "So sollte ich es von nun an tun." Ich hoffe, bald dort zu sein.
Ich habe die folgenden Websites / Projekte studiert.
- Hierarchische Daten in CouchDB
- CouchDB Wiki
- Sofa - CouchDB App
- CouchDB Der endgültige Leitfaden
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
... aber sie haben diese Frage immer noch nicht beantwortet.