Как правильно структурировать данные такого рода в хранилище?
Вам необходимо знать, что существует нет «идеального», «лучшего» или «правильного» решения для структурирования базы данных Cloud Firestore. Лучшее и правильное решение - это решение, которое соответствует вашим потребностям и облегчает вашу работу. Помните также, что в мире баз данных NoSQL также существует нет единой «правильной структуры данных». Все данные смоделированы, чтобы разрешить варианты использования, которые требуются вашему приложению. Это означает, что того, что работает для одного приложения, может быть недостаточно для другого приложения. Так что нет единого правильного решения для всех. Эффективная структура базы данных типа NoSQL полностью зависит от того, как вы собираетесь ее запрашивать.
То, как вы структурируете свои данные, выглядит хорошо для меня. В общем, есть два способа добиться того же. Первый - сохранить ссылку на провайдера в объекте продукта (как вы это уже делаете) или скопировать весь объект провайдера в документ продукта. Эта последняя техника называется denormalization
и является довольно распространенной практикой, когда дело доходит до Firebase. Поэтому мы часто дублируем данные в базах данных nosql, чтобы удовлетворить запросы, которые в противном случае могут оказаться невозможными. Для лучшего понимания я рекомендую вам посмотреть это видео, Денормализация нормальна с базой данных Firebase . Это для базы данных Firebase в реальном времени, но те же принципы применимы к Cloud Firestore.
Кроме того, когда вы дублируете данные, нужно помнить одну вещь. Точно так же, как вы добавляете данные, вы должны поддерживать их. Другими словами, если вы хотите обновить / обнаружить объект провайдера, вам нужно делать это в каждом месте, где он существует.
Вы можете спросить, какая техника лучше. В самом общем смысле лучший способ хранения ссылок или дубликатов данных в базе данных NoSQL полностью зависит от требований вашего проекта.
Поэтому вам следует задать себе несколько вопросов о данных, которые вы хотите дублировать, или просто сохранить их в качестве ссылок:
- Является ли статика или она со временем изменится?
- Если да, нужно ли обновлять каждый дублированный экземпляр данных, чтобы они все оставались синхронизированными? Это то, что я также упоминал ранее.
- Когда дело доходит до Firestore, вы оптимизируете для производительности или стоимости ?
Если ваши дублированные данные необходимо изменить и сохранить синхронизацию в одно и то же время, то в будущем у вас могут возникнуть трудности с обновлением всех этих дубликатов. Это также может означать, что вы тратите много денег на обновление всех этих документов, так как для каждого изменения потребуется чтение и запись каждого документа. В этом случае выигрышным вариантом будет проведение только ссылок.
При таком подходе вы пишете очень мало дублированных данных (в значительной степени просто Provider ID
). Так что это означает, что ваш код для записи этих данных будет довольно простым и довольно быстрым. Но при чтении данных вам нужно будет загрузить данные из обеих коллекций, что означает дополнительный вызов базы данных. Это обычно не является большой проблемой производительности для разумного количества документов, но определенно требует больше кода и большего количества вызовов API.
Если вам нужно, чтобы ваши запросы были очень быстрыми, вы можете предпочесть дублировать больше данных, чтобы клиенту приходилось читать только один документ на запрашиваемый элемент, а не несколько документов. Но вы также можете зависеть от того, что локальные клиентские кэши делают это дешевле, в зависимости от данных, которые клиент должен прочитать.
При таком подходе вы дублируете все данные для provider
для каждого product
документа. Это означает, что код для записи этих данных является более сложным, и вы определенно сохраняете больше данных, еще один объект поставщика для каждого документа продукта. И вам нужно выяснить, если и как поддерживать его в актуальном состоянии каждый документ. Но с другой стороны, чтение документа product
теперь дает вам всю информацию о документе provider
в one read.
Это общее соображение в базах данных NoSQL: вам часто приходится учитывать производительность записи и дисковое пространство в сравнении с производительностью чтения и масштабируемостью.
По вашему выбору, дублировать или нет некоторые данные, это сильно зависит от ваших данных и их характеристик. Вам придется продумывать это в каждом конкретном случае.
Так что, в конце, помните, что оба являются допустимыми подходами, и ни один из них не является значительно лучшим, чем другой. Все зависит от того, каковы ваши варианты использования и насколько вы удобны с этой новой техникой дублирования данных. Дублирование данных - ключ к быстрому чтению не только в облачной базе данных Firestore или Fireabase в реальном времени, но и в целом. Каждый раз, когда вы добавляете одни и те же данные в другое место, вы дублируете данные в пользу более быстрой производительности чтения. К сожалению, взамен у вас есть более сложное обновление и более высокое использование памяти и памяти. Но вы должны отметить, что дополнительные вызовы в базе данных реального времени Firebase, не дорогие, в Firestore есть. Сколько данных дублирования в сравнении с дополнительными вызовами базы данных является оптимальным для вас, зависит от ваших потребностей и вашей готовности отказаться от «единой точки определения», которую можно назвать очень субъективной.
После завершения нескольких проектов Firebase я обнаружил, что мой код для чтения значительно упрощается, если я дублирую данные. Но, конечно, написание кода становится более сложным одновременно. Это компромисс между этими двумя и вашими потребностями, который определяет оптимальное решение для вашего приложения. Более того, чтобы быть еще более точным, вы также можете измерить то, что происходит в вашем приложении, используя существующие инструменты, и принять соответствующее решение. Я знаю, что это не конкретная рекомендация, но это разработка softwarte. Все связано с измерением вещей.
Помните также, что некоторые структуры баз данных легче защитить с помощью некоторых правил безопасности. Поэтому постарайтесь найти схему, которую можно легко защитить, используя Правила безопасности Cloud Firestore .
Пожалуйста, посмотрите на мой ответ из этого поста , где я объяснил больше о collections
, maps
и arrays
в Firestore.