Firestore:读取用户与用户关系的性能

问题描述 投票:0回答:1

假设有一个典型的信使,它允许其用户将其他用户作为联系人。并且两个联系人具有相同的偏好设置。

我不确定如何在 Firestore 中针对性能和优雅进行建模。

选项A

/ users
  - id
  - name

/friends
  - user1_id 
  - user2_id 
  - shared_preferences

要读取朋友列表,用户 1 会查询以下内容:

friends.where( Filter.or ( user1_id == ID,  user2_id == ID ) )

我关心的是性能,假设该应用程序有非常大的用户群。

选项B

另一个解决方案是将好友列表存储为子集合:

/users
  - id
  - name
  /friends 
    - friend_user_id
    - shared_preferences

要读取好友列表,user1 只需查询子集合即可:

/users/ID/friends

读取每个用户的好友列表不会成为性能问题。

但这意味着每当用户 1 修改

shared_preferences
时,用户 2 也必须更新相同的首选项。这可以通过云功能来完成。

问题

我更喜欢选项 A,因为这意味着没有冗余数据,也没有额外的云功能来更新冗余数据。

在 Firebase 中对大型数据集运行 WHERE-OR 有多大问题?

firebase google-cloud-platform google-cloud-firestore query-optimization
1个回答
0
投票

在 Firebase 中对大型数据集运行 WHERE-OR 有多大问题?

Firestore 中的查询性能取决于您请求的文档数量,而不是取决于您搜索的文档数量。因此集合中存在的文档数量是无关紧要的。因此,无论您在 100 个文档的集合中搜索 10 个文档,还是在 1 亿个文档的集合中,甚至在 10 亿个文档的集合中搜索 10 个文档,响应时间总是相同的。

关于架构:

我更喜欢选项 A,因为这意味着没有冗余数据,也没有额外的云功能来更新冗余数据。

您可以决定哪种解决方案最适合您的应用程序,但请记住,对于 Firestore 等 NoSQL 数据库,

非规范化是一种非常常见的做法。如果您是 NoSQL 数据库的新手,这可能听起来有点奇怪,但相信我,这将有助于使您的请求更加便宜。

© www.soinside.com 2019 - 2024. All rights reserved.