couchdb много ко многим головная боль - PullRequest
2 голосов
/ 16 марта 2012

Итак, я прочитал кое-что о переводе отношений на couchdb, но до сих пор не могу придумать правильную функцию карты, которая бы представляла многих для многих.

Представьте, что у вас есть несколько документов (обратите внимание, что это пример, а не фактическая модель):

{name:"whatever1", from:"A"}
{name:"whatever2", from:"A"}
{name:"whatever3", to:"B"}
{name:"whatever4", to:"C"}

и некоторые другие типы документов, определяющих отношения:

{name:"link1", link: true, from: "A", to: "B"}
{name:"link2", link: true, from: "A", to: "C"}

Я пытаюсь найти правильную функцию, которая возвращает мне список комбинаций:

{ name: "link1",
  froms: ["whatever1", "whatever2"],
  tos: ["whatever3"]
}

Кто-нибудь знает, как написать такую ​​карту, должен ли я изменить структуру своих документов? Пожалуйста, если вы хотите добавить ссылку на руководство, не пишите.

1 Ответ

5 голосов
/ 17 марта 2012

Вообще говоря говоря, многие ко многим просто невозможны на складе CouchDB. Похоже, ты просто хочешь, чтобы это было прямо, без сахарного покрытия, вот оно где.

Объединение связанных данных не является сильной стороной CouchDB, и, конечно, это основная сила реляционных баз данных. Однако этот факт немного запутан, потому что большинство людей «интуитивно» моделируют свои данные реляционно, потому что именно так мы все обучены.

Ваша сложность заключается именно в стоимости, которую вы должны заплатить CouchDB, чтобы получить другие его функции: HTTP API, гибкая кластеризация, мультимастер или автономная работа и т. Д. По своей конструкции его функции синхронизации возможны, потому что документы простые и не связанные друг с другом .

Однако, другой сильной стороной CouchDB является параллелизм. Так что, если вы уже наслаждаетесь другими функциями CouchDB, и вам просто нужно преодолеть эту проблему, вы можете просто «присоединиться» на стороне клиента.

Более простая функция отображения просто генерирует все начальные значения (key:["from", "A"], value:"whatever1") и tos (key:["to","B"], value:"whatever3"). Таким образом, вы можете запросить его с помощью ?key=["from","A"] и получить список всех whatevers для любого заданного значения или значения.

Для каждого ссылочного документа у вас есть значение от и до для проверки. Таким образом, запросите оба (либо по одному, либо одновременно, что довольно просто, например, в Javascript):

  1. Вид с опцией ?key=["from","A"]
  2. А также вид с ?key=["to","B"]

И как только оба результата вернутся, вы получите ответ по этой ссылке.

Вы обнаружите, что, поскольку вы можете только делать эффективные запросы от CouchDB (сканирование индекса), CouchDB может поддерживать очень высокую частоту запросов и большое количество одновременных соединений.

Это легко? В Javascript все не так плохо, но нет, в принципе это не просто. Этот вопрос в корне противоречит зерну CouchDB и реляционному зерну. (Я лично взволнован Дриззлом для таких проблем.)

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