我正在开发一个跨平台的应用程序: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中构建这种只读数据?
答案 0 :(得分:7)
不,Firebase没有内置版本。
完全没有。这是我见过的客户端 - 服务器上下文中任何数据库模式升级的常见问题。无论您使用哪个数据库,在升级数据库模式时,为多个版本的客户端提供服务并不简单。
有几种常见的处理方式:
您所做的是解决此问题的最佳方法:创建具有新结构的辅助数据结构。如果结构是可写的,那意味着您必须协调写入以更新两个位置。由于您无法更新旧应用程序,因此您必须使用非客户端脚本执行此操作。是的,这很痛苦。
您有时会看到一种替代方法是强制升级,这意味着您在数据库中保留了顶级current-schema-version
,并且客户端会检查是否可以读/写那个版本。如果没有,它就会中止。
任何数据的最佳结构取决于您的应用程序的需求。所以我们不可能说出 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时,您应仅注意不要在版本之间更改字段的含义。在较新的版本中,请始终保持旧的读/写状态,对于新数据,始终创建新字段。
要使版本正常运行,必须在产品的所有更高版本中始终显示最少的字段。