java–Firestore– 如何构建一个feed并跟踪系统

java–Firestore– 如何构建一个feed并跟踪系统,第1张

概述我在我的测试社交网络应用程序中使用Firebase实时数据库,您可以在其中关注并接收您关注的人员的帖子.传统的社交网络.我将我的数据库构造成这样的东西–Users--USER_ID_1----name----email--USER_ID_2----name----emailPosts--POST_ID_1----image----userid----da

我在我的测试社交网络应用程序中使用Firebase实时数据库,您可以在其中关注并接收您关注的人员的帖子.传统的社交网络.
我将我的数据库构造成这样的东西 –

Users--USER_ID_1----name----email--USER_ID_2----name----emailposts--POST_ID_1----image----userID----date--POST_ID_2----image----userID----dateTimeline--User_ID_1----POST_ID_2------date----POST_ID_1------date

我还有另一个节点“内容”,它只包含所有用户帖子的ID.因此,如果“A”跟在“B”之后,那么B的所有帖子ID都添加到A的时间轴.如果B发布了一些内容,那么它也会添加到其所有关注者的时间轴中.

现在这是我的实时数据库解决方案,但它显然存在一些可扩展性问题

>如果有人拥有10,000个关注者,则新帖子被添加到所有10,000个关注者的时间轴中.
>如果某人有大量帖子,那么每个新粉丝都会在他的时间轴中收到所有这些帖子.

这些都是一些问题.

现在,我正在考虑将整个事情转移到firestore上,因为它声称是“可扩展的”.那么我应该如何构建我的数据库,以便在firestore中消除我在实时数据库中遇到的问题.

解决方法:

我稍后见过您的问题,但我也会尝试为您提供我能想到的最佳数据库结构.所以希望你会发现这个答案很有用.

我正在考虑一个架构,其中有三个顶级集合供用户,用户关注和发布的用户:

Firestore-root   |   --- users (collection)   |     |   |     --- uID (documents)   |          |   |          --- name: "User name"   |          |   |          --- email: "email@email.com"   |   --- following (collection)   |      |   |      --- uID (document)   |           |   |           --- userFollowing (collection)   |                 |   |                 --- uID (documents)   |                 |   |                 --- uID (documents)   |   --- posts (collection)         |         --- uID (documents)              |              --- userposts (collection)                    |                    --- postID (documents)                    |     |                    |     --- Title: "Post Title"                    |     |                    |     --- date: September 03, 2018 at 6:16:58 PM UTC+3                    |                    --- postID (documents)                          |                          --- Title: "Post Title"                          |                          --- date: September 03, 2018 at 6:16:58 PM UTC+3

if someone have 10,000 followers than a new post was added to all of the 10,000 follower’s Timeline.

这根本不是问题,因为这就是Firestore中收藏的原因.根据modeling a Cloud Firestore database的官方文档:

Cloud Firestore is optimized for storing large collections of small documents.

这就是我将userFollowing添加为集合而不是作为可以容纳其他对象的简单对象/地图的原因.请记住,根据有关limits and quota的官方文档,文档的最大大小为1 MiB(1,048,576字节).在收集的情况下,对集合下面的文档数量没有限制.事实上,对于这种结构,Firestore进行了优化.

因此,以这种方式拥有这10,000名粉丝,将完美无缺.此外,您可以以不需要在任何地方复制任何内容的方式查询数据库.

正如您所看到的,数据库几乎是非规范化的,允许您非常简单地查询它.让我们举一些例子,但在让我们创建一个与数据库的连接并使用以下代码行获取用户的uID之前:

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();String uID = FirebaseAuth.getInstance().getCurrentUser().getUID();

如果要查询数据库以获取用户正在关注的所有用户,可以对以下引用使用get()调用:

CollectionReference userFollowingRef = rootRef.collection("following/" + uID + "/userFollowing");

因此,通过这种方式,您可以获得用户正在关注的所有用户对象.有了他们的uID,你可以简单地得到他们的所有帖子.

假设您希望在时间轴上了解每个用户的最新三篇帖子.当使用非常大的数据集时,解决此问题的关键是以较小的块加载数据.我在post的答案中解释了一种推荐的方法,您可以通过将查询游标与limit()方法相结合来对查询进行分页.我还建议你看一下video以便更好地理解.因此,要获得每个用户的最新三篇帖子,您应该考虑使用此解决方案.首先,您需要获取您正在关注的前15个用户对象,然后根据他们的uID获取最新的三个帖子.要获取单个用户的最新三篇帖子,请使用以下查询:

query query = rootRef.collection("posts/" + uID + "/userposts").orderBy("date", query.Direction.DESCENDING)).limit(3);

在向下滚动时,加载其他15个用户对象并获取最新的三个帖子,依此类推.除了日期之外,您还可以向帖子对象添加其他属性,例如喜欢,评论,分享等的数量.

If someone have large amount of posts than every new follower received all of those posts in his Timeline.

没门.没有必要做这样的事情.我已经解释了为什么.

编辑2019年5月20日:

优化用户应该看到他所关注的每个人的所有最近帖子的 *** 作的另一个解决方案是存储用户应该在该用户的文档中看到的帖子.

因此,如果我们举个例子,让我们说facebook,你需要有一个包含每个用户的facebook Feed的文档.但是,如果单个文档可以容纳的数据太多(1 Mib),则需要将该数据放入集合中,如上所述.

总结

以上是内存溢出为你收集整理的java – Firestore – 如何构建一个feed并跟踪系统全部内容,希望文章能够帮你解决java – Firestore – 如何构建一个feed并跟踪系统所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1103734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存