【问题标题】:Firestore social media posts tableFirestore 社交媒体帖子表
【发布时间】:2019-06-10 13:21:48
【问题描述】:

所以我想创建一种社交媒体应用程序并使用 firestore 作为主数据库。

目标是创建“facebook”新闻提要。

每个用户都有一个朋友列表,每个用户都可以创建帖子。

每个帖子都可以修改为对应用程序的所有用户或用户朋友可见。因此,每个用户都可以向他的所有朋友发布帖子,也可以向应用程序中的每个人发布帖子。

此外,用户可以在新闻源中“保存”他们喜欢的帖子。(LikedPosts 子集合)

USERS (collection)
    DocumentID - userId gathered from Authentication uid
        firstName: String
        lastName:  String
        username:  String
        birthdate: Timestamp
        accountCreationDate: Timestamp
        FRIENDS (subcollection)
            DocumentID - userId of the friend
                username:  String
        LikedPosts (subcollection)
            authorUserId:   String
            authorUsername: String
            text:  String   
            imagePath: String

POSTS (collection)
    DocumentID - postId randomly generated
        authorUserId:   String
        authorUsername: String
        text:  String   
        imagePath: String
        likesCount: Number
        forFriendsOnly:yes
        LIKES (subcollection)
            DocumentID - userID of the liker
                username:  String

现在在用户的新闻源中 - 我如何查询所有可见帖子 (forFriendsOnly:no) 以及仅限朋友的所有帖子,当前用户在作者朋友子集合中。

另外,如果用户更改了他的名字,我怎样才能为他以前的所有帖子以及与该用户相关的所有保存帖子相应地更改他的名字?(位于用户喜欢的帖子子集合中)

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    我猜你问了两个问题。

    首先,Firestore 建议使用数据复制而不是跨集合加入查询。您设计帖子和用户的方式必须依赖于 SQL 中的查询概念。

    如果您不介意将所有作者的朋友 id 作为数组包含在该帖子文档中,那么仍然可以实现这一点。同时,作者添加/删除好友时,需要通过触发函数同步作者的好友数组。

    我不太推荐这个解决方案,因为作为一个社交平台,用户的朋友可能会不断变化,那么你必须不断更新他所有帖子的朋友数组。

    还有另一种解决方案,即在用户下添加一个子集合作为可见的“提要”。然后,每当作者创建帖子时,触发功能都会将此帖子的摘要写入他所有朋友的可见“提要”集合。

    但是,如果您关心准确性,实时性,成本等,上述两种解决方案都不是完美的。我想这是我们必须忍受的缺点。如果你要实现和SQL一样的东西,我想唯一的选择就是查询部分使用其他解决方案,比如elasticsearch、mysql、neo4j等。PS:你仍然可以用云函数包装它。

    关于您的第二个问题,如果您认为您的用户会经常更改其名称,那么一种方法是不要重复用户名。并且始终通过用户集合中的用户 ID 查询用户名。另一种方法是在用户更改名称时使用触发功能更新重复的用户名。我会推荐第二种方式,因为用户不会经常更改他们的名字。

    【讨论】:

      【解决方案2】:

      不一定与您的原始问题相关,但您的 LikedPosts 子集合可能需要重组。如果您可以确保 postId 的唯一性,那么它可能应该是这样的:

      LikedPosts (subcollection)
        postId: Unique identifier for liked post
          authorUserId: String
          authorUsername: String
          text: String
          imagePath: String
      

      当前的结构只允许一个点赞帖子,因此您需要将其更改为每个点赞帖子一个文档,或者一个包含所有点赞帖子 ID 列表的文档。

      【讨论】:

        猜你喜欢
        • 2013-12-18
        • 2018-01-09
        • 2021-08-04
        • 2015-09-15
        • 2020-01-22
        • 1970-01-01
        • 2017-07-02
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多