【发布时间】:2020-03-31 12:55:01
【问题描述】:
我们目前在 Firebase 上使用免费层,具有 50k 读取和 20k 写入操作的配额。
每天大约有 100 个用户,我们已经超过了读取操作的配额。 Firestore的结构如下:
Firestore-root
|
--- steps (collection)
| |
| --- 20191206 (document)
| |
| --- users (collection)
| |
| --- 08yzYycNqYMZw7kdeGBNV9jcg1G2 (document)
| |
| --- country: "FR"
| |
| --- name: "florian"
| |
| --- steps: 24
| |
| --- updated_at: "2019-12-05T20:25:05Z"
应用程序显示一个按步数排序的用户列表。
所以作为一个简单的计算,在每次应用启动时,如果x 等于存储在users 集合中的用户条目数,则应该读取x+1 文档,代表x+1 读取操作。对于 100 个用户打开应用和 100 个用户条目,它应该已经是 10100 次读取操作(〜每日配额的 20%)。
我的读取操作计算是否正确? (如果 1 次读取操作 = 1 次读取文档)。
另一方面,有没有办法优化 Firestore 结构以减少读取文档的数量?
我们目前有一个使用.limit() 操作的补丁来避免选择所有条目以释放一些读取操作,但这不是永久解决方案。
在一个文档中包含所有步骤数据似乎也是一个糟糕的解决方案,因为每个文档的大小必须小于 1MB。它可以在一段时间内成为一种解决方案,但如果用户群不断增长,它也会成为一种限制。
感谢您对此提出的建议。
编辑 2019/12/06 #1
以下是用于步骤集合的查询(此处适用于 iOS)。
- 获取特定时间范围内的排行榜(例如:每天 = 20191206,每月 = 201912)
db
.collection("steps")
.document(date.string)
.collection("users")
.whereField("steps", isGreaterThan: 0)
.order(by: "steps", descending: true)
.getDocuments { }
- 更新特定时间范围内的用户步骤
db
.collection("steps")
.document(date.string)
.collection("users")
.document(uid)
.setData([
"steps": steps,
"name": name,
"country": country,
"updated_at": Date.NowISO8601,
])
【问题讨论】:
-
我们通常根据我们想要执行的查询来构建数据库。如果您需要更好的架构,请告诉我们您要执行哪些查询。
-
嗨,谢谢@AlexMamo。问题已更新
-
如果您有 100 个用户,是时候开始考虑采用付款计划来支持这些活跃用户了。免费层用于支持开发,而不是生产。
-
看到您的疑问,我认为您应该按照 Doug 的建议继续。
标签: firebase google-cloud-firestore nosql