我们正在使用Firebase实时数据库来保存与Facebook连接的用户的每一级分数。我们仍在测试这个功能,一切正常,但下载使用率真的真的很高。每次用户打开应用程序,我下载的数据量很小,大约20字节。和additional5字节的每一级,他开始.几分钟后,下载使用量开始显示超过100kB,这是一个很大的,不会规模的财政,当我们realease这对我们的用户.下面是我们使用的数据结构:
users{
facebook_id{
"firebase_id" : firebaseId,
"max_level" : maxLevel,
"stars" : numberOfStars,
"scores" : {
level : score,
}
}
}
我还做了一些CLI数据库分析,没有索引查询,用法似乎是正确的。
这是屏幕截图。
有人知道可能出了什么问题吗?如果这只是SSL开销(看起来仍然太大),除了设置我们自己的服务器,我们没有别的办法。
3条答案
按热度按时间mf98qq941#
方法1:将冗长的数据存储在单独的位置
糟糕的方式
更好的方式-分为用户详细信息和用户分数详细信息
用户详细信息
用户分数详细信息
users_scores/facebook_id/scores/<levelname>
是否存在?如果存在,则获取分数users
路径读取stars
(不经过users_scores
)来计算client部分中的星总数。只需从client本身更新路径users_scores/facebook_id/scores/<levelname>
要点
gzszwxb42#
在非关系数据库中,将数据集中在一个地方始终是个坏主意。而且它本身也会产生致命的影响,从最大化文档大小到高带宽,这可能会导致高成本和低性能,您需要划分为更扁平的结构,这样做可能会节省读取,但这种节省在生产中不会带来回报,换句话说,你没有给用户提供全部信息(加载)一次,相反,你给予他什么,他需要开始,并根据他的需要,后来他从数据库中得到...这是一种被动的方法...而不是太积极,给他每一个整个九码一次,这样想吧,你一开口就会得到你想要的......
up9lanfz3#
您从JSON文件中检索到的数据可能比您预期的要多得多。Google已经为如何最好地构建数据制定了一些指导方针,以便您只影响尽可能少的信息。
避免使用过多的索引。过多的索引会增加写入延迟,并增加索引项的存储成本。
请注意,具有单调递增值的索引字段(如时间戳)可能会导致热点,从而影响具有高读写速率的应用程序的延迟。
https://firebase.google.com/docs/firestore/best-practices#indexes
索引下面的这一部分也可能有所帮助:
避免每秒多次写入文档。有关详细信息,请参阅更新单个文档。
对写入和删除操作使用批处理操作,而不是单个操作。批处理操作效率更高,因为它们执行多个操作,而开销与单个操作相同。
如果可用,请使用异步调用,而不要使用同步调用。异步调用可最大限度地降低延迟影响。例如,假设某个应用程序在呈现响应之前需要文档查找结果和查询结果。如果查找和查询没有数据相关性,则在启动查询之前无需同步等待查找完成。
不要使用偏移量,而应使用游标。使用偏移量只能避免将跳过的文档返回到应用程序,但仍会在内部检索这些文档。跳过的文档会影响查询的等待时间,并且应用程序会为检索这些文档所需的读取操作付费。
https://firebase.google.com/docs/firestore/best-practices#read_and_write_operations
希望这对你有帮助!