Как и большинство, я из мира 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 предметов без тегов».
Поэтому мой вопрос:
- Можете ли вы указатьмне некоторые материалы для чтения по этому вопросу?
- Можете ли вы поделиться некоторыми идеями о том, как можно выполнить задачу эффективно ?
Примечание: я знаю, что вы теряете гибкость запросов с базами данных документов, но наверняка должен быть способ сделать это?