У меня есть база данных, состоящая из отзывов, подписчиков и пользователей. Где пользователи, следующие за другими пользователями, - это отношение многие ко многим, смоделированное следующей таблицей. В целом моя схема выглядит следующим образом:
- follow (collection) - ключ: fid
- follow (uid)
- follower (uid)
- рецензия (коллекция) - ключ: рид
- заголовок (строка)
- автор (uid)
- отправлено (отметка времени)
- пользователь (коллекция) - ключ: uid
- создан (метка времени)
- электронная почта (строка)
Я хочу выполнить запрос, чтобы получить T
самые последние отзывы, где пользователь следит за автором. В среде SQL я бы сделал это с двумя предложениями joins
и where
.
Давайте рассмотрим пользователя, следующего за n
людьми, где каждый человек, за которым они следуют, имеет m
обзоры. Я подумывал найти все отзывы для всех n
людей, за которыми следит, а затем отбросить всех, кто старше T
, но признать, что число чтений будет n*m
. Как мы можем легко ожидать, n > 100
и m > 1000
, это не является жизнеспособным решением. Я признаю, что, вероятно, нет лучшего способа сделать это в магазине. Любые предложения?
ОБНОВЛЕНИЕ: Главный ответ на аналогичный вопрос дает решение nk
(где k
- произвольный предел) для ряда операций чтения. Он также отвечает на более простой вопрос: "получить T
самые последние отзывы для каждого человека, за которым следует подписаться" не"получить T
самые последние отзывы о всех людях, за которыми следуют". В этом ответе предлагается хранить обновленную копию всех подписчиков в каждом обзоре, а затем выполнить условие whereArrayContains
, чтобы найти отзывы, за которыми следуют. Но если пользователь A
следует за пользователем B
, у которого есть B_m
отзывов, мы будем выполнять B_m
записи для каждого подписки или отмены подписки. Мы также будем массивно денормировать нашу базу данных, хранить и обновлять ту же информацию в тысячах мест.