Обработка сложных запросов в Firestore - PullRequest
1 голос
/ 30 апреля 2020

У меня есть база данных, состоящая из отзывов, подписчиков и пользователей. Где пользователи, следующие за другими пользователями, - это отношение многие ко многим, смоделированное следующей таблицей. В целом моя схема выглядит следующим образом:

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

1 Ответ

0 голосов
/ 06 мая 2020

Ваши данные кажутся очень реляционными, поэтому лучший вариант для вас - перейти на реляционную базу данных. Единственный способ заставить это работать в firestore - это либо полностью денормализовать ваши данные, либо объединить в кучу кучу запросов, чтобы получить все необходимые данные, на мой взгляд, ни один из них не идеален.

...