У меня есть вопрос, на который я пытаюсь ответить некоторое время, но не могу понять:
Как вы разрабатываете или делят документы 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"
}
}
}
Это выглядит очень красиво и легко понять. Я также понимаю, как вы могли писать представления, которые извлекали только комментарии из всех ваших документов Post, чтобы получить их в моделях комментариев, то же самое с пользователями и тегами.
Но потом я думаю: "Почему бы просто не поместить весь мой сайт в один документ?":
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"
...
}
}
}
}
}
Вы можете легко сделать представление, чтобы найти то, что вам нужно.
Тогда у меня есть вопрос: как вы определяете, когда разделить документ на более мелкие документы или когда делать "ОТНОШЕНИЯ" между документами?
Я думаю, что это было бы намного больше "Object Oriented" и проще было бы сопоставлять объекты Value, если бы они были разделены так:
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 on Rails, например, или Flex), который я хотел бы сделать JSON из ActiveRecord, CouchRest или любого другого Relation 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 Screencast
- CouchRest
- CouchDB README
... но они все еще не ответили на этот вопрос.