Как получить данные из массива определенных путей в Firebase? - PullRequest
0 голосов
/ 17 ноября 2018

Сейчас я работаю с датами, и я структурировал базу данных следующим образом:

database[userId][work][year][month][date]

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

const getWorkData = (userId, year, month, date, callback) => {
    usersRef.child(`${userId}/work/${year}/${month}/${date}`).on("value", snap =>
        callback(snap.val())
    )
}

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

У меня есть два возможных решения, но ни одно из них не практично.

//loop through an array of the week's dates

const weeksDates = [
  {year: 2018, month: 11, date: 12},
  {year: 2018, month: 11, date: 13},
  {year: 2018, month: 11, date: 14},
  {year: 2018, month: 11, date: 15},
  {year: 2018, month: 11, date: 16},
  {year: 2018, month: 11, date: 17},
  {year: 2018, month: 11, date: 18},
];

const userId = "userId";
const getWorkData = (userId, year, month, date, callback) => {
    usersRef.child(`${userId}/work/${year}/${month}/${date}`).on("value", snap =>
        callback(snap.val())
    )
}

//loop through the dates, and fetch data at each date

const getWorkDataOfWeek = (userId, weeksDates) => {
  const data = [];
  const pushToData = value => data.push(value)
  weeksDates.forEach(dateObj => {
    const { year, month, date } = dateObj;
    getWorkData(userId, year, month, date, pushToData)
  })
}

//fetch the whole database, and filter it

const getWorkDataOfWeek = (userId, weeksDates, callback) => {
  usersRef.child(userId).on("value", snap => {
    const workData = snap.val();
    const data = weeksDates.map(dateObj => {
      const { year, month, date } = dateObj;
      return workData[year][month][date];
    })
    callback(data)
  })
}

Проблема с первым методом заключается в том, что он создает слишком много запросов. Проблема со вторым заключается в том, что он запрашивает слишком большой объем данных. Есть ли решение для firebase, похожее на первое, за исключением того, что оно запрашивает только один раз?

1 Ответ

0 голосов
/ 17 ноября 2018

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

Примерно так:

/ UID / year / month / date / UID / year/ неделя / дата.(вы уже должны знать, что неделя 12, 13 ...)

С Firebase действительно легко сохранять данные сразу по нескольким путям, вы используете обновления по нескольким путям.

Статьи о денормализации: https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html

Статьи об обновлениях с несколькими путями: https://medium.com/@danbroadbent/firebase-multi-path-updates-updating-denormalized-data-in-multiple-locations-b433565fd8a5

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

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