CouchDB - базовый дизайн для данных соединений - PullRequest
1 голос
/ 17 апреля 2011

Просто поиграть с CouchDb и CouchApp, какая удивительная технология!Очень удивлен, швы очень мощные.После того, как я много играл и читал, поскольку я старый пользователь реляционной базы данных, я все еще задаюсь вопросом о том, как проектировать некоторые базовые вещи.

Вот мой вопрос:

1 / У меня естьдокумент типа «пользователь» и документ типа «элемент»

2 / My Couchdb содержит следующие документы:

{ "_id": "...", "type": "user", "email":"u1@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u2@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u3@gmail.com" ... }
{ "_id": "...", "type": "user", "email":"u4@gmail.com" ... }

{ "_id": "...", "type": "item", "title":"My title",
  created_by:"u1@gmail.com", modified_by:"u3@gmail.com" }

3 / Теперь я хочу, чтобы представление или что-то получало документпо типу = item и _id с информацией для каждого пользователя (создатель и модификатор)

Я видел способ эмулировать простое соединение здесь: http://www.cmlenz.net/archives/2007/10/couchdb-joins

Но я не могу его адаптироватьв течение двух соединений я играю с ключевым форматом несколько часов, тестирую множество вещей, но ничего не получается.

Я думаю, что мне не хватает чего-то важного с картой / сокращением CouchDb, если кому-то нужна помощьЯ буду признателен за это.

PS: Не отвечайте мне, чтобы вставить документ «пользователь» в документ «элемент».Это не мой вопрос.

Расслабься, расслабься ...: -)

Ответы [ 2 ]

2 голосов
/ 18 апреля 2011

Я думаю, вы должны поместить _id s в created_by и modified_by:

{ "_id": "u1", "type": "user", "email":"u1@gmail.com" ... }
{ "_id": "u2", "type": "user", "email":"u2@gmail.com" ... }
{ "_id": "u3", "type": "user", "email":"u3@gmail.com" ... }
{ "_id": "u4", "type": "user", "email":"u4@gmail.com" ... }

{ "_id": "anitem", "type": "item", "title":"My title",
  created_by:"u1", modified_by:"u3" }

, чтобы вы могли использовать следующую функцию карты и запросить ее с помощью ?key="anitem"&include_docs=true:

function(doc) {
  if (doc.type === "item") {
    emit(doc._id, 1);
    emit(doc._id, { _id: doc.created_by });
    emit(doc._id, { _id: doc.modified_by });
  }
}

Вы можете прочитать пост Яна Ленхардта об этом для более подробной информации.

В качестве примечания, я обычно помещаю тип в _id, чтобы его было легче получитьуникальные ключи, и вам не нужно представление, если вы хотите фильтровать только по типу:

{ "_id": "user/username1", "email":"u1@gmail.com" ... }
{ "_id": "user/username2", "email":"u2@gmail.com" ... }
{ "_id": "user/username3", "email":"u3@gmail.com" ... }
{ "_id": "user/username4", "email":"u4@gmail.com" ... }

{ "_id": "item/itemid1", "title":"My title",
  created_by:"user/username1", modified_by:"user/username3" }

и функция карты -

function(doc) {
  if (doc._id.slice(0, 4) === "item/") {
    emit(doc._id, 1);
    emit(doc._id, { _id: doc.created_by });
    emit(doc._id, { _id: doc.modified_by });
  }
}

ОБНОВЛЕНИЕ: Из-за ошибки COUCHDB-1229 , использование / в doc._id может вызвать проблемы.В зависимости от вашего варианта использования может быть лучше использовать другой разделитель, например : или _.

0 голосов
/ 17 апреля 2011

Что вы имеете в виду здесь "два соединения"?Является ли это «присоединение tableA tableB ON ... AND ...»?

Теперь я хочу, чтобы представление или что-то получало документ по типу = item и _id с информацией для каждого пользователя

Это можно сделать без двух / более объединений.В любом случае, я советую разделить ваши данные на 2 базы данных: элементы и пользователи.Приведенный выше пример подходит только для нескольких простых задач.Но когда ваши данные становятся большими (например, 10 000 пользователей и 100 000 элементов), становится очень трудно обрабатывать ваши данные, и это отчасти отстойно, что все ваши документы отличаются друг от друга только одним полем.

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