Что является лучшим решением для онлайн / оффлайн пользовательских функций Firestore или в реальном времени? - PullRequest
2 голосов
/ 04 февраля 2020

У меня есть база пользователей. Нужно реализовать список, который показывает только онлайн-пользователи. К сожалению, в реальном времени не фильтруется по ключу. Так что это возможно только в Firestore. Но Firestore взимает плату за каждую операцию записи / чтения / обновления, поэтому использование этой функции может быть очень дорогим, так как пользователи постоянно отключаются / подключаются к сети, и будет много операций записи / чтения / обновления. В качестве решения я сделал отдельные таблицы в режиме реального времени, которые экономят только онлайн-пользователей, и здесь мне не нужно платить за запись / чтение / обновление. Но в то же время, это дублирует базу данных, что также не является хорошей практикой.

Не могли бы вы поделиться своим мнением о том, какое решение лучше с "ценовой" и "чистой" точки зрения. Чтобы заплатить за Firestore и использовать один дБ или два дБ, но не платить за каждую операцию?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Что является лучшим решением для онлайн / офлайн функции пользователя Firestore или realtime?

Это зависит от ваших требований, но вы должны не рассмотреть возможность его использования. или другой. Нет ничего плохого в использовании обоих.

К сожалению, в реальном времени не выполняется фильтрация по ключу.

Если вы проверите документы, есть раздел с именем sorting and фильтруя данные , где вы найдете метод с именем orderByKey():

Упорядочить результаты по дочерним ключам.

Так что на самом деле можно отфильтровать результаты запроса и заказывайте их одновременно.

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

Это хорошее решение, с которым вы можете go опередить. На самом деле, и Cloud Firestore, и Firebase Realtime Database работают очень хорошо вместе.

Но в то же время дублирует базу данных, что также не является хорошей практикой.

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

Таким образом, вы можете денормализовать данные, чтобы получить запросы, которые на самом деле невозможны, или сохранить некоторые операции записи, когда дело доходит до Cloud Firestore.

Не могли бы вы поделиться своим мнением о том, какое решение лучше с точки зрения «цены» и «чистоты». Чтобы заплатить за Firestore и использовать один дБ или два дБ, но не платить за каждую операцию?

Использовать их оба.

1 голос
/ 05 февраля 2020

Вы можете выполнять фильтрацию в FB RTDB, она не такая сложная или гибкая, как Firestore (вы можете фильтровать только по одному ключу или значению одновременно), но если она так же тривиальна, как ваш пример, то это, безусловно, возможно (вам нужно использовать индексирование для повышения производительности и ограничения загрузки данных при работе).

В такой структуре БД (игнорируйте узлы ниже 'root', которые не являются 'пользователями', я использую это 'root 'узел для нескольких тестов кода во время моей разработки):

enter image description here

и с использованием этого кода (в Flutter / Dart, но те же параметры доступны в других языки):

    _referenceRoot
    .child("root")
    .child("users")
    .orderByChild("gender")
    .equalTo("male")
    .once()
    .then(
  (DataSnapshot snapshot) {
    print("snapshot.value: ${snapshot.value}");
    if (snapshot.value != null) {
    print("snapshot.key: ${snapshot.key}");
    }
  },
);

Я получаю этот вывод ie. Только для пользователей мужского пола. Обратите внимание, что на снимке выбранные пользователи не упорядочены:

I / флаттер (4307): snapshot.value: {a2: {волосы: коричневый, пол: мужской, возраст: 20}, a3: {волосы: коричневые, пол: мужской, возраст: 20}, a4: {волосы: коричневые, пол: мужской, возраст: 20}, a6: {волосы: коричневые, пол: мужской, возраст: 20}, a8: {волосы : коричневый, пол: мужской, возраст: 20}, a9: {волосы: коричневые, пол: мужской, возраст: 20}, a0: {волосы: коричневые, пол: мужской, возраст: 20}} I / трепетание (4307) : snapshot.key: users

См. это для получения более подробной информации о том, что возможно: https://firebase.google.com/docs/database/rest/retrieve-data

Итак, чтобы ответить на ваш конкретный c вопрос , если фильтрация, которую вам нужно сделать, тривиальна, я бы использовал только FB RTDB. Если сложнее, то должен быть Firestore. Вам нужно будет посчитать расчетные объемы хранения / загрузки данных по сравнению с вызовами и хранилищем БД, чтобы посмотреть, как минимизировать затраты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...