当前位置: 首页 > 知识库问答 >
问题:

哪一个Firestore模式更适合获取社交媒体提要?

终洛华
2023-03-14

据我所知,这些方法需要大致相同的读写次数。

一个想法是在users/{userId}中有一个名为posts的字段,这是我想为用户提取的文档数组。这将允许我直接从posts中提取数据,并获得数据的最新版本。

另一种方法似乎更Firebasey,它将文档存储在users/{userId}/feeds中,这些feeds是帖子本身的副本。我可以使用与postid中的数据相同的posts。假设,如果我需要为任何审查更新数据,我可以使用组集合查询来获取所有称为提要的集合,其中docID是相等的(或者只创建一个字段来执行正确的“where”、“==”、docID)。

三位挑战者:

>

  • users/{userId},字段名为feed-指向全局帖子的文档ID数组。获取提要,按ID获取所有文档。每次用户有活动时,每个跟随者都需要更新每个数组。

    users (coll)
        -> uid (doc)
        -> uid.feed: postId1, postId2, postId3, ...] (field)
    
    posts (coll)
        -> postId (doc)
    

    查询(伪):

    doc(users/{uid}).get(doc)
        feed = doc.feed
        for postId in feed:
            doc(posts/{postId}).get(doc)
    
    users (coll)
        -> uid (doc)
             -> feed: (coll)
                   -> postId1 (doc)
                   -> postId2
                   -> postId3
    
    posts (coll)
        -> postId (doc)
    
    collection(users/{uid}/feed).get(docs)
        for post in docs:
            doc(posts/{post}).get(doc)
    
    users (coll)
        -> uid (doc)
    
    
    posts (coll)
        -> postId (doc)
        -> postId.followers_array[followerId, followerId2, ...] (field)
    
    collection(posts).where(followers, 'array_contains', uid).get(docs)
    

    1.更新每个活动的作者用户数据,查找跟随该用户的所有用户。目前,用户作为文档存储在集合中,因此这是followerNumber文档读取。对于每个用户,通过预先执行postid来更新他们的数组,这将是followerNumber文档写入。

    1.为提要的每次提取显示数据/提要:从用户文档中获取数组(读取1个文档)。对于每个postId,call,帖子/{postId}

    这将是numberOfPostsCalled文档读数。

    2.更新每个活动的作者用户的数据,查找跟随该用户的所有用户。目前,用户作为文档存储在集合中,因此这是followerNumber文档读取。对于每个用户,将ID为postid的新文档添加users/{userId}/feed中,这将是followerNumber document Writes。

    2.为每次提要的提取显示数据/提要:从users/{userId}/feed获取一定数量的帖子

    这将是numberOfPostsCalled文档读数。

  • 共有1个答案

    纪成礼
    2023-03-14

    很好,当我谈到什么是最优的,我真的需要一个点或质量属性来比较,我会假设你关心速度(不是必要的性能)和成本。

    这就是我如何解决这个问题,它涉及几个集合,但我的目标是只有1个查询。

    用户(col)

    {
     "abc": {},
     "qwe": {}
    }
    
    {
      "123": {},
      "456": {}
    }
    
    {
      "abc": {
        "posts_ids": ["123"]
      }
    }
    
    {
      "abc": {
        posts: [
        {
           id: "123", /.../
        }, {
           id: "456", /.../
         }
        ]
      }
    }
    

    云函数如下所示:

    /* on your front end you can manage the add or delete ids from user posts */
    export const calculateDashboard = functions.firestore.document(`users_posts/{doc}).onWrite(async(change, _context) {
       const firestore = admin.firestore()
       const dashboardRef = firestore.collection(`users_dashboard`)
       const postRef = firestore.collection(`posts`)
    
       const user = change.after.data()
       const payload = []
       for (const postId of user.posts_ids) {
          const data = await postRef.doc(postId).get().then((doc) => doc.exists ? doc.data() : null)
          payload.push(data)
       }
       // Maybe you want to exponse only certain props... you can do that here
       return dashboardRef.doc(user.id).set(payload) 
    })
    

    doc的最大大小为1 MiB(1,048,576字节),这是可以存储的大量数据,因此这里可以有很多帖子。让我们谈谈成本;我以前认为firestore更像是有几个小文档,但我发现在实践中,它同样适用于大尺寸的文档。

    现在,在仪表板上只需查询:

    const dashboard = firestore.collection(`users_dashboard`).doc(userID).get()
    
     类似资料:
    • 我有一个集合,我的应用程序在其中存储用户的所有帖子,数据结构如下: 现在,我想向我的用户显示这个集合的所有帖子;但是,只有当用户跟随创建帖子的人时,即帖子文档的字段适合。 我知道如果用户只关注一个人,查询集合是很简单的,也就是说,我有一个简单的子句。但是:如果我的用户关注10,000人或更多人呢?我怎么查询呢? 另外,我应该如何存储,即用户跟随的人?使用简单的数组似乎不适合我,但是使用所有其他选项

    • 因此,我想创建一种社交媒体应用程序,并使用fiRest作为主数据库。 目标是创建“facebook”新闻源。 每个用户都有一个朋友列表,每个用户都可以创建帖子。 每个帖子都可以被修改为对应用程序的所有用户或用户朋友可见。所以每个用户都可以向他所有的朋友发布帖子,并向应用程序中的每个人发布帖子。 此外,用户还可以在新闻提要中“保存”他们喜欢的帖子。(类似帖子子集合) 现在在用户的新闻提要中-我如何查

    • 当用户导航到Likes或Comments屏幕时,他/她将分别看到用户指定帖子的Likes或Comments列表。 用这种结构能正确处理这两种情况吗?或者将评论和喜欢集合放在/posts/{userId}/userposts/{postId}/(也可以作为子集合)中会更好 Firestore可以同时执行“多个集合查询”吗?以便在我的“交互”屏幕中,我可以从按日期排序的不同集合中获取所需的数据 我很感

    • 我正在尝试为一个简单的社交媒体概念创建一个简单的云Firestore数据库结构。 每个用户最多可以有一个可以随时更新的帖子(一个“最喜欢的”帖子除外)。用户“最喜欢的”版本的帖子被保存为一个单独的帖子,当用户在其当前版本的帖子上收到比最喜欢的版本更多的赞时,该帖子可以被更新。 friends子集合存储好友用户名,因此很容易按用户名创建该用户的好友列表。我假设我可以通过将朋友的documentID与

    • 我们正在使用Firebase构建一个社交媒体网络应用程序,并使用firest来存储用户和他们的帖子。 当用户喜欢某个帖子时,我们会将其保存在中,并在帖子文档中更新。 假设我们的应用每天有100万用户,他们都非常喜欢病毒性帖子。 现在,firebase表示一个文档每秒不能处理超过一次写入。然而,我们已经看到,我们可以每秒更新文档几次,但他们仍然不建议这样做。 我的问题是,在firestore中存储所

    • 我有一个数据结构,由一个名为“民意测验”的集合组成“民意测验”有几个随机生成身份证的文档。在这些文档中,还有一个名为“答案”的额外集合用户对这些民意测验进行投票,投票都写入“答案”子集合。我在“答案”节点上使用. runTransaction()方法,目的是这个子集合(对于任何给定的投票)不断被用户更新和写入。 我一直在阅读关于火力恢复的社交媒体结构。然而,我最近遇到了火力恢复的一个新功能,“ar