0

我知道标题可能令人困惑,但为了解释这个问题,这是我能想到的最好的。

背景:

我有一个域,一个域有2个数据库:一个nosql(Mongodb)和一个sql(Postgres);每个数据库都有自己的模型。例如,如果域名是“myapp”并且版本是“v01”,那么它将在 sql 和 nosql 中都有一个名为“myapp_v01”的数据库。

迁移 - 复制数据库:

当我迁移时,我通常会创建一个名为“myapp_v02”的新数据库(注意 2)。然后迁移脚本将克隆表或将从“myapp_v01”获取数据以某种方式对其进行更改并以不同的方式将其保存到“myapp_v02”。我不知道这是否具有很强的可扩展性,或者迁移需要 1 小时会怎样?

迁移 - 复制表:

我可以简单地创建一个新的临时表来进行迁移更改(从表“cars”复制到“cars_temp”,然后删除“cars”表并将“cars_temp”的名称更改为“cars”)。

迁移 - 更改表:

这有点棘手,因为我们有两个 sql 数据库。在 sql 中,我需要先创建更改模式,然后在需要时以某种方式更新每一行。

结论: 我认为第 3 个是最快的,但我真的不知道这里的最佳实践是什么。

谢谢

4

1 回答 1

1

我认为第三种是默认方法。它有几个支持的论点:

  1. 你不必触摸你没有改变的东西。它只是保持原样。

  2. 您可以轻松地进行分阶段更改,例如在 v1 中添加一列,在版本 1 的生命周期内开始用数据填充它,可能分批,在 v2 中积极使用它,并可能在您确定所有内容时删除 v3 中的旧列新东西运行良好。在其他方法中这样做听起来很麻烦。

  3. 对于大型数据库,复制所有数据可能会非常昂贵(更多地考虑时间和 I/O,而不是磁盘空间)

更新回答评论中的附加问题

如果您想将 A 列和 B 列合并到一个新列 C 中,您可以根据问题中的第三种方法有多种选择:

安全的方式: - 停止应用程序,所以没有人可以写入它。

  • 创建并填充 C 列

  • 可能删除 A 和 B 上的 not null 和类似约束

  • 部署并启动仅使用 C 列的新版本应用程序。

  • 之后的任何时候删除 A 列和 B 列,可能只在几周后发布下一个版本。

快速方法 - 停止应用程序,因此没有人可以写入它。

  • 创建并填充 C 列

  • 放下 A 和 B

  • 部署并启动仅使用 C 列的新版本应用程序。

由于您的应用程序和未使用的列似乎有问题,这可能是要走的路。

The Way For Legacy Code - 创建列 C(注意:所有应用程序仍在运行)

  • 创建使 A、B 和 C 保持同步的触发器(这也可以通过视图和可能的其他供应商特定的 RDBMS 功能来完成)

  • 部署并启动仅使用 C 列的新版本应用程序。

  • 迁移所有其他应用程序以仅使用 C

  • 以后的任何时候删除 A 列和 B 列,可能是几年后。

这适用于您有很多应用程序使用无法一次全部更改的数据库的情况。

我不知道猫鼬的续集......对我来说听起来像是一场童话般的冒险:-)

于 2012-12-12T12:03:04.843 回答