数据库表设计的三大规范(数据库表结构怎么进行版本管理)

前言

新功能开发了好久终于通过测试准备上线了,没想到在生产环境一运行直接报错了,一查是这次新功能开发增加了好几张表,然而却没有同步到线上数据库,不得不说这失误也太低级了吧!

为了防止再次发生类似问题,能否通过程序自动帮助我们完成数据库表结构的版本管理呢?

目录
  1. 为什么需要对数据库迁移进行版本管理?
  2. Flyway原理浅析
  3. SpringBoot项目集成Flyway
  4. 总结
为什么需要对数据库迁移进行版本管理?

一个项目在通常情况下都是多人协作开发,我做这个功能、你做那个功能,因为有非常成熟的版本管理工具如Git和SVN来对代码进行版本管理,所以一般在代码同步上不会出什么问题。

但是我回想了一下,在数据库同步层面经常会发生一些小问题:

数据库表设计的三大规范(数据库表结构怎么进行版本管理)(1)

比如我在做新功能时在本地数据库新建了一张表,功能做完之后我将代码提交到主干分支;另外一个程序员小伙伴同步最新代码之后在本地就会跑不起来,因为他电脑的本地数据库并没有我新建的这张表。怎么办?我手动将建表语句发给他,他再手动执行一遍,这是人少的情况,人多的情况下都不知道该找谁要表结构?

再比如一般我们开发项目会有集成开发、测试和生产3套运行环境,每次发版我们先要把数据库表结构的变动在集成开发环境执行一遍,没问题再转到测试环境,最后上线时再到生产环境。

先不说这种同步数据库的方式累不累人,在开发环境还每个开发可以自己去同步自己改动的部分,可是到了生产环境所有的数据库结构变动都被混合到了一起,那么我们该怎么确定每个变动的先后顺序呢?

通过以上两个场景可以看到要在多人和多环境之间进行数据库表结构的同步是非常麻烦且容易出错的。

Flyway原理浅析

其实市面上支持对数据库迁移进行版本管理的工具还挺多,就Java方面来说有Flyway、Liquibase等开源工具。对比了一下两者的情况,Liquibase功能强大,支持XML、JSON、YAML、SQL4种配置方式,但需要一定的学习成本;Flyway相对则更加小巧简单,基本上可以做到开箱即用。

我认为一般中小型项目使用Flyway完全可以满足需求,大型项目或是企业级的项目使用Liquibase更合适。

这里我们主要介绍一下Flyway这个工具。

Flyway使用一张元数据表flyway_schema_history来记录每次数据库迁移的历史记录。

数据库表设计的三大规范(数据库表结构怎么进行版本管理)(2)

Flyway会随着程序启动,从而开始进行数据库的迁移工作:

如果是首次执行,Flyway会先去扫描指定的文件路径或者是在classpath下寻找迁移文件,迁移文件可以是SQL文件也可以是Java类,这些迁移文件将按照特定的迁移版本号进行排序,然后将依次被执行。

数据库表设计的三大规范(数据库表结构怎么进行版本管理)(3)

如果是非首次执行,程序会首先检查迁移的历史记录,如果迁移文件的版本号小于当前数据库的版本号,那么这些迁移文件将不会被执行,所以每次我们新建迁移文件时版本号都必须大于数据库当前版本号。

在Flyway中,迁移文件会被分成3种类型:版本迁移、撤销迁移和可重复迁移。

1、版本迁移

其实大部分的迁移都属于版本迁移,每个版本迁移都应有一个唯一的版本号、一段对本次迁移所改动的描述和一个用于校验文件完整性的摘要值,所有的版本迁移都会且仅会被按序执行一次。

2、撤销迁移

撤销迁移的作用与版本迁移正好相反,主要作用是将与之前相同版本的版本迁移所产生的迁移效果撤销。

比如说V1版本迁移创建了一张test表,那么撤销迁移U1所做的就是drop掉test表。

特别注意的是:对于撤销迁移一定要慎重,因为通常撤销迁移包含drop、delete、truncate等具有破坏性的操作,所以做撤销迁移之前最好能够备份一下数据。

3、可重复迁移

从名字就可以看出可重复迁移可以被多次执行,事实上它没有版本号的概念,只要迁移文件发生变化,迁移就会被重新执行。可重复迁移通常在版本迁移和撤销迁移执行之后才会被执行。

确保可重复迁移里的所有操作重复执行不会出现意外情况。

说完了类型,再来聊聊版本号,迁移文件的版本号怎么定义的呢?答案是通过文件名

数据库表设计的三大规范(数据库表结构怎么进行版本管理)(4)

一份标准的迁移文件名通常按照以下规则组成:

  1. 前缀——V代表版本迁移,U代表撤销迁移,R代表可重复迁移。
  2. 版本号——版本号通常点号/下划线和整数组成。
  3. 分隔符——固定由两个下划线__组成。
  4. 描述——由下划线分隔的单词组成,用于描述本次迁移的目的。
  5. 后缀——如果是SQL文件那么固定由.sql组成,如果是基于Java类则默认不需要后缀。
SpringBoot项目集成Flyway

Flyway和Spring Boot一样推崇约定大于配置,所以只需要简单几步就可以使用上Flyway了。

以基于SQL文件的方式迁移为例:

1、在pom.xml文件中引入依赖:

数据库表设计的三大规范(数据库表结构怎么进行版本管理)(5)

2、在项目resources目录下新建db/migration目录,用来存放SQL文件,如果想存放到其他目录,可以进行自定义配置,后面会讲到。

数据库表设计的三大规范(数据库表结构怎么进行版本管理)(6)

3、在配置文件application.properties中配置Flyway元素数据表所在的数据库信息。

数据库表设计的三大规范(数据库表结构怎么进行版本管理)(7)

当然了,其实Flyway还提供了其他非常多的配置项,我们可以按需进行配置。

总结

在多人开发以及多环境下迁移数据库是一件非常麻烦且容易出错的事情,所以我们应该通过程序来自动完成数据库的迁移工作。

Flyway是一款Java开源的数据库迁移管理工具,具备轻便小巧的特点,我们可以无门槛快速集成到项目中。

“分享知识,收获快乐”

我是一名程序员,喜欢我的文章欢迎 关注 及 转发,我会经常与大家分享一些工作当中的编程技巧与经验。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页