Firestore + Twitter克隆:使用子集合还是根级别集合存储推文?

时间:2018-08-20 21:34:12

标签: firebase google-cloud-firestore

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

首先,我认为我需要两个集合:userstweets。我想通过所有users提供所有推文的一个主要供稿,这很容易做到:

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

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

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

选项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()

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

2 个答案:

答案 0 :(得分:0)

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

选项1:用于快速读取用户供稿,价格适中

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

  • 文本(字符串)
  • 用户ID(字符串)
  • originalPosterID(字符串)
  • 原始(布尔值是或否)

然后,根据原始发布者的每个关注者将每个帖子重写多次,将userID替换为该特定关注者的ID,并将original设置为false。

用户打开应用程序时,仅需要一个Firestore查询:

  • 查询:查找最近20天内userID = currentUserID的所有帖子

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

该应用会组合这些数据,并通过无限滚动条将其呈现给用户。由于不需要合并数据,因此可以很快完成。

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

每个新帖子(将这些帖子添加到所有关注者)的写入次数可能会导致客户端体验缓慢。因此,也许客户仅创建用户帖子,但是一旦创建并获得用户确认,便运行 Cloud Function 将该帖子发布到所有关注者提要。客户端应用程序不会等待所有这些操作,因此它会很快,并且追随者会在一分钟左右的时间内看到新帖子。 CRON工作也许也可以用于此目的,但是我不确定这是否可以节省成本。

选项2:读取用户供稿的速度较慢,费用较低

每个新帖子仅在称为posts的顶级集合中写入一次,并且具有postID的唯一标识符。文档中的字段为:

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

当用户打开应用程序时,Firestore查询数量众多,花费的时间更长(并且关注的人越多,时间就越长):

  • 查询1:查找用户关注的所有人的用户ID (followedUserA,followedUserB,followedUserC等)
  • 查询2A:查找过去20天内by followedUserA的所有帖子
  • 查询2B:查找过去20天内by followedUserB的所有帖子
  • 查询2C:查找过去20天内由followedUserC发出的所有帖子
  • 等等...(对于用户关注的人数众多)

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

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

答案 1 :(得分:0)

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