Jor*_*nge 3 firebase google-cloud-firestore
我正在寻找使用 Firebase 创建社交媒体提要。我的数据结构如下:
users: {
uid: {
... // details
}
}
friends: {
uid: {
friends: { // sub collection
fuid: {
... // details
}
}
}
}`
posts: {
postId: {
postedBy: uid
... // details
}
}
Run Code Online (Sandbox Code Playgroud)
现在我试图从用户的所有朋友那里获取帖子,将其限制为最近的 10 个帖子,然后创建一个滚动指令来查询下一组 10 个帖子,以便用户不必查询和加载在页面加载时为朋友发布 ^N ^N。但我不太确定如何以这样的有效方式查询 firebase,为用户的朋友,然后是他们的帖子。
我有滚动指令工作,取自AngularFirebase.com 上 Jeff Delaney 的无限滚动课程。但它只处理整个帖子(教程中的船)集合,而没有在该集合内有选择地查询(以检查用户是否是朋友)。
我能想到的唯一解决方案是查询用户的所有朋友帖子,将其存储在一个数组中,然后根据加载的最后一批帖子将结果块加载到 DOM 中。如果用户有 100 个朋友,每个朋友有 100 个帖子,那么从长远来看,这似乎是非常低效的。
我最终通过利用 Firebase Functions 解决了这个问题。我有两个集合,一个称为Posts,另一个称为Feeds. 当用户添加帖子时,它会被添加到Posts集合中。发生这种情况时,它会触发 Firebase 函数,然后该函数会获取发布用户的 UID。
一旦获得 UID,它就会查询另一个名为的集合Friends/UID/Friends并获取其朋友的所有 UID。
一旦获得 UID,它就会创建批量添加(如果用户有超过 500 个朋友),然后将帖子添加到他们朋友的Feeds/UID/Posts收藏中。
我选择这条路线的原因有很多。
通过使用上述解决方案,我现在能够Feeds/UID/Posts/以每次返回接下来 10 个结果的方式查询集合,而不会出现性能或数据问题。我无法完全解决的唯一限制是,将帖子添加到用户的个人提要需要几秒钟的时间,因为该功能需要时间来启动。但可以通过增加该特定函数的内存分配来缓解这种情况。
我还对编辑和/或删除的帖子执行上面列出的操作。
如果我猜对了,您是在为用户好友列表中的每个用户复制帖子,对吗?如果您的应用程序升级,我认为这不是一个好主意……此时,100k 文档写入的成本为 0.18 美元,因此:
假设您的应用程序用户有 1000 个朋友。当他发布任何内容时,您正在对数据库进行 1000 次写入。假设您有 1000 个像他这样的活跃用户。您现在刚刚进行了 1.000.000 次写入并支付了 1.80 美元。
现在更糟糕的是:您可能在每篇文章中都有一个重复的用户displayName字段和一个profileImageUrl。想象一下,这个用户在他的历史中有 500 个帖子,并且刚刚更改了他的个人资料图片。您将必须为他 1000 个朋友的每个提要中的每个帖子更新一个字段,对吗?您将进行 1000 * 500 = 500.000 次写入只是为了更新 profileImageUrl!如果用户不喜欢这张照片?他尝试了 3 张新照片,现在在 10 分钟内您已经在数据库中写入了 2.000.000 次。这意味着您需要支付 3.60 美元。这可能看起来并不过分,但请注意,我们正在谈论一个瞬间的单个用户。1000 名用户在同一天内更改个人资料图片 4 次,您需要支付 3,600.00 美元。看看这篇文章:https://proandroiddev.com/working-with-firestore-building-a-simple-database-model-79a5ce2692cb#7709
| 归档时间: |
|
| 查看次数: |
2147 次 |
| 最近记录: |