2016-05-17 6 views
1

私はFirebase Swiftアプリケーションを作成しています。ユーザーはフィード内の他のユーザーが投稿したメッセージを見ることができます。一部のメッセージは、一部のユーザーに関連しています。メッセージは、コメントを付けたり、上向き/下向きにしたりすることができます。Firebaseスケーラビリティ:オブザーバー全体のデータセットと複数のオブザーバー

よりスケーラブルな設計である:

1)すべてのメッセージ.Valueのを確認し、フィードを再作成する一つのオブザーバー。

2)1人のユーザが持っているメッセージごとに1人のオブザーバが、フィードの更新としてオブザーバを削除して追加します。

1)はスケーラビリティが低いと聞こえますが、2)多くのオブザーバーと、オブザーバーの追加と削除の遅れが心配です。

どちらが優れたデザインですか?

答えて

4

私は非常に簡単なアプローチを提案します。問題のユーザーを含むメッセージにオブザーバーを追加します。

たとえば、投稿を保管する投稿(メッセージ)ノードです。

{ 
    "posts" : { 
    "post_0" : { 
     "msg" : "some message", 
     "user" : "uid_0" 
    }, 
    "post_1" : { 
     "msg" : "another message", 
     "user" : "uid_1" 
    }, 
    "post_2" : { 
     "msg" : "yippee message", 
     "user" : "uid_2" 
    } 
    } 
} 

そしてここで、このコードが実行されると

let postsRef = myRootRef.childByAppendingPath("posts") 
     postsRef.queryOrderedByChild("user").queryEqualToValue("uid_2") 
      .observeEventType(.ChildAdded, withBlock: { snapshot in 

     print(snapshot) 

    }) 

をuid_2への参照を含むすべての投稿、ユーザーを持つポストノードに掲載されているすべての記事を観察するためのコードです= uid_2ますそのユーザーに通知します。

あなたは、複数のユーザー

"post_0" : { 
     "msg" : "some message", 
     "users_watching_this_post" 
     "uid_0": true 
     "uid_2": true 
    }, 

ためpost_xノードと深いクエリを変更することで、この上で展開することができ

postsRef.queryOrderedByChild("users_watching_this_post/uid_2").queryEqualToValue(true) 
     .observeEventType(.ChildAdded, withBlock: { snapshot in 
    print(snapshot) 
}) 
関連する問題