首页 > 解决方案 > 大型集合性能的 Firestore 查询

问题描述

我正在制作一个用户可以互相关注的应用程序。要决定如何在 firestore 中对其进行建模,我想知道集合大小如何影响查询性能。我首先想到的是这样:

relationships(coll.)
----{userId_1}(document)
--------following(coll)
------------{someId1}(document)
------------{someId2}(document)
.....
--------followers(coll)
------------{someId5}(document)
------------{someId7}(document)
.....
----{userId_2}(document)
--------following(coll)
------------{someId11}(document)
------------{someId24}(document)
.....
--------followers(coll)
------------{someId56}(document)
------------{someId72}(document)
.....

所以我会有主要的集合关系,然后每个文档将代表一个用户,他将有两个集合 - 关注和关注者,在这些集合中,我将存储带有 id、name、email 等数据的文档。然后当 user1 想要看到他的追随者,我会得到关系/userId_1/followers下的所有文件,如果他想看看他关注的人,我会得到关系/userId_1/following下的文件

我也想过这样做:

relationships(coll)
----{user5id_user4id}(document)
--------user1:"user5id" (field)
--------user2:"user4id" (field)
.........(other fields)
----{user4_user5}(document)
--------user1:"user4id" (field)
--------user2:"user5id" (field)
.........(other fields)

我将有一个主要的集合关系,其中每个文档将代表一个以下关系,文档名称将是 firstUserId_secondUSerId(意味着 firstUserId 跟随 secondUserId)并且我还将有两个字段 user1 和 user2 将存储两个用户的 ID,其中 user1 跟随 user2 所以如果我是 {myUserId},我想获取我关注的所有人我会查询关系集合 where user1 = myUserId 如果我想获取所有关注我的人,我会查询关系集合其中 user2 = myUserId 因为每个文档代表关系 user1 跟随 user2。

所以我的问题是哪种方式查询数据更有效。在第一种情况下,每个用户都会收集他的追随者/关注者,我只会得到文件,在第二种情况下,关系将有许多代表 user1->follows->user2 关系的文件。我知道我会按查询函数返回的文档数量来计费,但是如果需要搜索大型集合,它会有多快。

标签: google-cloud-firestore

解决方案


集合大小与查询的性能或成本无关。两者都完全取决于结果大小(文档数)的大小。因此,查询 100 个文档中的 10 个文档的执行和成本与查询 100,000 个文档中的 10 个文档相同。10 的大小是这里唯一重要的东西。

另请参阅:查询随结果集的大小而不是数据集的大小而缩放


推荐阅读