Database 迁移技术:将整个数据库复制到v2,还是始终在同一数据库版本上进行更改?

Database 迁移技术:将整个数据库复制到v2,还是始终在同一数据库版本上进行更改?,database,migration,Database,Migration,我知道标题可能会让人困惑,但为了解释这个问题,这是我能提供的最好的标题 背景: 我有一个域,一个域有两个数据库:一个nosql(Mongodb)和一个sql(Postgres);每个数据库都有自己的模型。例如,如果域名是“myapp”,版本是“v01”,那么它在sql和nosql中都有一个名为“myapp_v01”的数据库 迁移-复制数据库: 在迁移时,我通常会创建一个名为“myapp_v02”的新数据库(请注意第2行)。然后,迁移脚本将克隆表或从“myapp_v01”获取数据,以某种方式对其进

我知道标题可能会让人困惑,但为了解释这个问题,这是我能提供的最好的标题

背景:

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

迁移-复制数据库:

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

迁移-复制表:

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

迁移-更改表:

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

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


谢谢

< P>我会考虑第三默认方法。它有两个赞成的理由:

  • 你不必去触摸那些你没有改变的东西。它只是停留在它原来的地方

  • 您可以轻松地进行阶段性更改,比如在v1中添加一列,在版本1的生命周期内开始使用数据填充它,可能是成批的,在v2中积极使用它,可能是在v3中删除一个旧列,当您确实确定所有新内容都正常工作时。在其他地方这样做听起来很麻烦

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

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

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

    安全之道: -停止应用程序,这样就没有人可以对其进行写入

    • 创建并填写C列

    • 可能会删除A和B上的NOTNULL和类似约束

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

    • 以后任何时候都可以删除A列和B列,可能仅在几周后发布下一个版本

    捷径 -停止应用程序,这样就没有人可以对其进行写入

    • 创建并填写C列

    • 放下A和B

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

    因为您的应用程序和未使用的列似乎有问题,所以这可能是一种解决方法

    遗留代码之路 -创建列C(注意:所有应用程序仍在运行)

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

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

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

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

    这适用于你有很多应用程序使用数据库,你不能一次全部更改


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

    我认为第三个选择是一个不错的选择——当然“视情况而定”。我仍然有一个问题。假设我有表_v01,其中有字段“a1”和“b2”,我想将它们合并到“a2”中。我应该首先创建“a2”字段,但是我会遇到问题,因为我使用模型,v2中的模型没有“a1”和“b1”字段,v1中的模型没有“b2”。我在mongoose中使用sequelize。我的目的是创建一个迁移文件夹,其中包含v1、v2、v3的模型。主应用程序中的型号为实际版本型号。因此,在我的第一种方法中,我打开了两个连接,一个是v1的模型,另一个是v2的模型,然后复制粘贴。但是第三种方式我不知道如何使用模型。。。