有没有办法对 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 中构建这种只读数据?
不,Firebase 没有内置版本控制。
完全没有。这是我见过的客户端-服务器上下文中任何数据库模式升级的常见问题。无论您使用哪个数据库,在升级数据库模式的同时满足多个版本的客户端并不简单。
有几种常见的处理方法:
您所做的是解决此问题的最常见方法:创建具有新结构的二级数据结构。如果该结构是可写的,则意味着您必须协调写入以更新两个位置。由于您无法更新旧应用程序,因此您必须使用非客户端脚本来完成部分更新。是的,很痛苦。
您有时会看到的一种替代方法是 强制升级,这意味着您在数据库和客户端中保留顶级 current-schema-version
检查是否可以 read/write 那个版本。如果不是,它就会中止。
- 任何数据的最佳结构取决于您的应用程序的需要。所以我们不可能说什么是最好的。你最初的数据结构对我来说似乎很合理,但你发现它太局限了。
鉴于这是只读(可能是管理)数据,我建议为您的应用程序设置一个管理仪表板。当您在该仪表板中添加新的 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 不变,并始终为新数据创建新字段。
您产品的所有更高版本中必须始终存在版本运行所需的最少字段。
我正在开发一个跨平台的应用程序: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 没有内置版本控制。
完全没有。这是我见过的客户端-服务器上下文中任何数据库模式升级的常见问题。无论您使用哪个数据库,在升级数据库模式的同时满足多个版本的客户端并不简单。
有几种常见的处理方法:
您所做的是解决此问题的最常见方法:创建具有新结构的二级数据结构。如果该结构是可写的,则意味着您必须协调写入以更新两个位置。由于您无法更新旧应用程序,因此您必须使用非客户端脚本来完成部分更新。是的,很痛苦。
您有时会看到的一种替代方法是 强制升级,这意味着您在数据库和客户端中保留顶级
current-schema-version
检查是否可以 read/write 那个版本。如果不是,它就会中止。
- 任何数据的最佳结构取决于您的应用程序的需要。所以我们不可能说什么是最好的。你最初的数据结构对我来说似乎很合理,但你发现它太局限了。
鉴于这是只读(可能是管理)数据,我建议为您的应用程序设置一个管理仪表板。当您在该仪表板中添加新的 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 不变,并始终为新数据创建新字段。
您产品的所有更高版本中必须始终存在版本运行所需的最少字段。