有没有办法对 Firebase 中的只读对象进行版本控制?

Is there a way to version objects in Firebase that are meant to be read-only?

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

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

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

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

现在的计划是保留 states 对象,只从较新的客户端中的 states2 获取额外数据,但是留下这种遗留问题似乎真的很糟糕。那么问题来了:

1) 有没有办法对 Firebase 提供的对象进行版本控制?

2) 我只是在以一种不应该使用的方式使用 Firebase 吗?

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

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

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

有几种常见的处理方法:

  • 您所做的是解决此问题的最常见方法:创建具有新结构的二级数据结构。如果该结构是可写的,则意味着您必须协调写入以更新两个位置。由于您无法更新旧应用程序,因此您必须使用非客户端脚本来完成部分更新。是的,很痛苦。

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

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

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

假设您有一个旧应用程序 v1.0 和一个新应用程序 v2.0,您有 50 个客户端 reading/writing v1.0 和 50 个客户端 reading/writing v2.0。

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

如果不是,则表示他们对自己的应用感到满意。

如果是,v2.0 客户端必须从 v1.0 字段读取数据并将其升级到 v2.0 字段(默认或使用 v2.0 客户端的附加数据),同时写入 v1.0 字段和然后写入额外的 v2.0 字段。

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

由于 firebase 是无模式的,因此您可以拥有包含不同数量字段的同一类别的两个节点,这没有问题。因此,对于 firebase,您只应注意不要在不同版本之间更改字段的含义。在较新的版本中,始终保持旧 read/writes 不变,并始终为新数据创建新字段。

您产品的所有更高版本中必须始终存在版本运行所需的最少字段。