У мене є питання, на яке я вже деякий час намагаюся відповісти, але не можу зрозуміти:
Як ви розробляєте або розділяєте документи CouchDB?
Візьмемо, наприклад, допис у блозі.
Напівреляційний спосіб зробити це було б створити кілька об'єктів:
- Опублікувати
- Користувач
- Прокоментуйте
- Тег
- Знімок
Це має великий сенс. Але я намагаюся використовувати couchdb (з усіх причин, що це здорово) для моделювання одного і того ж, і це було надзвичайно важко.
Більшість публікацій в блозі дають вам простий приклад того, як це зробити. Вони в основному поділяють його так само, але кажуть, що ви можете додати "довільні" властивості до кожного документа, що, безумовно, добре. Тож у CouchDB у вас є щось подібне:
- Публікація (з тегами та фрагментами моделей "псевдо" в документі)
- Прокоментуйте
- Користувач
Деякі люди навіть скажуть, що ви можете запустити туди коментаря та користувача, тож у вас це буде:
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"
}
}
}
Це виглядає дуже приємно і легко зрозуміти. Я також розумію, як ви можете написати перегляди, які витягували лише коментарі з усіх ваших поштових документів, щоб перетворити їх у моделі коментарів, як і користувачі та теги.
Але тоді я думаю: "чому б просто не помістити весь мій сайт в єдиний документ?":
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"
...
}
}
}
}
}
Ви можете легко зробити перегляди, щоб знайти те, що ви хочете з цим.
Тоді питання, яке у мене є, як ви визначаєте, коли поділити документ на менші документи або коли зробити "ВІДНОСИНИ" між документами?
Я думаю, що було б набагато більше "об'єктно-орієнтованим" та простішим відображенням об'єктів цінності, якби воно було поділене так:
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
}
}
... але потім він більше нагадує реляційну базу даних. І часто я успадковую щось, що схоже на "весь сайт в документі", тому важче моделювати це з відносинами.
Я читав багато речей про те, як / коли використовувати реляційні бази даних проти баз даних документів, тому це не головна проблема. Мене більше просто цікавить, яке хороше правило / принцип слід застосовувати при моделюванні даних у CouchDB.
Інший приклад - з XML-файлами / даними. Деякі дані XML містять глибину 10+ рівнів, і я хотів би уявити, що використовуючи той самий клієнт (наприклад, Ajax на Rails або Flex), який я мав би віддати JSON з ActiveRecord, CouchRest або будь-якого іншого об'єктивного реляційного Mapper. Іноді я отримую величезні файли XML, які складаються з усієї структури сайту, як-от наведена нижче, і мені потрібно буде відобразити його у Value Objects для використання в моєму додатку Rails, тому мені не доведеться писати інший спосіб серіалізації / десеріалізації даних :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
Отже, загальними питаннями CouchDB є:
- Які правила / принципи ви використовуєте для поділу своїх документів (відносини тощо)?
- Чи добре розмістити весь сайт в одному документі?
- Якщо так, як ви обробляєте документи з серіалізацією / дезаріалізацією з довільними рівнями глибин (наприклад, великим прикладом json вище чи прикладом xml)?
- Або ви не перетворите їх на VO, ви просто вирішите, що "вони занадто вкладені в об'єктно-реляційну карту, тому я просто отримаю доступ до них за допомогою сирих методів XML / JSON"?
Велике спасибі за вашу допомогу, питання про те, як розділити свої дані за допомогою CouchDB, мені було важко сказати "ось так я повинен робити це відтепер". Я сподіваюся, що скоро потраплять туди
Я вивчив наступні сайти / проекти.
- Ієрархічні дані в CouchDB
- CouchDB Wiki
- Диван - Додаток CouchDB
- CouchDB Поточний посібник
- Заставка PeepCode CouchDB
- CouchRest
- CouchDB README
... але вони все ще не відповіли на це питання.