如何在Firestore中创建最佳的关注者和被关注者模型?

8 浏览
0 Comments

如何在Firestore中创建最佳的关注者和被关注者模型?

我尝试创建以下的关注和粉丝模型。所以每个用户都会有一个关注和粉丝的子集合。

enter image description here

在关注子集合中,我只保存最少量的数据,比如头像路径、用户ID和全名。

enter image description here

但是这个模型的问题是,当用户在"用户"父集合中更改自己的头像或显示名称时,关注者的关注子集合中的名称和头像没有被更新。

所以我认为我需要使用可调用的云函数来解决这个问题,以更新关注子集合中的所有文档。

exports.callableUpdateUserDataInOtherDocuments = functions.https.onCall(async (data, context) => {
    try {
        const verifiedUserSnapshot = await db.doc(`users/${context.auth.uid}`).get()
        const userData = verifiedUserSnapshot.data()
        // 更新关注者的关注子集合中的显示名称
        const changeUserDataInFollowersPromises = []
        const followersSnapshot = await db.collection(`users/${context.auth.uid}/followers`).get()
        followersSnapshot.forEach( doc => {
            const followerID = doc.data().uid
            const p = db.doc(`users/${followerID}/following/${userData.uid}`).update({
                fullname: userData.fullname,
                profilePicturePath: userData.profilePicturePath
            })
            changeUserDataInFollowersPromises.push(p)
        })
        return Promise.all(changeUserDataInFollowersPromises)
    } catch(error) {
        console.log(error)
        return null
    }
})

但是使用这个云函数更新似乎对我来说不太高效,如果一个用户有10,000个粉丝,那么我需要读取10,000个文档并更新10,000个文档。而且似乎控制权在用户手中,因为如果他们在1分钟内更新数据5次,那么我需要读取50,000个文档并更新50,000个文档。

我还需要更新显示名称和头像路径,因为关注子集合中的文档将在RecyclerView(Android)和TableView(iOS)中显示。

我不知道,我对Firestore和NoSQL数据库都很新,这是常见的方法还是有更好的解决方法?

0
0 Comments

问题的出现原因是在Firestore中创建followers和following模型需要执行大量操作,并且需要平衡系统的设计,以确保Firestore和Cloud Functions能够处理和扩展性能,以避免相关问题。然而,计费可能是一个主要问题,因为这种用例需要频繁更新数据库。

解决方法之一是只在需要时获取一部分数据,而不是一次性获取所有10,000个followers的文档。可以首先加载前25个followers,当用户滚动到超过这个范围时,再加载另外的25个followers。这样每当用户导航到followers页面时,将收取25个读取费用,并且每次用户滚动时都会追加25个读取费用。

以下是一些讨论链接,可能会对您决定系统如何工作有所帮助:

- [Firestore - how to structure a feed and follow system](https://stackoverflow.com/questions/46979375)

- [What is the efficient way to model follower/following/mutual friends using Firestore?](https://www.reddit.com/r/Firebase/comments/ajx9va/what_is_the_efficient_way_to_model/)

请您参考以上链接以了解更多关于如何在Firestore中创建followers和following模型的信息。

0