【问题标题】:Does observing 100 firebase paths in parallel can be non efficient?并行观察 100 个 firebase 路径是否效率不高?
【发布时间】:2015-05-16 08:07:32
【问题描述】:

我有这个数据结构:

{
 userId: {
         userId:

                {

                 messageId:

                 (...)

                }

          (...)

        }

(...)

}

对于给定的顶级userId,我想观察其所有userId 子级。 可以观察到 100 个子路径。

并行观察 100 个 firebase 路径会不会效率不高?

编辑:

具有适当索引的新数据结构:

/messages indexed on chatIds

{
chatId: (chatId of the chat it belongs to)
fromUserId:
...
}

/chat indexed on userIds

{
userId1: (users of the chat whose id are ordered alphabetically)

userId2:

...
}

工作流程:

app获取当前userId->获取userId上的聊天索引列表->获取chatId上索引的聊天对应的消息

【问题讨论】:

  • 什么意义上的低效?带宽使用?检索数据所需的时间?代码量?代码复杂度?你打算如何倾听所有路径?另外:您想到的替代方案是什么。我们更容易回答“哪种方法更有效:A 还是 B?”而不是“这可能效率低下吗?”。
  • 我在询问代码复杂性。在 iOS 上,当应用程序变为活动状态时,我会监听当前用户(顶级用户 ID)的所有发件人的用户 ID(第二级用户 ID)。它允许应用程序观察发送给用户的每条消息。由于路径更精确,这种数据结构可以更快地获取数据。听很多路径会减慢 iOS 设备的速度吗?
  • 我已经用可能的解决方案编辑了我的问题。但是,如果在子键上建立索引,在可能数十亿行中检索数百行是否有效?
  • 从索引查询比遍历所有项目更高效。但没有什么比直接访问更好的了,即ref.child('messages-for-user').child(auth.uid)
  • 感谢您的回答。观察设备上的大量路径怎么样:会消耗大量 CPU 或内存吗?

标签: ios firebase


【解决方案1】:

在提供的示例中,userId: 节点内有一个 userId: 节点。这需要重新设计。

虽然监控 100 个节点是可行的,但听起来可能有一种方法可以扁平化您的数据以减少这种情况。

通过提供的示例代码,您似乎对更改每个用户的消息节点感兴趣。也许您正在编写一个涉及用户之间消息传递的应用程序?

一种选择是拆分消息节点,这样就会有一个用户节点和一个消息节点:

Users:
  uid_0:
    user 0 data
  uid_1:
    user 1 data
  uid_2:
    user 2 data

Messages:
  msg_0:
     "posted_by_uid": "uid_0"
     "msg": "some message that uid_0 posted"
  msg_1:
     "posted_by_uid": "uid_1"
     "msg": "some message that uid_1 posted"

然后观察消息节点的变化可以让您获得所需的数据 - 发布消息的用户的 uid 和消息本身。有 100 种不同的方式来构建数据,但其想法是监控包含您感兴趣的数据的节点。

消息会经常更改,但在其 uid 中存储他们最喜欢的食物的用户节点是相当静态的,因此虽然您也可以密切关注用户节点的变化,但您现在只观察 2 个节点而不是 100 或 1000 个节点。

【讨论】:

  • 感谢您对非规范化数据结构的回答。它导致对我的问题进行了新的编辑,并通过聊天对象提供了可能的答案,该对象可以链接用户和消息。
猜你喜欢
  • 2011-03-25
  • 2016-01-22
  • 2022-11-17
  • 2021-08-04
  • 2016-09-13
  • 1970-01-01
  • 2015-07-16
  • 2017-01-26
  • 2022-06-15
相关资源
最近更新 更多