Firebase可伸缩性:整个数据集上的观察者与多个观察者



我正在创建一个Firebase Swift应用程序,用户可以在其中查看其他用户在提要中发布的消息。有些消息与某些用户相关。消息可以被评论,也可以被投赞成票/反对票。

哪种设计更具可扩展性:

1) 一个观察者,检查所有消息的.Value并重新填充提要。

2) 用户拥有的每条消息一个观察者,并删除和添加观察者作为提要更新。

1) 听起来可扩展性较差,但我担心2)有很多观察者,以及添加和删除观察者的延迟。

哪个设计更好?

我建议采用一种超级简单的方法。将观察员添加到包含有问题的用户的消息中

例如,这里有一个posts(messages)节点,用于存储posts。

{
  "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"
    }
  }
}

下面是观察任何包含对uid_2 引用的帖子的代码

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

一旦运行了此代码,在posts节点中发布的任何user=uid_2的post都会通知该用户。

您可以通过更改多个用户的post_x节点来对此进行扩展

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

和深度查询

postsRef.queryOrderedByChild("users_watching_this_post/uid_2").queryEqualToValue(true)
        .observeEventType(.ChildAdded, withBlock: { snapshot in
    print(snapshot)
})

最新更新