2016-02-05 66 views
1

动态计算值,我有一个简单火力数据库:/rides是这样保持火力

{ 
    car: "Toyota" 
    minutes: 15 
} 

简单对象的列表,我需要显示所有的游乐项目分钟的总和。显而易见的解决方案是加载所有游乐设施并计算总和。但是,如果我有几百个游乐设施,这是非常缓慢的,长达几秒钟。

所以看来我必须在数据库中为此保留一个单独的字段/totalMinutes。但是,因此每次添加/移除/换乘时都必须手动更新/totalMinutes。无论如何,这不是一个大问题。

但是如果我只需要计算一部分游乐设施的总分钟数呢?例如只有“丰田”汽车或“福特”汽车?手动维护/totalMinutesFord,/totalMinutesToyota现在看起来并不那么容易。

那么在firebase中维护这种动态值的正确方法是什么?

回答

3

Firebase无法根据数据库中的数据自动计算值。

所以,你有两个选项:

  1. 计算值,只要你更新数据
  2. 检索所有的数据和客户端

你已经(明智地)决定计算值检索所有数据不是一个好主意。您的用户将会对此感恩。

因此,无论何时更新乘车数据,都会计算派生值。我不知道为什么要为多个值做这件事比为单个值做更难。它可能是更多的代码,但它几乎相同的代码:

var ride = { car: "Toyota", minutes: 15 }; 
ref = new Firebase('https://yours.firebaseio.com/'); 
ref.child('rides').push(ride); 
ref.child('totalMinutes').transaction(function(current_value) { 
    return (current_value || 0) + ride.minutes; 
}); 
ref.child('totalMinutes'+ride.car).transaction(function(current_value) { 
    return (current_value || 0) + ride.minutes; 
}) 
+0

Thanks!但是,如果我需要根据用户输入计算游乐设施子集的总分数,该怎么办?例如只用于游乐设施,哪些分钟值大于用户输入的内容?我无法为所有可能的用户输入保留预先计算的值 – netimen

+1

这只会让您下载相关数据并进行计算。但是对于进行聚合和数据库的设备来说,这一直是一个压力。 –