Firestore + Twitter Clone:使用子集合与根级集合存储推文?



出于学习目的,我的目标是使用Firestore创建一个Twitter克隆。

首先,我想我需要两个集合:userstweets。我想提供所有推文的一个主要提要,包括所有users可以轻松完成的推文:

db.collection('tweets').get()
.then(querySnapshot => {
querySnapshot.forEach(tweet => {
console.log(`${tweet.data()}`);
})
})

如果我希望能够查询特定用户的推文列表(当查看该用户的个人资料时(怎么办?

据我了解,我有三种选择,但我不确定每种方法的所有优缺点:

选项 1:创建将保存推文的用户的子集合:

db.collection('users').doc('username_123').collection('tweets').get()

选项 2:使用合适的名称创建一个根级集合,该集合将显示数据的层次结构:

var username = 'username_123';
db.collections('tweets__' + username).get()

选项 3:使用相等运算符查询:

var username = 'username_456';
db.collection('tweets').where("username", "==", username).get()

我想选择一种在规模上具有成本效益的方法。

这是一个很好的问题,我自己一直在研究。我看到两个选项,并且更喜欢选项 1。

选项 1:快速用户提要读取,成本适中

每个新帖子都写在一个名为 post_user 的顶级集合中,并被赋予postID_userID的唯一标识符。文档中的字段包括:

  • 文本(字符串(
  • 用户 ID(字符串(
  • 原始海报 ID (字符串(
  • 原始(布尔值真或假(

然后,每个帖子都会根据需要为原始海报的每个关注者重写多次,将 userID 替换为该特定关注者的 ID,并将原始帖子设置为 false。

当用户打开应用时,只需要一个 Firestore 查询:

  • 查询:查找过去 20 天内用户 ID = 当前用户 ID 的所有帖子

Firestore 查询速度与结果集成正比,而不是与整个数据集成正比,因此这是一个非常快速的查询。

该应用程序组装此数据,并以无限滚动条的形式呈现给用户。由于不需要合并数据,因此可以非常快速地完成此操作。

当用户滚动到结果末尾时,将在接下来的20天帖子中重复上述查询并加载(如Facebook的无限滚动条(。

每个新帖子的写入次数(将帖子添加到所有关注者(可能会导致客户端体验缓慢。因此,也许客户端只创建用户帖子,但是一旦创建并且用户得到确认,请运行云函数将其发布到所有关注者提要。客户端应用程序不会等待所有这些,所以它会很快,关注者会在一分钟左右看到新帖子。CRON 工作也许也可以用于此,但我不确定这是否会带来任何成本节约。

选项 2:用户源读取速度较慢,成本更低

每个新帖子在称为 posts 的顶级集合中只写入一次,并被赋予 postID 的唯一标识符。文档中的字段包括:

  • 文本(字符串(
  • 用户 ID(字符串(

当用户打开应用程序时,Firestore 查询很多,需要更长的时间(关注的人越多,时间就越长(:

  • 查询 1:查找用户关注的所有用户的用户 ID (关注用户 A、关注用户 B、关注用户 C 等(
  • 查询 2A:查找过去 20 天内关注的用户 A 的所有帖子
  • 查询 2B:查找过去 20 天内关注的用户 B 的所有帖子
  • 查询 2C:查找过去 20 天内关注的用户 C 的所有帖子
  • 等。。。。(无论用户关注多少人(

然后在客户端,合并这些结果。根据用户关注的人数,这可能需要一段时间。然后,该应用程序以无限滚动条向用户显示帖子。

当用户滚动到结果末尾时,必须在接下来的 20 天内重复上述所有查询和结果合并。

我认为最好选择用户集合中的推文子集合,如您在选项 1 中提到

的那样
  • 因为可以轻松查询每个用户的推文

  • 并且要查询所有推文,您可以使用 Firestore 集合组查询

最新更新