我正在设计一个社交应用程序,使用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如果它可以是一个更好的。。。可能
我还有一个疑问,我该如何做以下查询:
假设我是用户一,我已经关注了两个瑜伽兴趣的个人资料,所以我想列出,我还没有关注的瑜伽兴趣的个人资料,不确定如何实现这一点。
据我所知,您的回答为以下与实时数据库相关的系统提供了解决方案,而您的问题与Firestore相关。请注意,这两个数据库都是Firebase的一部分,但都是两种不同的产品,具有两种不同的机制。
回答你的问题:
选项A.创建一个集合,其中每个文档映射遵循一个配置文件关系的单个用户
即使这个解决方案听起来有点昂贵,因为Firestore中的所有内容都与读取次数有关,但对于拥有合理数量用户/关注者的应用程序来说,这可能是一个需要考虑的解决方案。几年前我回答了一个类似的问题,请检查我的回答:
然而,想象一下,阅读一个拥有100万粉丝的用户的成本是多少?
选项B.一个文档映射每个配置文件的追随者,我将用户的UID保存在一个数组中。
这也是一个解决方案。但是也要记住文档有限制,所以恐怕1百万个UID不适合一个文档。但是,每次达到限制时,您都可以创建一个新文档。我已经创建了一个库,可以帮助您根据1 MiB最大大小检查文档大小:
选项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与