我知道标题可能会让人感到困惑,但这是我能用来解释这个问题的最好方法。
背景
我有一个域,一个域有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”)。 / p>
迁移 - 更改表格
这有点棘手,因为我们都有sql数据库。 在sql中,我需要先创建alter schema,然后在需要时以某种方式更新每一行。
结论: 我认为第3个是最快的,但我真的不知道这里的最佳做法是什么。
由于
答案 0 :(得分:1)
我认为第三种是默认方法。它有几个赞成的论点:
您不必触摸不改变的事物。它只是保持原样。
您可以轻松地进行分阶段更改,例如在v1中添加列,在第一版的生命周期内开始填充数据,可能是批量生成,在v2中主动使用它,也可能在v3中删除旧列当你确定所有的新东西都很好的时候。在其他方面做这件事听起来很麻烦。
使用大型数据库复制所有数据可能会非常昂贵(更多考虑时间和I / O而不是磁盘空间)
更新回答评论
中的其他问题如果要将A列和B列合并到新列C中,您可以根据问题的第三种方法选择各种选项:
安全方式: - 停止申请,所以没人能写信。
创建并填写C列
可能会删除A和B上的非空和类似约束
部署并启动仅使用C列的新版应用程序。
以后任何时候都会删除A列和B列,可能只有几周后才会发布下一个版本。
快速的方式 - 停止申请,所以没人能写信。
创建并填写C列
删除A和B
部署并启动仅使用C列的新版应用程序。
由于您的应用程序和未使用的列似乎有问题,因此可能需要这样做。
遗产代码的方式 - 创建列C(注意:所有应用程序仍在运行)
创建使A,B和C保持同步的触发器(这也可以通过视图和可能的其他供应商特定的RDBMS功能完成)
部署并启动仅使用C列的新版应用程序。
将所有其他应用程序迁移到仅使用C
随后可能会在几年之后丢弃A列和B列。
这适用于您使用数据库的许多应用程序无法一次更改的情况。
我不知道猫鼬的续集......对我来说听起来像童话般的冒险: - )