Основные операции на основе множеств с использованием базы данных документов (noSQL) - PullRequest
3 голосов
/ 15 июля 2011

Как и большинство, я из мира RDMS пытаюсь разобраться с базами данных noSQL и, в частности, с хранилищами документов (поскольку я нахожу их наиболее интересными).

Я пытаюсь понять, как выполнить некоторыеоснованные на множестве операции с использованием базы данных документов (я играю с RavenDB).

Итак, насколько я понимаю:

  • Union (как в SQL UNION) очень прямолинейное добавление.Кроме того, можно добиться объединения / объединения различных наборов (SQL JOIN).Хорошим началом является пример, приведенный в книге по мифологии RavenDB с количеством комментариев в записях блогов.
  • Пересечение может быть выполнено с использованием ряда приемов от денормализации до создания «отображение »или« ссылка »документ, как описано здесь (и пример агрегатора ниже).В RDMS это будет выполнено с использованием простого «INNER JOIN» или «WHERE x IN»
  • Вычитание (Относительное дополнение) - вот где я застреваю.В RDMS эта операция представляет собой просто «WHERE x NOT IN» или «LEFT JOIN», где объединенный набор равен NULL.

Используя пример из реального мира, скажем, у нас есть агрегатор RSS (такойкак Google Reader), который имеет миллионы, если не миллиарды записей RSS с тысячами пользователей, каждый из которых помечает избранное и т. д.

В этом примере мы фокусируемся на записи, пользователе и теге;где тег действует как ссылка между пользователем и записью.

user {string id, string name /*etc.*/}
entry {string id, string title, string url /*etc.*/}
tag {string userId, string entryId, string[] tags} /* (favourite, read, etc.)*/

При вышеупомянутом подходе легко выполнить пересечение между записью и пользователем, используя тег.Но я не могу понять, как можно выполнить вычитание.Например, «Верните все предметы, у которых нет тегов» или, что еще более сложно, «верните последние 1000 предметов без тегов».

Поэтому мой вопрос:

  • Можете ли вы указатьмне некоторые материалы для чтения по этому вопросу?
  • Можете ли вы поделиться некоторыми идеями о том, как можно выполнить задачу эффективно ?

Примечание: я знаю, что вы теряете гибкость запросов с базами данных документов, но наверняка должен быть способ сделать это?

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Amok, то, что вы хотите, не может быть легко сделано в нереляционных базах данных.Главным образом потому, что они не думают в множествах и имеют прочные связи с распределенными вычислениями.Например, вы не можете делать эффективные наборы, не имея доступа ко всем данным, и это в значительной степени означает, что любой операции на основе наборов будет необходим доступ ко всем этим.Поскольку базы данных NoSQL обычно используются в распределенных сценариях, они не могут это поддерживать.RavenDB, в частности, разрешает некоторые операции с указанным набором, но он основан на допущении независимых документов, которые не имеют прочных связей с другими документами или документами, которые необходимо обрабатывать все вместе одинаковым образом.1001 *

0 голосов
/ 17 июля 2011

Переход от СУБД к базе данных документов не является полностью гладким, и может потребоваться некоторый рефакторинг вашей Модели, чтобы сделать ее оптимальной.Это связано с разной природой этих технологий.

Re.операции на основе множеств в RavenDB, см .:

http://ayende.com/blog/4535/set-based-operations-with-ravendb

http://ravendb.net/documentation/set-based

...