1

是否更好地存储计数器,并在每次更改或实时从每个可能的数据源进行计算时实时更新它?Firebase/NoSQL数据库:实时更新统计信息还是计算它们?

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

例如乔检查入咖啡地点:

  • 乔/ CoffeePlace/+ 1

现在佛瑞德,汤姆和Lisa也检查到了咖啡地点:

  • 佛瑞德/ CoffeePlace/+ 1
  • 汤姆/ CoffeePlace/+ 1
  • 莉莎/ CoffeePlace/+ 1

以上是跟踪个人的必要条件,但跟踪Coffee Place的入住总数的最佳做法对我来说还不清楚。

这是正确的做法?

  1. 来自每个用户节点收集数据,然后计算所有签入 - >显示总签到
  2. 创建咖啡放置一个文件,该文件在像每个检查更新: CoffeePlace/+ 1 + 1 + 1 + 1

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

回答

1

在火力地堡(和大多数NoSQL数据库),你经常存储您的应用程序消耗的方式的数据。

所以,如果你想在一个地方跟踪检查插件的数量,那么你应该至少是跟踪签入每个地方。

PlaceCheckins 
    CoffeePlace 
    Fred: true 
    Tom: true 
    Lisa: true 

如果你也想显示其中特定用户已签的地方,你会保持每个用户相同的数据(因为你已经有了)。

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

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

为了保持两个列表同步,你会使用多位置更新或交易(取决于你如何组织数据位)。签入珍妮到咖啡的地方可以用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特定)介绍。