具有大数据集的Firebase性能

具有大数据集的Firebase性能,firebase,Firebase,我正在为一个项目测试firebase,该项目可能有相当多的密钥,可能有数百万个 我已经使用node测试了加载一些10k的记录,加载性能看起来很好。然而,如果我扩展根节点,“FORGE”Web UI会变得异常缓慢,并呈现每一条记录 Firebase不是专为这些数据量设计的,还是我做错了什么?这只是Forge UI的局限性。它还相当初级 Firebase中的实时功能不仅适用于大型数据集,而且设计用于大型数据集。事实上,实时记录流就是最好的选择 与任何大型数据应用程序一样,性能只与您的实现一样好。因此

我正在为一个项目测试firebase,该项目可能有相当多的密钥,可能有数百万个

我已经使用node测试了加载一些10k的记录,加载性能看起来很好。然而,如果我扩展根节点,“FORGE”Web UI会变得异常缓慢,并呈现每一条记录


Firebase不是专为这些数据量设计的,还是我做错了什么?

这只是Forge UI的局限性。它还相当初级

Firebase中的实时功能不仅适用于大型数据集,而且设计用于大型数据集。事实上,实时记录流就是最好的选择

与任何大型数据应用程序一样,性能只与您的实现一样好。因此,对于大型数据集,这里有一些需要牢记的问题

反规范化,反规范化,反规范化

如果一个数据集将被迭代,并且它的记录可以以千计,那么将它存储在它自己的路径中

这不利于迭代大型数据集:

/users/uid
/users/uid/profile
/users/uid/chat_messages
/users/uid/groups
/users/uid/audit_record
/user_profiles/uid
/user_chat_messages/uid
/user_groups/uid
/user_audit_records/uid
这适用于迭代大型数据集:

/users/uid
/users/uid/profile
/users/uid/chat_messages
/users/uid/groups
/users/uid/audit_record
/user_profiles/uid
/user_chat_messages/uid
/user_groups/uid
/user_audit_records/uid
避免在大数据集上使用“值”

使用添加的
子项
,因为
必须将整个记录集加载到客户端

查看隐藏的
对子对象的操作


当您调用
child\u added
时,实际上是在对每个子记录调用
value
。因此,如果这些子级包含大型列表,则必须加载所有数据才能返回。因此,上面的非规范化部分。

正如加藤在下面提到的,这是一个锻造问题,而不是Firebase问题。尝试直接导航到更深的路径以处理更大的数据集。您的意思是,如果我们只想像显示用户配置文件页面一样获得有关用户的所有信息,那么我们使用
“这不利于迭代大型数据集”
方法,否则,如果要显示用户示例列表以供管理员使用,那么我们使用
“这对于迭代大型数据集方法很有好处”
?@vzhen很好,诀窍是记住,当您调用child_added或value时(不管是哪个)您正在下载该路径下的所有数据,包括所有子项,而不仅仅是您请求的根级别元素。正如Kato提到的,添加的child_名称有点混乱,因为它还返回路径下的所有数据,而不管实际添加的时间。如果您希望,每当添加新的子项时都会出现“If you want”事件,您需要执行类似于
ref.limitToLast(1).on的操作('child_added',…
。如何在
/users/uid/chat_messages
上添加
child_与在
/user\u chat_messages/uid
上添加
不同?我想使用第一种方法,但永远不会在
/users/uid
@zeeshanal上直接有任何侦听器。我不确定你是否已经发现了。但这将是一种方法当使用
/users/uid/chat_messages
设置时,您希望获取要显示在配置文件页面上的用户信息。它将同时获取所有
chat_messages
。使用不同的数据路径,并基于id进行连接。简言之,
这不利于迭代大型数据集
-这种方法将很容易降低应用程序的速度,而在
之前,这对于迭代大型数据集是很好的
——这种方法将很难降低应用程序的速度。