从我的last question开始,让我决定写一大堆数据 用于测试目的的firebase数据库。
这是结果
我需要编写这么多数据的原因是因为我之前构建了一些使用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的重点是它是无后顾的,我想在客户端旁边写一下。
所以我的问题是有没有有效的方法来实现如何不通过这种大规模的写操作中断其他读取操作?或者有更好的数据建模方法吗?
我真的需要帮助。即使只是一个评论,我真的感到满意。
答案 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。在这种情况下,当应用程序收到订阅源的快照时,只需将其与用户感兴趣的订阅源数组进行比较,如果不匹配其中一个,则忽略它,否则,通知用户。