使用云火商店的全球和仅限朋友的排行榜排名



我需要在我的应用程序中执行两个不同的查询。

  1. 显示全球排行榜(根据积分对所有用户进行排名(
  2. 仅在当前登录用户的好友之间显示排行榜。

目前,我的数据库结构如下。

Users (collection):
user_id (document):
...
points: number
...
Friends (sub-collection):
user_id (document):
name: string
points: number

此方法适用于填充全局排行榜,因为它只是:

db.collection("Users")
.orderBy("points", Query.Direction.DESCENDING)
.limit(10)
.get()

在这种情况下,在用户的朋友之间显示排行榜也有效,但由于多次重复,更新用户的积分成为一项昂贵的操作。

有没有办法构建我的数据库,以便我可以有效地查询和更新我的用户集合?

我认为你现在正在做的事情可能是最好的方法。 对于 NoSQL 类型的数据库,数据重复是正常的,预计您将执行多次更新以在发生更改时保持所有内容同步。 这是完全正常的。

另一种方法是以某种方式将所有相关数据保存在单个集合中(不要使用子集合来存储朋友(,但最终会遇到一个不同的问题,即最终超出包含每个用户所有数据的文档的容量。

这里的底线是,像Firestore这样的NoSQL数据库为您提供了更好的可扩展性和更快的大规模查询,代价是查询灵活性较低,并且需要更多工作来保持重复的数据是最新的。 如果您希望更灵活的查询和更轻松的更新,那么 Firestore 可能不是适合您的应用程序的最佳数据库。

最新更新