Как правильно структурировать такие данные в Firestore? - PullRequest
0 голосов
/ 30 октября 2018

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

Я имею в виду это веб-приложение, в котором я хочу хранить своих провайдеров из другой категории продуктов. Я хочу выполнить поисковый запрос по всем моим продуктам, чтобы выяснить, какие поставщики у меня есть для такого продукта, и в конечном итоге получить доступ к информации об этом поставщике.

Я планирую использовать эту структуру для этой цели:

Providers ( Collection )
   Provider 1 ( Document )
      Name
      City
      Categories
   Provider 2
      Name
      City

Products ( Collection )
   Product 1 ( Document )
      Name
      Description
      Category
      Provider ID
   Product 2
      Name
      Description
      Category
      Provider ID

Итак, мой вопрос: является ли этот подход правильным способом доступа к информации о поставщике, как только я получу продукт, который хочу?

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

1 Ответ

0 голосов
/ 30 октября 2018

Как правильно структурировать данные такого рода в хранилище?

Вам необходимо знать, что существует нет «идеального», «лучшего» или «правильного» решения для структурирования базы данных Cloud Firestore. Лучшее и правильное решение - это решение, которое соответствует вашим потребностям и облегчает вашу работу. Помните также, что в мире баз данных NoSQL также существует нет единой «правильной структуры данных». Все данные смоделированы, чтобы разрешить варианты использования, которые требуются вашему приложению. Это означает, что того, что работает для одного приложения, может быть недостаточно для другого приложения. Так что нет единого правильного решения для всех. Эффективная структура базы данных типа NoSQL полностью зависит от того, как вы собираетесь ее запрашивать.

То, как вы структурируете свои данные, выглядит хорошо для меня. В общем, есть два способа добиться того же. Первый - сохранить ссылку на провайдера в объекте продукта (как вы это уже делаете) или скопировать весь объект провайдера в документ продукта. Эта последняя техника называется denormalization и является довольно распространенной практикой, когда дело доходит до Firebase. Поэтому мы часто дублируем данные в базах данных nosql, чтобы удовлетворить запросы, которые в противном случае могут оказаться невозможными. Для лучшего понимания я рекомендую вам посмотреть это видео, Денормализация нормальна с базой данных Firebase . Это для базы данных Firebase в реальном времени, но те же принципы применимы к Cloud Firestore.

Кроме того, когда вы дублируете данные, нужно помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить объект провайдера, вам нужно делать это в каждом месте, где он существует.

Вы можете спросить, какая техника лучше. В самом общем смысле лучший способ хранения ссылок или дубликатов данных в базе данных NoSQL полностью зависит от требований вашего проекта.

Поэтому вам следует задать себе несколько вопросов о данных, которые вы хотите дублировать, или просто сохранить их в качестве ссылок:

  1. Является ли статика или она со временем изменится?
  2. Если да, нужно ли обновлять каждый дублированный экземпляр данных, чтобы они все оставались синхронизированными? Это то, что я также упоминал ранее.
  3. Когда дело доходит до Firestore, вы оптимизируете для производительности или стоимости ?

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

При таком подходе вы пишете очень мало дублированных данных (в значительной степени просто Provider ID). Так что это означает, что ваш код для записи этих данных будет довольно простым и довольно быстрым. Но при чтении данных вам нужно будет загрузить данные из обеих коллекций, что означает дополнительный вызов базы данных. Это обычно не является большой проблемой производительности для разумного количества документов, но определенно требует больше кода и большего количества вызовов API.

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

При таком подходе вы дублируете все данные для provider для каждого product документа. Это означает, что код для записи этих данных является более сложным, и вы определенно сохраняете больше данных, еще один объект поставщика для каждого документа продукта. И вам нужно выяснить, если и как поддерживать его в актуальном состоянии каждый документ. Но с другой стороны, чтение документа product теперь дает вам всю информацию о документе provider в one read.

Это общее соображение в базах данных NoSQL: вам часто приходится учитывать производительность записи и дисковое пространство в сравнении с производительностью чтения и масштабируемостью.

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

Так что, в конце, помните, что оба являются допустимыми подходами, и ни один из них не является значительно лучшим, чем другой. Все зависит от того, каковы ваши варианты использования и насколько вы удобны с этой новой техникой дублирования данных. Дублирование данных - ключ к быстрому чтению не только в облачной базе данных Firestore или Fireabase в реальном времени, но и в целом. Каждый раз, когда вы добавляете одни и те же данные в другое место, вы дублируете данные в пользу более быстрой производительности чтения. К сожалению, взамен у вас есть более сложное обновление и более высокое использование памяти и памяти. Но вы должны отметить, что дополнительные вызовы в базе данных реального времени Firebase, не дорогие, в Firestore есть. Сколько данных дублирования в сравнении с дополнительными вызовами базы данных является оптимальным для вас, зависит от ваших потребностей и вашей готовности отказаться от «единой точки определения», которую можно назвать очень субъективной.

После завершения нескольких проектов Firebase я обнаружил, что мой код для чтения значительно упрощается, если я дублирую данные. Но, конечно, написание кода становится более сложным одновременно. Это компромисс между этими двумя и вашими потребностями, который определяет оптимальное решение для вашего приложения. Более того, чтобы быть еще более точным, вы также можете измерить то, что происходит в вашем приложении, используя существующие инструменты, и принять соответствующее решение. Я знаю, что это не конкретная рекомендация, но это разработка softwarte. Все связано с измерением вещей.

Помните также, что некоторые структуры баз данных легче защитить с помощью некоторых правил безопасности. Поэтому постарайтесь найти схему, которую можно легко защитить, используя Правила безопасности Cloud Firestore .

Пожалуйста, посмотрите на мой ответ из этого поста , где я объяснил больше о collections, maps и arrays в Firestore.

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