我在我的测试社交网络应用程序中使用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并跟踪系统所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)