我现在正在处理日期,并且我这样构造数据库:
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是否有类似于第一个的解决方案?
答案 0 :(得分:1)
像Firebase这样的对象数据库的原理是能够按照您想要的方式来安排数据,并且将来需要使用它。这样可以防止在检索数据时增加CPU负载,等等,您可以通过执行非规范化来实现。这意味着您可以预期将如何需要数据并进行写回。因此,您需要按周和按日期的数据,请首先将数据写成周和日期。
类似这样的东西:
/ UID /年/月/日 / UID /年/周/日期。 (您应该已经知道那周是12、13 ...)
有了Firebase,一次使用多个路径更新就可以很容易地将数据保存在多个路径上。
有关非规范化的文章:https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html
P.S。我还要补充一点,在我看来,您只想在需要时才读取该数据,因此请使用一次,而不要使用。