【问题标题】:Maintaining dynamically computed values in firebase在 Firebase 中维护动态计算的值
【发布时间】:2016-02-05 12:42:06
【问题描述】:

我有一个简单的 firebase 数据库:/rides 是这样的简单对象列表

{
  car: "Toyota"
  minutes: 15
}

我需要显示所有游乐设施的总分钟数。显而易见的解决方案是加载所有游乐设施并计算总和。但如果我有数百次骑行,这会非常慢,最多几秒钟。

所以看来我必须为此在数据库中维护一个单独的字段/totalMinutes。但因此,每次添加/删除/更改行程时,我都必须手动更新/totalMinutes。无论如何,这不是什么大不了的工作。

但是,如果我只需要计算一部分游乐设施的总分钟数怎么办?例如仅适用于“Toyota”汽车或“Ford”汽车?手动维护/totalMinutesFord/totalMinutesToyota 现在似乎没那么容易了。

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

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    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;
    })
    

    【讨论】:

    • 谢谢!但是,如果我需要根据用户输入计算一部分游乐设施的 totalMinutes 怎么办?例如仅对于游乐设施,哪个分钟值大于用户输入的值?我无法为所有可能的用户输入维护预先计算的值
    • 那只会留下下载相关数据并计算它的选项。但它总是会对进行聚合的设备和数据库造成压力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多