Имитация соединения для базы данных документов NoSQL

#mongodb #couchdb #ravendb #nosql

#mongodb #couchdb #ravendb #nosql

Вопрос:

Существуют ли какие-либо обходные пути для выполнения запроса, подобного соединению, с базой данных документов NoSQL?

Пример: нам нужно выбрать статьи за последний месяц от пользователей с рейтингом более тысячи. Решение SQL

 SELECT a.* FROM Articles as a
INNER JOIN Users as u ON a.UserId = u.Id
WHERE a.Date > (Now - Month) AND u.Rating > 1000
  

Я могу представить несколько решений NoSQL. Сначала это решение с двумя запросами:

  1. Поиск пользователей с рейтингом более 1000
  2. Извлеките статьи за последний месяц для этих пользователей

Мне это не нравится, так как мне нужно сделать два запроса, и я должен получить всех пользователей с рейтингом> 1000 (что, если у меня 1kk пользователей?)

Другое решение NoSQL, которое приходит мне на ум, — это денормализация. Но я не большой поклонник этого. Я был бы не против размещения коллекции комментариев в объекте post (потому что комментарии принадлежат post), но мне не нравится помещать пользователя в статью или статьи внутри пользователя.

Существуют ли какие-либо другие решения?

Ответ №1:

Вы можете сделать это, используя несколько карт / уменьшить индексы с помощью RavenDB. Смотрите здесь.

Ответ №2:

RavenDB Multi Maps очень хорошо справляется с этими сценариями:

http://ayende.com/blog/89089/ravendb-multi-maps-reduce-indexes

Ответ №3:

Другим решением может быть PlayOrm, в котором вы можете разделить таблицу, выбрать и объединить разделы. ЭТО в основном похоже на гибернацию с JQL и все, кроме запросов к разделам. Возможно, если вы разделите по месяцам, вы можете запустить простой запрос старой школы select для этого раздела и объединить его с чем-то другим. Теперь NoSQL, похоже, объединяет через PlayOrm ;). Это, конечно, не делает объединения на ОГРОМНЫХ таблицах. При выполнении объединений размер РАЗДЕЛА должен быть сопоставимым с размерами таблиц СУБД….Размер таблицы может быть бесконечным (т.е. у вас бесконечные разделы).