假设有一个典型的信使,它允许其用户将其他用户作为联系人。并且两个联系人具有相同的偏好设置。
我不确定如何在 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 中对大型数据集运行 WHERE-OR 有多大问题?
Firestore 中的查询性能取决于您请求的文档数量,而不是取决于您搜索的文档数量。因此集合中存在的文档数量是无关紧要的。因此,无论您在 100 个文档的集合中搜索 10 个文档,还是在 1 亿个文档的集合中,甚至在 10 亿个文档的集合中搜索 10 个文档,响应时间总是相同的。
关于架构:
我更喜欢选项 A,因为这意味着没有冗余数据,也没有额外的云功能来更新冗余数据。您可以决定哪种解决方案最适合您的应用程序,但请记住,对于 Firestore 等 NoSQL 数据库,
非规范化是一种非常常见的做法。如果您是 NoSQL 数据库的新手,这可能听起来有点奇怪,但相信我,这将有助于使您的请求更加便宜。