#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. Сначала это решение с двумя запросами:
- Поиск пользователей с рейтингом более 1000
- Извлеките статьи за последний месяц для этих пользователей
Мне это не нравится, так как мне нужно сделать два запроса, и я должен получить всех пользователей с рейтингом> 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 ;). Это, конечно, не делает объединения на ОГРОМНЫХ таблицах. При выполнении объединений размер РАЗДЕЛА должен быть сопоставимым с размерами таблиц СУБД….Размер таблицы может быть бесконечным (т.е. у вас бесконечные разделы).