2016-10-22 3 views
0

データベース階層:ユーザーが作成したすべての投稿を正しく照会するにはどうすればよいですか?

posts 
    post1_uid 
     author: user2UID 
     info1 
     info2 
    post2_uid 
     author: user1UID 
     info1 
     info2 
users 
    user1_UID 
     info1 
     info2 
     info3 
    user2_UID 
     info1 
     info2 
     info3 

SITUATION:

ユーザーが記事を作成することができます。各投稿には投稿を作成したユーザーのUIDを保持する「作成者」プロパティがあります。私は一人のユーザからのすべての投稿を表示したい場合は

は、私は私のFirebase GETリクエストで書く:


CODE:

if (childData.author == firebase().auth().currentUser.uid) { 
    //Show those posts created by the current user 
} 

QUESTION

これは効率的でしょうか?私のFirebaseデータベースに何百万もの投稿があり、現在のユーザーのIDを各投稿の「著者」プロパティと比較する必要がある場合はどうすればいいですか?

いいえ、いい選択肢がありますか?私の「ユーザー/ UID /」パスにユーザーが作成したすべての記事のUIDを含む「投稿」ノードを作成

:私はを試してみましたWHAT


このように、データベース(Millions)のすべての投稿を繰り返して比較した場合と比べてはるかに小さいjsonツリー(ユーザー(100)によって作成されたすべての投稿のみ)を繰り返し処理します。ユーザー。しかし、これは実際にパフォーマンスに影響を及ぼしますか?それに見合ったデータネストの増加ですか?


他のデータベースの階層:ここ

posts 
    post1_uid 
     author: user1UID 
     info1 
     info2 
    post2_uid 
     author: user1UID 
     info1 
     info2 
users 
    user1_UID 
     info1 
     info2 
     info3 
     posts 
     referenceUID 
      post1UID 
      post2UID  
    user2_UID 
     info1 
     info2 
     info3 

は私の例の動作を模倣するためにいくつかの偽のデータと実際のデータベースの階層です。

enter image description here


TL; DR:

がどのように適切にユーザーによって作成されたすべての記事を探してクエリを最適化するFirebaseデータベースを整理するには?

答えて

2

答えは、各ユーザーの中に投稿データをぴったり入れ子にすることです。

ここでは、投稿ノード全体からフィルタリングするときの主なパフォーマンスの問題があります。まず、あなたの現在のユーザーの投稿をフィルタリングするために、postsRef.orderByChild('author').equalTo(currentUser.uid)のようにクエリを実行しなければならないことに気付きましたが、authorでインデックスを使用していても高価な操作であるため、

2番目のアプローチの欠点は、投稿エントリを複製していることですが、nosqlデータベースで問題ありません。変更が発生するたびにすべての複製を更新する際には注意が必要です。

関連する問題