数据库重构,是对数据库 schema 的一个简单变更,在保持其行为语义和信息语义的同时,改进了它的设计。 —— 《数据库重构》
换言之,你既没有增加新功能,也没有破坏原有的功能,没有添加新的数据,也没有改变原有数据的语义。值得注意的是,尽管你的领域模型发生了变化,但是这也不意味着数据库 schema 需要因此而发生改变;与此同时,一些公司的制度也会限制我们对数据库进行重构。它们之间的关系如下图所示:
如《数据库重构》一书所说:数据库重构是一种数据库实现技术,就像代码重构是一种应用实现技术一样。当我们在不断对代码调优的同时,我们也在不断地对数据库进行调优。
数据库回归测试:数据不变性
前测试
采用传统的数据库测试工具,如 DBUnit,SQLUnit,通过诸如 TDD 的方式来完成对数据库的测试,随后开展对代码的重构。
后测试
为了对重构进行验证,我们需要对数据库进行回归测试。一种常见的做法是:
- 录制行为数据
- 通过回复验证功能不被破坏
- 通过影子流量进行验证
这样的工具有很多,如我司吴大师写的 DBdiff,可以用于 Oracle 数据库的迁移。
引入数据库迁移工具
尽管,我并没有实践过大规模的数据库重构,但是和其他/她的后端开发一样,在日常的开发中,我们也时不时会做一些数据库重构 —— 数据库迁移。
- 代码版本控制
- 数据库版本控制
- 多数据识别
诸如于 Flyway 和 Liquibase 都是一些不错的工具。
迁移源数据
我尝试编写脚本来将我的博客 https://www.phodal.com 从 SQLite3 迁移到 MySQL,这并不是一件困难的事情。因为 SQLite3 是一种嵌入式数据库,而我们可以通过 mysqldump
出 MySQL 的数据。
如此一来,我们便可以用于做数据库重构练习,并编写数据库的回归测试。
汲取式重构:存储过程转换
对于采用 Oracle 的项目来说,数据重构不是一件容易的事情。它还涉及到一系列的存储过程代码。
所以,我们还可以尝试将 PLSQL 转为 Kotlin 代码:https://github.com/XuefengWu/LADE_Analysis