#firebase #google-cloud-firestore #nosql
#firebase #google-облако-firestore #nosql
Вопрос:
Я создаю приложение, которое работает следующим образом: пользователь приложения является менеджером команды, он / она задает несколько вопросов команде и собирает данные в приложении. Ежемесячно на основе этих данных создается отчет. Не существует варианта использования / сценария, в котором пользователю нужно будет просматривать все данные сразу, т. Е. Не фильтровать по месяцам.
При этом я думал о моделировании данных таким образом:
- persons/{personId}:
- name
- answersByPerson/{personId}:
- personName
- byMonth/{YYYYMM}: (using month as key)
- month
- collectedAnswers/{uuid}:
- answer_to_q1 ... (these are all yes or no questions)
_ answer_to_qn
- aggregationsByPerson/{personId}: (this should be computed by cloud function)
- month
- byMonth/{YYYYMM}: (also using month as key)
- sum_q1... (count amount answered with 'yes')
- sum_qn
- reportByPerson/{personId}:
- personName
- month
- score (computed from aggregations)
Итак, у меня есть следующие вопросы:
- Плохо ли мне использовать год / месяц в качестве ключей к моим документам? (Я бы убедился, что в моем приложении перезаписаны данные, если ключ существует)
- Плохо ли для меня повторно использовать PersonID в качестве ключей в коллекции answersByPerson? Идея в том, что мне не нужно было бы извлекать коллекцию persons или фильтровать коллекцию ответов по PersonID.
- Для меня слишком сложно использовать ежемесячные пакеты? Я подумал, что, возможно, я сэкономлю немного денег, если буду извлекать
collection('answersByPerson').doc('$personId').collection($month)
вместо выборкиcollection('answersByPerson').doc('$personId').where(...)
. - Кроме того, имеет ли смысл для меня помещать агрегации в коллекцию ответов? Смогу ли я обновить его без использования облачной функции или это может привести к проблемам с синхронизацией?
редактировать: я искал об этом, и кажется, что термин «пакетирование» не так уж распространен, я взял его из этой статьи .
Ответ №1:
- Firestore взимает плату за количество прочитанных документов и потребляемую пропускную способность; он явно не взимает плату за количество документов, по которым он должен выполнить поиск. Если вы можете написать запрос, чтобы получить именно те документы, которые вам нужны, из объединенной коллекции, тогда стоимость будет точно такой же между этими двумя операциями. Более однозначно: так же будет и производительность, поскольку производительность Firestore зависит только от объема данных, которые вы извлекаете, а не от размера коллекции.
Комментарии:
1. Я не уверен, что правильно понимаю, как может быть так, что фильтрация списка, например, из 3000 документов, для извлечения 30 из них выполняется так же быстро, как получение коллекции, содержащей эти 30 конкретных документов? Разве не должно быть O (N), а другое O (1)? Даже если в конце концов с меня возьмут столько же?
2. Это магия стратегии индексации Firestore, а также причина, по которой она не поддерживает многие типы запросов, к которым вы можете привыкнуть из других баз данных: все запросы в Firestore имеют значение O (1). В популярных словах: поиск иголок в нашем стоге сена зависит от количества иголок, а не от размера стога сена. Это довольно волшебно, поэтому я настоятельно рекомендую попробовать: просто продолжайте добавлять документы в коллекцию (с другого устройства или скрипта узла) и обратите внимание, что производительность запросов на стороне сервера остается прежней.