5

我正在开发一个跨平台的应用程序: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 中构造这种只读数据?

4

2 回答 2

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

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

有几种常见的处理方法:

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

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

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

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

于 2015-05-11T14:20:05.837 回答
0

假设您有一个旧应用程序 v1.0 和一个新应用程序 v2.0,您有 50 个按照 v1.0 读/写的客户端和 50 个按照 v2.0 读/写的客户端。

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

如果不是,他们对他们的应用程序感到满意。

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

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

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

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

于 2018-09-29T17:17:48.393 回答