Примеры того, как структурировать CouchDB - PullRequest
4 голосов
/ 23 ноября 2010

Я ищу хорошие примеры / практики о том, как хранить и структурировать данные в CouchDB.

Что-то более сложное, чем приложение блога в полном руководстве.

Давайте представим приложение, подобное переполнению стека.

  • Как хранить основные части - пользователи, вопросы, ответы, комментарии, теги, голоса?
  • Как вы думаете, это хорошая идея для разделения данных на разные базы данных? Например поставить пользователей на отдельную БД ... или голоса / теги?
  • Или нет, потому что в представлениях нельзя объединять данные из разных баз данных?

Ответы [ 4 ]

2 голосов
/ 23 ноября 2010

Концепции, которые хорошо работают для структурирования данных в реляционных базах данных, также применимы для баз данных хранения документов. Единственное, что действительно меняется, - это то, что запросы, которые обычно выполняются с объединением в реляционной базе данных, обычно громоздки в базе данных NoSQL. Это означает, что отношения один ко многим, обычно разрешаемые с помощью объединения в RDBM, обычно включают в себя гораздо большую денормализацию в базе данных NoSQL. В типичном примере отношения «один ко многим», например сообщения в блоге и комментарии к этому сообщению, вместо использования внешнего ключа в комментарии к сообщению, вы фактически дублируете некоторые данные из сообщения в комментарии, чтобы избежать дополнительных запрос, и вы также будете хранить список идентификаторов комментариев (и, возможно, 10 самых последних тел комментариев) в сообщении.

1 голос
/ 29 января 2013

Я предлагаю вам хранить различные части (пользователи, вопросы, ответы, комментарии, теги, голоса) как отдельные документы в одной базе данных.

Нет. Не храните их в отдельных базах данных. Вы потеряете силу представлений и будете вынуждены делать экспоненциальное количество HTTP-запросов для сбора данных.

-

Проверьте http://www.cmlenz.net/archives/2007/10/couchdb-joins. Это действительно проливает свет на эту тему для меня. Кредит Коста для обмена ссылкой в ​​ другой вопрос .

Несмотря на то, что в статье используется вездесущий пример блога, я считаю, что подход № 2 с «View Collation» - это то, что вам нужно.

Документы, являющиеся потомками другого документа, будут связаны атрибутом родителя "_id". Кроме того, вы дадите своим документам атрибут «тип» для их упорядочения при возврате в виде. Например:

function(doc) {
  if (doc.type == "post") {
    map([doc._id, 0], doc);
  } else if (doc.type == "comment") {
    map([doc.post, 1], doc);
  }
}

То, что вы вернули, это:

{
 "total_rows": 5, "offset": 0, "rows": [{
  "id": "myslug",
  "key": ["myslug", 0],
  "value": {...}
}, {
  "id": "ABCDEF",
  "key": ["myslug", 1],
  "value": {...}
}, {
  "id": "DEFABC",
  "key": ["myslug", 1],
  "value": {...}
}, {
  "id": "other_slug",
  "key": ["other_slug", 0],
  "value": {...}
}, {
  "id": "CDEFAB",
  "key": ["other_slug", 1],
  "value": {...}
}]
}

Теперь все данные, родительские и дочерние элементы возвращены в одном HTTP-запросе. Кроме того, вы можете использовать CRUD для этих документов напрямую через REST API. Что именно то, что вы хотите, на мой взгляд.

Вы можете применить тот же подход ко всему, что имеет отношение один-ко-многим или многие-к-одному.

Надеюсь, это поможет!

0 голосов
/ 17 ноября 2013

Модель, приведенная в качестве примера в http://www.cmlenz.net/archives/2007/10/couchdb-joins, была полезна для понимания структуры, но у меня есть один комментарий к подходу использования темы блога для идентификатора документа. Если два пользователя имеют одинаковый заголовок блога, это может вызвать конфликт. Я новичок в couchdb, но кажется, что идентификатор документа и заголовок документа должны быть разделены, несмотря на то, что я не могу загрузить блог с / blogName. Может ли это быть достигнуто с помощью структуры
{_Id: 6377738426gdjjsb, _rev: 1-hsusubsvh6377, название: название_блог, AUTHORNAME: shakespeareND5}

0 голосов
/ 08 марта 2012

Что касается выполнения 'соединений' в couchdb:

На самом деле, возможно, имеет смысл не дублировать данные. Вот пример представления, которое я создал в couchdb: http://wamoyo.iriscouch.com/_utils/database.html?ideageneration/_design/IdeaGeneration/_view/challengesAndIdeas

Это простое приложение позволяет людям решать проблемы, а затем собирать идеи о том, как решать эти проблемы. Это очень хорошо видно на примере блога: «Задачами будут посты в блоге, а идеями - комментарии, подходящие для каждого поста в блоге».

Я опубликовал это в деталях к другому вопросу здесь: Операции с Couch DB, такие как RDBMS

Что касается структурирования приложений в couchdb, Джейсон, я играю с тем же вопросом. CouchDB предлагает большую гибкость, поэтому я не совсем уверен, следует ли мне использовать шоу и списки для отображения данных или просто написать код на стороне клиента, чтобы сделать это, возможно, с магистралью, а затем просто использовать представления couchdb для предоставления модели. Дайте мне знать, что вы придумали, мне было бы очень любопытно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...