【问题标题】:Firebase data structure - Keeping duplicated data up-to-dateFirebase 数据结构 - 使重复数据保持最新
【发布时间】:2016-10-19 19:48:09
【问题描述】:

我创建了一个扁平的数据结构。推送重复数据时,保持该数据最新的公认模式是什么。这里,组信息的数据被复制到 users-groupsgroups 树中。

{
 "users": ..
 "users-groups": ..
 "groups": ..
}

为用户创建组时,会发生两次更新:

首先:推送到 /groups/group_key

{
 "name": "Test Group",
 "image: "/testimage.jpg"
}

第二:推送到/users-groups/user_uid/group_key

{
 "orderNum: 0,
 "info": {
  "name": "Test Group",
  "image: "/testimage.jpg"
 }
}

保持用户组中的这些数据是最新的应该是客户端的工作还是应该由服务器来处理?

组树中的数据将始终是最新的,并且更改应该向下传播到该组的所有成员。

有这个问题的教程或参考资料吗?

注意:我使用这种结构是因为用户可以是多个组的成员,我认为创建多个ref.once 以从@987654328 获取数据并不是一个好主意@ 直接地。

【问题讨论】:

  • 不,我正在讨论数据结构,没有特定于 android 的数据结构
  • 我想您可能正在寻找这个:firebase.googleblog.com/2015/10/client-side-fan-out-for-data-consistency_73.html
  • 谢谢,就是这样

标签: firebase firebase-realtime-database


【解决方案1】:

您可以使用多路径更新。只需观察功能参考并更新所有其他信息

db.ref("").update({
  '/users/dedd': info,
  '/users/cdcd': info2
})

【讨论】:

    【解决方案2】:

    您不应该重复保存数据。相反,您应该保存对组的引用。

    您的数据应如下所示。

    {
        "users": {
            "userkey1": {
                "data": {
                    "name": "",
                    "firstname": ""
                },
                "groups": {
                    "groupkey1": true // true or orderNum value
                }
            }
        },
        "groups": {
            "groupkey1": {
                "data": {
                    "name": "Test Group",
                    "image": "/testimage.jpg",
                    "other": "data"
                },
                "users": {
                    "userkey1": true
                }
            }
        }
    }
    

    您可以通过检查任何这些位置的值是否为true 来轻松检查用户是否在组中。

    users/userkey1/groups/groupkey1groups/groupkey1/users/userkey1

    当您创建新组时,您保存在groups/newgroupkey 位置下,并通过仅将newgroupkey 设置为true 来更新users 节点下的groups。 所以你不会复制你的数据。

    有关结构化数据的更多信息,请查看以下链接。

    https://firebase.google.com/docs/database/android/structure-data

    【讨论】:

    • 是的,这就是我想要的,虽然我也在使用数据复制。为什么不使用重复数据?它使我不必为所有“连接”创建侦听器?数据重复是 NOSQL 中公认的模式吧?
    • 例如,如果我想拉一个用户组列表,那么我需要为 users-groups 集合初始化一个侦听器,然后为每个集合初始化一个或多个以链接到实际的组信息.
    • 是的,也许你是对的。如果您需要获取所有组及其信息重复版本的效果会更好,但如果您需要用户提供特定组的信息怎么办。在这种情况下,您还必须复制用户信息。
    • 是的,我知道我在争论什么,为了这个小例子,我将不得不介绍两个需要维护的数据粉丝。我对 Frank van Puffelen 引用的博客文章的看法是:NOSQL 处理得很好。就我而言,我认为这将是因为我可以限制一个用户可以拥有的群组数量以及一个群组可以拥有的用户数量,所以我认为这对我来说不是问题。
    • 我提到了服务器,因为如果最坏的情况变得更糟,我可以在服务器上排队扇出任务,或者每个客户端都不必维护具有数千个依赖项的扇出。
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 2016-09-21
    • 1970-01-01
    • 2021-02-15
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多