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

Firestore Social Network Data Modelling for a Following System

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

一个用户可以创建几个配置文件
个人资料有兴趣
一个用户可以关注或取消关注多个个人资料,因此一个个人资料可以被很多用户关注

用户(Collection)

uid: uidUserOne
姓名:杰夫

简介(Collection)

idProfile: idProfileOne
名称:nameProfileOne
兴趣:{ 瑜伽:正确,运行:正确,攀岩:正确}
创建者:uidUserOne

这里开始我的疑惑,不确定如何为 Follow/unfollow 功能建模,我想到了三个选项:

选项A

创建一个collection,其中每个文档映射一个用户遵循一个配置文件关系

关注者(Collection)

uid: uidUserOne
idProfile: idProfileOne

选项 B

一个文档映射每个个人资料的关注者,我将关注个人资料的用户 UID 保存在一个数组中。

关注者(Collection)

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

选项 C

一个文档映射了每个用户的关注,我将用户关注的个人资料id保存在一个数组中

关注者(Collection)

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

我想知道哪些选项是最好的,A B r C 也想知道它是否可以是更好的...可能

我还有一个疑问,我该如何做下面的查询:
假设我是用户一,我已经关注了两个对瑜伽感兴趣的个人资料,所以我想列出我还没有关注的对瑜伽感兴趣的个人资料,不知道如何完成。

据我所知,你的 answer provides a solution to the following system that is related to the Realtime Database, while your question is related to Firestore. Please note that both databases are a part of Firebase 但两者是两种不同的产品,具有两种不同的机制。

并回答您的问题:

Option A. Make a collection in which each document maps a single user that follows one profile relationship

即使这个解决方案听起来有点昂贵,因为 everything in Firestore is related to the number of reads,对于具有合理数量 users/followers 的应用程序来说可能是一个可以考虑的解决方案。几年前我回答过类似的问题,所以请在下面查看我的回答:

  • Firestore - how to structure a feed and follow system

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

Option B. One document maps the followers of each profile, I save the user's UIDs that follow the profile in an array.

这也是一个可以继续的解决方案。但也要记住,文档是有限制的,所以恐怕 100 万个 UID 放不下一个文档。但是,您可以在每次达到限制时创建一个 new 文档。我创建了一个库,可以帮助您根据 1 MiB 的最大大小检查文档大小:

Option C. One document maps the follows of each user, I save the profiles ids that are followed by the user in an array

此选项与选项B相同

Let's say I am user One and I already follow two profiles with yoga interest so I want to list, profiles with yoga interest which I do not follow yet, not sure how to accomplish this.

在这种情况下,“集合”解决方案是继续进行的解决方案,因为您可以向跟随用户的每个 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());
        }
    }
});