Firebase / NoSQL数据库:实时更新统计数据还是计算它们?

时间:2016-08-05 02:35:40

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

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

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

例如Joe检查了Coffee Place:

  • 乔/ CoffeePlace / + 1

现在弗雷德,汤姆和丽莎也检查了咖啡馆:

  • Fred / CoffeePlace / + 1
  • 汤姆/ CoffeePlace / + 1
  • 莉莎/ CoffeePlace / + 1

以上是跟踪个人的必要条件,但跟踪咖啡广场办理登机手续总数的最佳做法对我来说还不清楚。

哪种方法正确?

  1. 从每个用户节点收集数据,然后计算所有签到次数 - >显示总检查
  2. 为Coffee Place创建一个文件,在每次检入时更新如下: 的 CoffeePlace / + 1 + 1 + 1 + 1
  3. 我认为对于非常大的数据集而言,计算上耗费时间(不是因为计算而是因为从每个节点收集数据)。这里的最佳做法是什么?

1 个答案:

答案 0 :(得分:2)

在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特定)简介。