Saya memiliki pertanyaan yang telah saya coba jawab selama beberapa waktu sekarang tetapi tidak dapat dipecahkan:
Bagaimana Anda mendesain, atau membagi, dokumen CouchDB?
Ambil Entri Blog sebagai contoh.
Cara semi "relasional" untuk melakukannya adalah dengan membuat beberapa objek:
- Pos
- Pengguna
- Komentar
- Menandai
- Potongan
Ini sangat masuk akal. Tapi saya mencoba menggunakan couchdb (untuk semua alasan yang bagus) untuk memodelkan hal yang sama dan itu sangat sulit.
Sebagian besar posting blog di luar sana memberi Anda contoh mudah tentang bagaimana melakukan ini. Mereka pada dasarnya membaginya dengan cara yang sama, tetapi katakanlah Anda dapat menambahkan properti 'sewenang-wenang' ke setiap dokumen, yang tentunya bagus. Jadi Anda akan memiliki sesuatu seperti ini di CouchDB:
- Posting (dengan tag dan cuplikan model "semu" di dokumen)
- Komentar
- Pengguna
Beberapa orang bahkan akan mengatakan Anda bisa melempar Komentar dan Pengguna di sana, jadi Anda akan memiliki ini:
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"
}
}
}
Itu terlihat sangat bagus dan mudah dimengerti. Saya juga memahami bagaimana Anda dapat menulis tampilan yang mengekstrak hanya Komentar dari semua dokumen Posting Anda, untuk memasukkannya ke dalam model Komentar, sama dengan Pengguna dan Tag.
Tapi kemudian saya berpikir, "mengapa tidak memasukkan seluruh situs saya ke dalam satu dokumen?":
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"
...
}
}
}
}
}
Anda dapat dengan mudah membuat tampilan untuk menemukan apa yang Anda inginkan dengan itu.
Lalu pertanyaan saya adalah, bagaimana Anda menentukan kapan harus membagi dokumen menjadi dokumen yang lebih kecil, atau kapan membuat "RELATIONS" antar dokumen?
Saya pikir itu akan jauh lebih "Berorientasi Objek", dan lebih mudah untuk memetakan ke Objek Nilai, jika dibagi seperti ini:
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
}
}
... tapi kemudian mulai terlihat lebih seperti Database Relasional. Dan sering kali saya mewarisi sesuatu yang terlihat seperti "whole-site-in-a-document", jadi lebih sulit untuk memodelkannya dengan relasi.
Saya telah membaca banyak hal tentang bagaimana / kapan menggunakan Database Relasional vs. Database Dokumen, jadi itu bukan masalah utama di sini. Saya lebih hanya bertanya-tanya, apa aturan / prinsip yang baik untuk diterapkan saat memodelkan data di CouchDB.
Contoh lainnya adalah dengan file / data XML. Beberapa data XML memiliki 10+ level bersarang, dan saya ingin memvisualisasikan bahwa menggunakan klien yang sama (misalnya Ajax on Rails, atau Flex) yang akan saya render JSON dari ActiveRecord, CouchRest, atau Pemeta Relasional Objek lainnya. Terkadang saya mendapatkan file XML besar yang merupakan keseluruhan struktur situs, seperti yang di bawah ini, dan saya perlu memetakannya ke Value Objects untuk digunakan di aplikasi Rails saya sehingga saya tidak perlu menulis cara lain untuk membuat serial / deserialisasi data :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
Jadi pertanyaan umum CouchDB adalah:
- Aturan / prinsip apa yang Anda gunakan untuk membagi dokumen Anda (hubungan, dll)?
- Bolehkah meletakkan seluruh situs ke dalam satu dokumen?
- Jika demikian, bagaimana Anda menangani pembuatan serial / deserialisasi dokumen dengan tingkat kedalaman arbitrer (seperti contoh json besar di atas, atau contoh xml)?
- Atau apakah Anda tidak mengubahnya menjadi VO, apakah Anda hanya memutuskan "yang ini terlalu bersarang ke Peta Relasional Objek, jadi saya akan mengaksesnya menggunakan metode XML / JSON mentah"?
Terima kasih banyak atas bantuan Anda, masalah cara membagi data Anda dengan CouchDB sulit bagi saya untuk mengatakan "beginilah cara saya melakukannya mulai sekarang". Saya berharap untuk segera sampai di sana.
Saya telah mempelajari situs / proyek berikut.
- Data Hierarki di CouchDB
- CouchDB Wiki
- Sofa - Aplikasi CouchDB
- CouchDB Panduan Definitif
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
... tapi mereka masih belum menjawab pertanyaan ini.