2

我正在尝试找到解决以下问题的标准方法。
我在容器(特别是 Tomcat)中部署了一个 Web 应用程序,它使用数据库来实现其功能(在我的情况下,它是文件模式的 SQL 数据库,因此没有后端 SQL 服务器)。

我感兴趣的是,随着数据库架构的变化(新表/新列、删除列等),在我的 Web 应用程序的较新版本上处理我的数据库的各种更改的最佳方法是什么。
即,我如何处理某人升级到我的 Web 应用程序的较新版本的情况,并且仍然以最佳(自动?无缝?少手动?)方式保留旧数据库中的旧数据。

我认为这不是一个罕见的情况,所以我相信我可以在这里遵循一些最佳实践。
谁可以帮我这个事?

4

2 回答 2

5

最近我们发现了Flyway——它工作得很好,并且包含数据库模式更改的版本控制(纯 SQL 脚本)。

显然,这个话题要广泛得多。例如,当应用程序的旧版本和新版本都应该在更新的模式中完美运行时,您需要格外小心。您还应该考虑回滚策略(当升级效果不佳或您想降级应用程序时) - 有时就像删除添加的对象(表、列)一样简单,但是当您的脚本删除某些内容时,回滚应该恢复它们。

于 2012-04-05T08:48:18.150 回答
0

首先,您希望尽可能减少对数据库,尤其是对现有列的更改。

其次,如果您需要重命名列或更改某些约束(注意不要变得更严格,因为可能有些数据不匹配),请使用ALTER TABLE语句。这样,除非您删除列,否则列中的数据将被保留。:)

此外,为具有约束的新列(如非空)提供默认值,因为该表中可能已经存在需要更新的数据集,以免违反这些约束。(或者添加列,运行一些代码来填充列,然后添加约束。)

第三,由于您的应用程序似乎有多个用户并且他们可能有不同的版本,因此提供更新的最简单方法是提供对下一个更高版本的顺序更新。因此,如果有人想从版本 2 更新到 5,您首先要进行 2->3 更新,然后是 3->4,最后是 4->5。

这可能需要更长的时间才能运行,但应该会降低复杂性,因为您的机器人必须担心所有可能的组合(例如 2->4、2->5、3->5 等)

于 2012-04-05T08:49:02.580 回答