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