【发布时间】:2018-04-09 07:33:40
【问题描述】:
我将 Firebase 实时数据库用于我的测试社交网络应用程序,您可以在其中关注并接收您关注的人的帖子。传统的社交网络。 我像这样构建了我的数据库 -
Users
--USER_ID_1
----name
----email
--USER_ID_2
----name
----email
Posts
--POST_ID_1
----image
----userid
----date
--POST_ID_2
----image
----userid
----date
Timeline
--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 文档。由于 firestore 的查询比 firebase-realtime-db 好得多,因此您不再需要复制数据。所以我要做的是:当用户查看他们的时间线时,创建一个 Firestore 查询,上面写着
give me all posts which are from the people i follow。类似于:posts.where(user== john OR mark OR katy OR ...)。我希望这样的事情有效。如果我有时间尝试,我会告诉你。 -
@jurgenBrandstetter Firestore 目前不支持“或”,如果支持,您的方法也将不起作用。假设某人有 1000 个关注者,而我必须做出 1000 条 OR 语句。
-
我在想,如果您在文档中输入关注您的人的 ID,可能是这样。例如,UserA 跟随 UserB,然后在 UserB 发布文档中输入 UserAID = true。因此,当您进行查询时,它将类似于 == postDocRef.where(UserAID=true),但我不知道 firestore 中的文档是否可以支持多达 n 百万的关注者
-
@Zicsus 让我们假设这个例子。我发了 10 000 个帖子。现在你跟着我。您可以按时间戳对帖子进行排序,然后限制为一定数量,例如 15 个帖子并使用 .childAdded 方法。为了以相同的时间顺序加载更多数据,您可以使用以下类型的观察者创建一个方法:ObserveSingleEvent(ofType:Value),限制为 10 个帖子。然后在您的表格视图中实现拉动刷新功能或使用滚动视图偏移量,当您到达表格底部时,只需调用您的
ObserveSingleEvent方法并获取更多项目等等。 -
@bibscy 如果您只关注一个人,问题不是准备提要,而是如何准备像推特这样按时间顺序排列的提要,您可以在其中看到您关注的所有用户的活动。
标签: java android firebase database-design google-cloud-firestore