Android 有没有办法对Firebase中的只读对象进行版本设置?

Android 有没有办法对Firebase中的只读对象进行版本设置?,android,firebase,firebase-realtime-database,nosql,Android,Firebase,Firebase Realtime Database,Nosql,我正在开发一个跨平台的应用程序:web、android和iOS。我有两个对象用于指定一些常量,比如有效状态。例如: { "states": { "VALID": 0, "INVALID": 1 } } 现在我已经发布了使用这个对象的客户机,他们已经在野外了,但是我意识到这个对象不能满足我的需要,它需要改变。现在,我创建了一个版本化对象,如下所示: { "states2": { "VALID": {

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

  • 否,Firebase没有内置版本控制

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

  • 有几种常见的处理方法:

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

    • 您有时会看到的一种替代方法是强制升级,这意味着您在数据库中保留一个顶级的
      当前架构版本
      ,客户端检查is是否可以读/写该版本。如果没有,它只是中止

  • 任何数据的最佳结构取决于应用程序的需要。所以我们不可能说什么是最好的。您最初的数据结构在我看来是合理的,但您发现它太有限了

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

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

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

    如果没有,他们对自己的应用程序很满意

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

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

    由于firebase是无模式的,所以可以让同一类别的两个节点包含不同数量的字段,而不会出现问题。因此,使用firebase时,只需注意不要在版本之间更改字段的含义。在较新版本中,始终保持旧的读/写操作不变,对于新数据,始终创建新字段


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

    有没有办法在firebase现有数据库中添加DB child而不影响现有用户?