有没有办法在Firebase中版本化对象?

时间:2015-05-11 13:14:06

标签: android firebase firebase-realtime-database nosql

我正在开发一个跨平台的应用程序:web,android,iOS。我有几个对象旨在指定一些常量,如有效状态。例如:

{
    "states": {
        "VALID": 0,
        "INVALID": 1
    }
}

现在我已经发布了使用此对象的客户,他们已经在野外,但我意识到这个对象并不能满足我的需求,需要改变。现在我已经创建了一个这样的版本化对象:

{
    "states2": {
        "VALID": {
            "id": 0,
            "name": "Valid entry"
        },
        "INVALID": {
            "id": 1,
            "name": "Invalid entry"
        }
}

现在的计划是离开状态对象,只是从较新的客户端中的states2获取额外的数据,但是留下这种遗留问题似乎真的很糟糕。所以对于这个问题:

1)Firebase提供的版本对象是否有办法?

2)我是否只是以某种方式使用Firebase?

3)有没有更好的方法在Firebase中构建这种只读数据?

2 个答案:

答案 0 :(得分:7)

  1. 不,Firebase没有内置版本。

  2. 完全没有。这是我见过的客户端 - 服务器上下文中任何数据库模式升级的常见问题。无论您使用哪个数据库,在升级数据库模式时,为多个版本的客户端提供服务并不简单。

    有几种常见的处理方式:

    • 您所做的是解决此问题的最佳方法:创建具有新结构的辅助数据结构。如果结构是可写的,那意味着您必须协调写入以更新两个位置。由于您无法更新旧应用程序,因此您必须使用非客户端脚本执行此操作。是的,这很痛苦。

    • 您有时会看到一种替代方法是强制升级,这意味着您在数据库中保留了顶级current-schema-version,并且客户端会检查是否可以读/写那个版本。如果没有,它就会中止。

  3. 任何数据的最佳结构取决于您的应用程序的需求。所以我们不可能说出 best 是什么。您的初始数据结构对我来说似乎很合理,但您发现它太有限了。

    鉴于这是只读(可能是管理)数据,我建议为您的应用程序设置管理仪表板。在该仪表板中添加新的state时,它可以将其写入两个位置。

答案 1 :(得分:0)

假设您有一个旧版应用v1.0和一个新版v2.0,则按照v1.0读取/写入50个客户端,按照v2.0读取/写入50个客户端。

唯一的问题是这些客户群是否互相影响?

如果没有,他们对自己的应用感到满意。

如果是,则v2.0客户端必须从v1.0字段读取数据并将其升级到v2.0字段(默认值或包含来自v2.0客户端的其他数据),并且在写入时写入v1.0字段,然后写入其他v2.0字段。

该理论适用于一个客户端与多个其他版本的客户端交互。

由于firebase是无模式的,因此您可以使两个相同类别的节点包含不同数量的字段,而不会出现问题。因此,在使用Firebase时,您应仅注意不要在版本之间更改字段的含义。在较新的版本中,请始终保持旧的读/写状态,对于新数据,始终创建新字段。

要使版本正常运行,必须在产品的所有更高版本中始终显示最少的字段。