相关疑难解决方法(0)

Firestore - 如何构建订阅源并遵循系统

我在我的测试社交网络应用程序中使用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
Run Code Online (Sandbox Code Playgroud)

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

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

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

这些都是一些问题.

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

java android database-design firebase google-cloud-firestore

44
推荐指数
5
解决办法
6627
查看次数

用于预订应用的 Firestore 数据建模,可轻松查询可用性

我想就以下场景的 Cloud Firestore 数据结构最佳实践寻求建议。

有一个预订/约会应用程序。酒店出租房间。每家酒店都有多个房间。客户可以根据特定日期的空房情况搜索所有酒店的房间。

在 Firestore 中构建可用性数据的最佳方法是什么,以便我可以创建所有酒店的所有可用房间的视图。

我想创建一个单独的集合,我将在其中放置所有引用room ID和date保留的保留。但是,似乎我无法以这种方式搜索可用插槽,因为 Firestore 无法执行“不等于”查询。

所以我想我会为每个房间创建一个数组字段,其中包含所有可用日期作为时间戳。这就产生了另一个问题。即使我可以使用“array_contains”查询,用户也不能通过这种方式检查超过一天的可用性,因为“array_contains”每个查询只能使用一次。

在这种情况下,构建数据的最有效方法是什么?

谢谢!

database-design firebase google-cloud-functions google-cloud-firestore

7
推荐指数
1
解决办法
4946
查看次数

在Cloud Firestore中管理非规范化/重复数据

如果您决定在Firestore中对数据进行非规范化/复制以优化读取,那么通常使用哪种模式(如果有)来跟踪重复的数据,以便可以正确地更新它们以避免数据不一致?

例如,如果我具有Pinterest板之类的功能user,平台上的任何功能都可以将我的功能固定post到自己的功能上board,那么您将如何跟踪许多位置的重复数据?

对于为数据可以存在的每个唯一位置创建一个类似关系的表,该表用于重建需要更新的路径。

例如,创建一个users_posts_boards集合,首先是集合userIDs与子集postIDs终于有另一个子集boardIDs用boardOwnerID。然后,您可以使用它们来为post(例如/users/[boardOwnerID]/boards/[boardID]/posts/[postID])重建重复数据的路径吗?

另外,如果posts可以额外共享,以groups和lists你会继续做users_posts_groups,并users_posts_lists集合和子集,以同样的方式跟踪复制的数据?

另外,您会否拥有posts_denormalization_tracker唯一的集合,postIDs其中包含post已复制到的位置的子集合?

{
  postID: 'someID',
  locations: ( <---- collection
    "path/to/post/location1",
    "path/to/post/location2",
    ...
  )
}
Run Code Online (Sandbox Code Playgroud)

这意味着你将基本上需要有所有写入公司的FireStore通过云的功能实现,可以保持这个数据的轨道出于安全原因....除非公司的FireStore安全规则是足够强大,以允许添加操作的/posts_denormalization_tracker/[postID]/locations子集,而不允许读取或更新子集合或父postIDs集合。

我基本上是在寻找一种跟踪严重的非规范化数据的合理方法。

编辑:哦,是的,另一个很好的例子是将post作者的profile信息嵌入每个文档中post。想象一下,在整个平台上共享时,地狱试图保持所有最新状态,然后对其进行user更新profile。

firebase google-cloud-firestore

6
推荐指数
1
解决办法
738
查看次数

使用whereArrayContains搜索的效率

我对使用此代码在集合中搜索文档的效率感到好奇。随着集合中文档数量的增加和数组中项目的数量的增加,这种搜索会变得非常低效吗?是否有更好的方法可以执行此操作,或者可以对数据库进行模式更改以更好地优化此方法?在哪里可以找到Firestore文档的这些功能的时间复杂性?

Query query = db.collection("groups").whereArrayContains("members", userid);
Run Code Online (Sandbox Code Playgroud)


替代解决方案

我最初想尝试将组ID存储在该用户下,以便仅抓取该当前用户的组,但是遇到了问题,而且从未找到使用多个ID进行查询来设置FireStoreRecyclerOptions的解决方案。

例:

for(String groupid : list) {
    Query query = db.collection("test-groups").document(groupid);

    FirestoreRecyclerOptions<GroupResponse> response = new FirestoreRecyclerOptions.Builder<GroupResponse>()
            .setQuery(query, GroupResponse.class)
            .build();
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以向其中添加多个查询FirestoreRecyclerOptions?

java android firebase firebaseui google-cloud-firestore

5
推荐指数
1
解决办法
595
查看次数

Android Firebase如何处理实时服务器到本地数据库的连接

至于关于这个主题和类似的问题ChildEventListener,没有相关的答案,所以继承我的.

我有一个本地SQLite数据库,其中包含所有数据,我还有Firebase实时数据库,我正在使用新条目或所有用户的实时更改进行更新.我目前正在使用ChildEventListener如下方法:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getDatabase().getReference();
    DatabaseReference childRef = rootRef.child("my_root");

    ChildEventListener eventListener = new ChildEventListener()
    {
        ....
    };
    childRef.addChildEventListener(eventListener);
Run Code Online (Sandbox Code Playgroud)

至于功能,使用此代码,我可以获得有关孩子的实时更改,获取新条目,删除子项以及我需要的所有内容但有一个问题.当监听器的这个特定活动加载时,onChildAdded监听器会在该根上为每个孩子调用大量的时间,如文档中所述:

child_added为每个现有子项触发一次,然后每次将新子项添加到指定路径时再次触发

所以我虽然专注于我真正需要的项目,但我已经完成了:

rootRef.orderByKey().startAt("-WhatTF123456789")...
Run Code Online (Sandbox Code Playgroud)

但后来我丢失了我的CRUD功能,因为它正在收听新条目,而不是所有条目.

所以我想出了一个解决方案.保留节点,其中包含对FireBase数据库所做的所有更改以及一个节点,其中所有用户已阅读并对本地数据库进行了更改以了解谁需要更新,然后使用addChildEventListener此特定节点.但这似乎是多余的.

我有什么选择来处理这种情况?

java android firebase firebase-realtime-database

5
推荐指数
1
解决办法
418
查看次数

3
推荐指数
2
解决办法
732
查看次数

什么是Firebase Cloud Firestore中的非规范化?

在谈论Firebase Cloud Firestore时,这种非规范化到底意味着什么?我在互联网上阅读了几篇文章,并在此处找到了一些关于stackoverflow的答案,大多数答案都推荐这种方法。这种非规范化真正有什么帮助?总是有必要吗?

数据库扁平化和非规范化是一回事吗?

这是我的首要问题,希望我能找到一个可以帮助我理解这一概念的答案。我知道是不同的,但是我有两年的MySQL经验。

firebase google-cloud-firestore

1
推荐指数
1
解决办法
704
查看次数