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

pro*_*aea 6 android nosql firebase firebase-realtime-database

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

{
    "states": {
        "VALID": 0,
        "INVALID": 1
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我已经发布了使用这个对象的客户端,他们已经在野外,但我意识到这个对象不符合我的需求而且需要改变.现在我已经创建了一个这样的版本化对象:

{
    "states2": {
        "VALID": {
            "id": 0,
            "name": "Valid entry"
        },
        "INVALID": {
            "id": 1,
            "name": "Invalid entry"
        }
}
Run Code Online (Sandbox Code Playgroud)

现在的计划是离开状态对象,只是从较新的客户端中的states2获取额外的数据,但这种遗留下来的遗留问题看起来真的很糟糕.那么问题是:

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

要么

2)我是否只是以一种不打算使用的方式使用Firebase?

要么

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

Fra*_*len 7

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

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

    有几种常见的处理方法:

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

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

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

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