2016-08-30 45 views
1

我幾乎在任何地方閱讀了關於構建高效查詢的Firebase Database,但我仍然對兩種替代方法有點混淆。Firebase - 爲高效索引構造數據

例如,假設我想從過去7天左右獲取用戶的所有「maxBenchPressSessions」。

我這兩個結構之間採摘之間卡住:

enter image description here

在第一組合,我用的是用戶的ID作爲屬性索引是否真的還是假的。第二,我使用userId作爲屬性NAME,其值將是用戶的ID。

其中一個比另一個更快,還是會以相對相同的方式進行索引?我對數據庫設計很陌生,所以我想確保我遵循正確的做法。

進展

我想出了將兩者打平我的數據庫,並允許我補充一個ListenerForSingleValueEvent使用orderBy只有一次的解決方案,但只有當我要檢查,如果用戶有一個會話保存一個特定的一天。

enter image description here

我可以有各自maxBenchPressSession對象具有在userId_dateString的格式的密鑰。但是,如果我想從最近7天獲得所有用戶的會話,我不知道如何在一個查詢中執行此操作。

任何想法?

+0

沒有數據結構,它是固有地更快或更慢。區別取決於您如何從代碼中訪問數據。如果你顯示你想寫的查詢,它會更容易幫助。一般來說:爲您的應用程序訪問數據建模數據。看到這篇關於[NoSQL數據建模]的文章(https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/) –

+0

我會用一個值事件監聽器來做一個查詢。我會在過去7天內從用戶那裏獲得所有'maxBenchPressSessions'。 – Rafi

回答

1

我建議觀看視頻。它被告知有關數據的結構非常好。

References to the playlist on the firebase 3

Firebase 3.0: Data Modelling

Firebase 3.0: Node Client

+0

我在視頻中看到他使用「用戶名」作爲鍵和用戶的用戶名作爲值的部分,但這與Firebase文檔在使用用戶的用戶名作爲鍵和布爾值作爲值時矛盾。 – Rafi

+0

我的問題更多的是要麼更有效,要麼這些方法是相同的。順便說一句,我不是在試圖傳輸數據。我只是簡單地設置一個值事件監聽器來獲取數據一次。 – Rafi

0

當我明白一個道理火力有效地使用它。應該儘可能小地查詢數據,並且無論多少請求都無關緊要。

但你會接近這樣的要求。我們必須將另一個字段添加到數據庫「negativeDate」中。

該字段允許您獲取最後7個條目。這裏有一個視頻 - 請求 https://www.youtube.com/watch?v=nMR_JPfL4qg&feature=youtu.be&t=4m36s

enter image description here

.limitToLast(7) - 7 entries 
.orderByChild('negativeDate') - sort by date 

例子:

const ref = firebase.database().ref('maxBenchPressSession'); 
ref.orderByChild('negativeDate').limitToLast(7).on('value', function(snap){ }) 
+0

這與我所需要的非常接近,但這隻能給我所有來自過去7天的會話,無論用戶如何。我需要在過去七天內完成所有用戶的會話。 – Rafi

0

然後添加用戶,並把所有的會話。

enter image description here

const ref = firebase.database().ref('maxBenchPressSession/' + userId); 
ref.orderByChild('negativeDate').limitToLast(7).on('value', function(snap){ })