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

以下系统的Firestore社交网络数据建模

饶谦
2023-03-14

我正在设计一个社交应用程序,使用java android,FireStore作为后端。一开始,FiRest建模可能是一个很大的变化,正如我所读到的,我试图保持文档小,不要制作太多的子集合,让我们假设以下场景:

一个用户可以创建几个配置文件
一个配置文件有兴趣
一个用户可以跟随或取消跟随许多配置文件,所以一个配置文件可以被很多用户跟随

uid:uidUserOne
姓名:杰夫

兴趣:{瑜伽: true,跑步: true,攀登: true}
createdBy: uidUserOne

在这里开始我的疑虑不知道如何模型的跟随/取消跟随功能,我有三个选项在心中:

uid:uidUserOne
idProfile:idProfileOne

一个文档映射每个配置文件的跟随者,我将跟随该配置文件的用户UID保存在一个数组中。

idProfile:idProfileOne
关注者:{uidUserOne:true,uidUserTwo:true,…}

一个文档映射每个用户的以下内容,我将用户遵循的配置文件ID保存在数组中

uid:uidUserOne
如下:{idProfileOne:true,idProfileTwo:true,…}

我想知道哪一个选项是最好的,A B r C如果它可以是一个更好的。。。可能

我还有一个疑问,我该如何做以下查询:
假设我是用户一,我已经关注了两个瑜伽兴趣的个人资料,所以我想列出,我还没有关注的瑜伽兴趣的个人资料,不确定如何实现这一点。

共有1个答案

章阳波
2023-03-14

据我所知,您的回答为以下与实时数据库相关的系统提供了解决方案,而您的问题与Firestore相关。请注意,这两个数据库都是Firebase的一部分,但都是两种不同的产品,具有两种不同的机制。

回答你的问题:

选项A.创建一个集合,其中每个文档映射遵循一个配置文件关系的单个用户

即使这个解决方案听起来有点昂贵,因为Firestore中的所有内容都与读取次数有关,但对于拥有合理数量用户/关注者的应用程序来说,这可能是一个需要考虑的解决方案。几年前我回答了一个类似的问题,请检查我的回答:

  • Firestore-如何构建反馈和跟踪系统

然而,想象一下,阅读一个拥有100万粉丝的用户的成本是多少?

选项B.一个文档映射每个配置文件的追随者,我将用户的UID保存在一个数组中。

这也是一个解决方案。但是也要记住文档有限制,所以恐怕1百万个UID不适合一个文档。但是,每次达到限制时,您都可以创建一个新文档。我已经创建了一个库,可以帮助您根据1 MiB最大大小检查文档大小:

  • https://github.com/alexmamo/FirestoreDocument-Android/tree/master/firestore-document

选项C.一个文档映射每个用户的以下内容,我将用户跟随的配置文件ID保存在一个数组中

该选项与选项B相同。

假设我是用户一,我已经关注了两个瑜伽兴趣的档案,所以我想列出,我还没有关注的瑜伽兴趣的档案,不知道如何实现这一点。

在本例中,“收集”解决方案是一个可以继续进行的解决方案,因为您可以向跟随用户的每个UID文档添加一个兴趣数组。

编辑:

让我们假设你有兴趣关注那些对瑜伽感兴趣但你不关注的用户。这里有一个模式可以帮助你实现这一点:

Firestore-root
  |
  --- users (collection)
  |    |
  |    --- $uid (document)
  |         |
  |         --- interests: ["yoga", "running", "climbing"]
  |
  --- followers
       |
       --- $uid (document)
            |
            --- userFollowers (sub-collection)
                  |
                  --- $followerUid (document)
                        |
                        --- //Data

要获得所需的结果,需要两个查询。一个是为了吸引对瑜伽感兴趣的用户,另一个是为了只吸引你不喜欢的用户。实际上,您需要检查userFollowers子集合中不存在哪个用户。要检查用户是否不存在,请使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference followerUidRef = rootRef
    .collection("followers").document(uid)
    .collection("userFollowers").document(followerUid);
followerUidRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (!document.exists()) {
                //Follow the user
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});
 类似资料:
  • Firestore则不同,它需要冗余数据来有效地访问数据,但假设我跟踪了1000个人,如果我需要通过查询我跟踪的每15个用户的数据并使用方法来获得所有这些用户的帖子,那么查询之间可能会有未读的帖子,因为我们使用获得帖子,如何在Firestore中为社交媒体应用程序构造数据

  • 社交网络的一大特征就是用户间的相互关注,从而形成朋友圈或媒体圈,实现便捷的信息分享和传播。GitHub支持项目级别及用户级别的关注。 关注一个项目很简单,只需点击项目名称右侧的“Watch”按钮。 图2-27:项目的关注按钮 添加对项目的关注后,点击页面左上角的“github”文字图标进入仪表板(Dashboard)页面,如图2-28所示。 图2-28:关注项目在仪表板页的显示 仪表板页面的左侧显

  • 在本章中,让我们研究一下Drupal中的Social Networking 。 社交媒体现在变得非常重要,Drupal为此目的有许多社交媒体模块。 我们以ShareThis模块为例,您可以选择其他任何选择。 以下是用于安装ShareThis模块的简单步骤。 Step 1 - 单击ShareThis以访问ShareThis模块页面,然后单击Version ,如以下屏幕所示。 Step 2 - 复制模

  • 本系统采用主流编程语言php和mysql数据库,您可以通过自定义采集规则,或者到我的网站下载共享的规则,针对网站或者网站群,采集您所需的数据,您也可以向所有人共享您的采集规则哦。通过数据浏览和编辑器,编辑您所采集的数据。 本系统所有代码完全开源,并附有中文注释。

  • 我的状态帖子有以下数据库设置。对于每一篇文章,用户可以喜欢这篇文章,评论这篇文章,甚至可以由作者在原始文章中添加标签。 我试图设置我的足智多谋的控制器后带回所有的数据通过JSON对象,但我不能正确地找到评论,喜欢或标记用户名。如果有区别的话,我会用哨兵2进行认证。 以下是数据库设置: 我的Post控制器,我只是有一个简单的页面,可以显示所有内容。我不想循环查看文件中的任何内容,我只想返回json完

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