2016-08-30 8 views
1

私は効率的なクエリのためにほとんどどこでもFirebase Databaseを構造化していますが、私はまだ2つの選択肢の間で少し混乱しています。Firebase - 効率的なインデックス作成のためのデータ構造

たとえば、過去7日間ほどのユーザーのすべての「maxBenchPressSessions」を取得したいとします。

私はこれら二つの構造の間で選ぶの間にこだわっている:最初の配列で

enter image description here

、私はどうか真か偽のインデックスの属性として、ユーザーのIDを使用します。 2番目の例では、値NAMEのユーザーIDとなるNAME属性としてuserIdを使用します。

どちらか一方が速いのですか、比較的同じようにインデックスが付けられますか?私はデータベース設計に新しいことがあるので、私は正しいプラクティスに従っていることを確認したい。

PROGRESSは

私は両方の私のデータベースを平らにし、私は一度だけorderByを使用してListenerForSingleValueEvent追加できるようになります解決策が出ているが、私は確認したい場合にのみ、ユーザーが持っている場合セッションは特定の日に保存されます。

enter image description here

私は、各maxBenchPressSessionオブジェクトがuserId_dateStringの形式のキーを持つことができます。しかし、私が最後の7日間のすべてのユーザーのセッションを取得したい場合、私は1つのクエリでそれを行う方法がわかりません。

アイデア?

+0

本質的に速いか遅いはデータ構造がありません。違いは、コードからデータにアクセスする方法によって異なります。あなたが書きたい質問を表示すると、助けがより簡単になります。一般的には、あなたのアプリがそれにアクセスする方法のデータをモデル化します。 [NoSQLデータモデリング](https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/)についての記事を参照してください。 –

+0

私は単一の値のイベントリスナーを使って1つのクエリを作成します。私はすべての 'maxBenchPressSessions'を過去7日間のユーザーから取得します。 – 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

私はそれを効果的に使用するための原則firebaseを理解しています。データを照会するために可能な限り小さくする必要があり、要求の数は関係ありません。

しかし、あなたはそのような要求に近づくでしょう。データベース "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日間のセッションをすべて提供します。私は過去7日間のユーザーセッションをすべて取得する必要があります。 – Rafi

0

次に、ユーザーを追加し、それはそのセッションのすべてを置きます。

enter image description here

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