将大量记录写入firebase数据库时遇到很多问题

时间:2017-05-28 03:31:21

标签: firebase firebase-realtime-database

从我的last question开始,让我决定写一大堆数据 用于测试目的的firebase数据库。

这是结果

  • 1000记录:没有什么重要的事情可以正常工作。
  • 10000记录:仅在写入操作完成后,来自firebase的所有其他读取操作的响应。
  • 100000记录:与10000记录的结果相同但耗时更长,除非强行关闭应用程序并重新打开,否则我无法执行任何firebase操作。屏幕开始挂起一段时间可能因为我在主线程(ios)中执行循环。
  • 100万条记录:恐怕永远不要尝试。

我需要编写这么多数据的原因是因为我之前构建了一些使用SQL的社交应用程序(android,ios,web),但我认为是时候切换到firebase了。通过研究this我知道如何在不使用IN子句的情况下构建用户提要。数据结构如下所示

users
  user1
    name: bob
  user2
    name: alice
    follows: 
      user1: true

posts
  post1
     author: user1
     text: 'Hi there'

feeds
  user2
    post1: true

作为示例如果其中一个用户拥有6100万关注者,则需要将记录插入到6100万feeds/$uid/。写操作几乎不能用100k存活。在这个link上,它建议不要在客户端进行,但是firebase的重点是它是无后顾的,我想在客户端旁边写一下。

所以我的问题是有没有有效的方法来实现如何不通过这种大规模的写操作中断其他读取操作?或者有更好的数据建模方法吗?

我真的需要帮助。即使只是一个评论,我真的感到满意。

1 个答案:

答案 0 :(得分:1)

让我们从一个示例Firebase结构开始,使用观察者和事件来捕获来自特定用户的提要。

我们有一个用户节点,用于存储有关所有用户的数据,在这种情况下只是他们的名字。我们还有一个存储Feed的feed节点。在这种情况下,我们也可以将其称为消息,因为我们只是存储用户创建的消息。

users
  uid_0
    name: "Scott"
  uid_1
    name: "Frank"
  uid_2
    name: "Leroy"

feeds
  feed_0
    uid: uid_1
    msg: "some message from uid_1"
  feed_1
    uid: uid_2
    msg: "a message from uid_2"

假设Scott(uid_0)想要订阅'来自Frank和Leroy的任何馈送。

func addSomeFeeds() {
    self.addFeed(uidFeed: "uid_1")
    self.addFeed(uidFeed: "uid_2")
}

func addFeed(uidFeed: String) {
    let feedsRef = self.ref.child("feeds")
    let feedQuery = feedsRef.queryOrdered(byChild: "uid").queryEqual(toValue: uidFeed)
    feedQuery.observe(.childAdded, with: { snapshot in

        let feedDict = snapshot.value as! [String: Any]
        let msg = feedDict["msg"] as! String
        print(msg)
    }) 
}

和输出

some message from uid_1
a message from uid_2

然后如果uid_2添加了另一个Feed(带有消息)

Feed From uid_2

以上代码在Scott的设备上运行,并将一个观察者附加到Feeds节点,该节点可以观看'对于Frank或Leroy提供的任何添加的Feed。

这可以扩展并通过.childChanged观察更改,因此如果Feed有多个帖子'在任何时候在特定Feed中更新帖子时,Scott的应用程序都会收到该Feed中的更改通知。

另一种选择是向Feed节点添加更通用的观察者,同时通知应用添加,更改或删除任何 Feed。在这种情况下,当应用程序收到订阅源的快照时,只需将其与用户感兴趣的订阅源数组进行比较,如果不匹配其中一个,则忽略它,否则,通知用户。