【问题标题】:Firebase/NoSQL Database: Update stats realtime or compute them?Firebase/NoSQL 数据库:实时更新统计数据或计算它们?
【发布时间】:2016-12-11 08:07:07
【问题描述】:

存储一个计数器并在每次更改时实时更新它或从每个可能的数据源计算它更好吗?

例如: 我正在构建一个跟踪“签到”的应用程序,类似于 FourSquare。 当用户“签到”到某个位置时,我需要跟踪个人的统计信息以及所有用户的位置总数。 (为简洁起见,这是应用程序的简化版本,真正的应用程序会跟踪更多信息)。

例如 Joe 到 Coffee Place 打卡:

  • 乔/CoffeePlace/+1

现在 Fred、Tom 和 Lisa 也去咖啡店打卡了:

  • 弗雷德/CoffeePlace/+1
  • 汤姆/CoffeePlace/+1
  • 丽莎/CoffeePlace/+1

以上内容对于跟踪个人而言是必要的,但我不清楚在 Coffee Place 跟踪签到总数的最佳做法。

哪种方法是正确的?

  1. 从每个用户节点收集数据,然后计算所有签到 -> 显示签到总数
  2. 为 Coffee Place 创建一个文件,该文件在每次入住时都会更新,例如: CoffeePlace/+1+1+1+1

我想对于非常大的数据集,计算上会很耗时(不是因为计算,而是因为从每个节点收集数据)。这里的最佳做法是什么?

【问题讨论】:

    标签: firebase design-patterns database-design firebase-realtime-database database


    【解决方案1】:

    在 Firebase(和大多数 NoSQL 数据库)中,您通常会按照应用程序使用数据的方式存储数据。

    因此,如果您尝试跟踪某个地点的签到次数,那么您至少应该跟踪每个地点的签到次数。

    PlaceCheckins
      CoffeePlace
        Fred: true
        Tom: true
        Lisa: true
    

    如果您还想显示特定用户签到的地点,您将保留每个用户的相同数据(就像您已经拥有的一样)。

    UserCheckins
      Fred: 
        CoffeePlace: true
      Tom: 
        CoffeePlace: true
      Lisa: 
        CoffeePlace: true
    

    这种类型的数据重复在 Firebase 中是很正常的(同样:一般的 NoSQL 数据库)。磁盘空间便宜,用户的时间不便宜。通过复制数据,您可以确保在应用中获得特定屏幕所需的准确信息。

    要使两个列表保持同步,您可以使用多位置更新或事务(取决于您如何构建数据)。 Jenny 进入咖啡店的签到可以用 JavaScript 编码为:

    var updates = {};
    updates['/PlaceCheckins/CoffeePlace/Jenny'] = true;
    updates['/UserCheckins/Jenny/CoffeePlace'] = true;
    ref.update(updates);
    

    如果您还想显示签到计数(针对特定地点的特定用户),您可以下载签到并在客户端进行计数,或者将总数保存在数据库中。如果您采用后一种方法,请查看我在 Is the way the Firebase database quickstart handles counts secure? 上的回答

    最后:阅读这篇文章以获得对 NoSQL data modeling 的精彩(非 Firebase 特定)介绍。

    【讨论】:

      猜你喜欢
      • 2022-08-23
      • 2022-11-14
      • 1970-01-01
      • 2017-10-23
      • 2012-12-08
      • 2021-10-08
      • 2023-03-22
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多