Лучший дизайн структуры данных в Firestore между двумя?

#firebase #google-cloud-firestore #nosql

#firebase #google-облако-firestore #nosql

Вопрос:

У меня есть сомнения относительно того, как структурировать мои данные firestore.

Ежедневно у меня есть такая информация, как:

 TodayDate, From, ToUser1, Subject, Attachment2, AttachmentTypeB
TodayDate, From, ToUser1, Subject, Attachment3, AttachmentTypeA
TodayDate, From, ToUser2, Subject, Attachment4, AttachmentTypeA
TodayDate, From, ToUser2, Subject, Attachment5, AttachmentTypeC

  

Тема и От никогда не совпадают.

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

 0/ Root / doc / sub col / sub col fields

1/ users / userid / date / from,subject,etc
OR
2/ reports / date / userid / from,subject,etc 
  

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

Какой ваш совет, пожалуйста?

С уважением,

Джули

Комментарии:

1. Оба варианта выглядят как большие деревья JSON и предполагают, что вы рассматриваете возможность использования базы данных реального времени, а не firestore. Правильно ли я понимаю, что TodayDate , From и т.д. — Это все свойства типичной записи в ваших данных?

2. Да, вы правильно понимаете. Я мог бы использовать Firebase DB? Будет ли это иметь больше смысла с точки зрения стоимости?

Ответ №1:

Учитывая вашу текущую структуру данных, я предлагаю вам просто использовать cloud firestore вместо базы данных реального времени, поскольку это лучше масштабируется, и вы получаете довольно хорошую производительность при очень низких затратах.

Вы могли бы создать коллекцию, каждая из записей которой содержит перечисленные вами атрибуты: TodayDate, From, ToUser2, Subject, Attachment5, AttachmentTypeC . И его легко запросить, используя where:

 firestore().collection("myCollection").where("subject", "==", subject).get()
  

Смотрите это сравнение.

ОБНОВЛЕНИЕ: Что касается ваших двух вариантов, я не думаю, что все сводится к тому, какой вариант извлекает / обновляет больше / меньше записей. Это зависит от требований вашего приложения / фактического использования. Возможно, вам потребуется извлечь записи для конкретного пользователя, а не только для определенной даты, и наоборот. Итак, обе структуры на самом деле не имеют никакого значения с точки зрения стоимости, если только вы не уверены, что вам никогда не понадобится извлекать записи для каждого пользователя.

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

Комментарии:

1. Спасибо, я уже был на грани выбора firestore, просто я не уверен, как его спроектировать. Я колеблюсь между 1 / users (как col) / userid (как doc) / date (как subcol) / from, subject и т.д. Или 2 / reports (col) / date (doc) / userid (subcol) / from, subject и т.д.

2. Спасибо за ответ!

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

4. У каждого документа в вашей коллекции могут быть атрибуты date и userid . При выборке используйте where() предложение для различения. Нравится firestore().collection("myCollection").where("userid", "==", userid).get() . Вы также могли бы связать предложения where для создания более сложных запросов. Смотрите firebase.google.com/docs/firestore/query-data/queries