Вообще говоря говоря, многие ко многим просто невозможны на складе CouchDB. Похоже, ты просто хочешь, чтобы это было прямо, без сахарного покрытия, вот оно где.
Объединение связанных данных не является сильной стороной CouchDB, и, конечно, это основная сила реляционных баз данных. Однако этот факт немного запутан, потому что большинство людей «интуитивно» моделируют свои данные реляционно, потому что именно так мы все обучены.
Ваша сложность заключается именно в стоимости, которую вы должны заплатить CouchDB, чтобы получить другие его функции: HTTP API, гибкая кластеризация, мультимастер или автономная работа и т. Д. По своей конструкции его функции синхронизации возможны, потому что документы простые и не связанные друг с другом .
Однако, другой сильной стороной CouchDB является параллелизм. Так что, если вы уже наслаждаетесь другими функциями CouchDB, и вам просто нужно преодолеть эту проблему, вы можете просто «присоединиться» на стороне клиента.
Более простая функция отображения просто генерирует все начальные значения (key:["from", "A"], value:"whatever1"
) и tos (key:["to","B"], value:"whatever3"
). Таким образом, вы можете запросить его с помощью ?key=["from","A"]
и получить список всех whatevers для любого заданного значения или значения.
Для каждого ссылочного документа у вас есть значение от и до для проверки. Таким образом, запросите оба (либо по одному, либо одновременно, что довольно просто, например, в Javascript):
- Вид с опцией
?key=["from","A"]
- А также вид с
?key=["to","B"]
И как только оба результата вернутся, вы получите ответ по этой ссылке.
Вы обнаружите, что, поскольку вы можете только делать эффективные запросы от CouchDB (сканирование индекса), CouchDB может поддерживать очень высокую частоту запросов и большое количество одновременных соединений.
Это легко? В Javascript все не так плохо, но нет, в принципе это не просто. Этот вопрос в корне противоречит зерну CouchDB и реляционному зерну. (Я лично взволнован Дриззлом для таких проблем.)