50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

数据库版本管理最佳实践

  • 2015-08-19
  • 本文字数:2313 字

    阅读完需:约 8 分钟

数据库版本管理的难点

数据库管理员与应用开发者想必多少都经历过数据库版本管理的痛苦,随着团队规模、客户数量以及基础设规模的上升,管理工作的复杂度将呈几何次数上升。那么数据库的版本管理究竟有何与众不同之处,为何不能像普通的代码与服务器一样采取相同的管理方式呢?数据库与其它系统组件的不同之处有以下几点:

  • 数据库中所存放的不仅是表数据,还有其它各种数据库对象,如表结构、索引、存储过程、角色、权限等等。这些数据库对象同样也需要进行版本管理,否则就有可能出现破坏性的错误。
  • 对于应用程序的部署,可以使用自动化持续集成工具,甚至可以通过容器现实不可变基础设施。因为这些应用程序一旦部署之后,在下一次部署之前通常不会产生任何变化。但数据库中包含着大量实时的业务数据,数据表中的内容每时每刻都在变化,无法以类似于二进制文件替换的方式简单地部署变更。
  • 数据库也可能具有外部依赖,例如在 SQL Server 中可以调用外部的 SQL CLR 程序集,对于这些依赖同样要进行版本管理。但目前在数据库领域还很少有类似于 npm NuGet 这样的包管理工具能够进行方便地依赖管理。
  • 数据库是一种集中化的资源,如果多个开发者同时提交的修改中有冲突,那么在实际运行变更脚本之前几乎无法检测到这种冲突的存在。

来自于 EastBanc Technologies 的 Vladimir Khorikov 近期发表了一篇博客文章,为读者介绍了一些他在数据库版本管理方面所采用的最佳实践。

最佳实践

最佳实践之一:将数据库和引用数据与代码一视同仁,也即是说它们也需要由版本控制系统进行管理。

Vladimir 在这里特意强调了引用数据的重要性,这些数据是运行应用程序不可或缺的元数据,因此同样需要保存至版本控制系统中。

最佳实践之二:数据库 Schema 与引用数据的每一次变动都应进行显式的记录,也就是说,对于数据库的任何一次修改,都应当保存在一个独立的文件中。如果某个变更脚本会同时影响到 Schema 与引用数据,那么应当将这些变动保存在同一个脚本文件中。

Vladimir 认为,坚持遵守为每一次修改生成一个独立的脚本文件的做法非常有必要。如今有许多项目的做法是将数据库的 Schema 保存在版本控制系统中,也就是保存了当前数据库版本的一个快照。这种方式无法将不同的修改分别保存到不同的脚本文件中,此外,在引用数据表中的变动往往会被忽略。

目前已经有许多工具可以对数据库进行版本控制管理,例如 Visual Studio 中的数据库项目,以及 Redgate 的 SQL Source Control 。虽然这些工具在小型数据库项目的管理中十分便利,但在 Vladimir 看来,在大型项目中以自动生成脚本的方式管理数据库反而变成了一种负担。他将在今后的博客文章中继续介绍这种工具的使用与问题所在。

最佳实践之三:当变更脚本部署之后,确保它的不可变性。

在 Vladimir 看来,在独立的文件中保存变更的意义就在于对这些变更进行追踪,一旦更改了这些脚本的内容,也就失去了版本管理的意义。因此正确的做法是保持这些脚本不变,如果需要撤消其中的某些变更,就另行创建一个单独的撤消脚本。

最佳实践之四:所有的数据库 Schema 与引用数据只能通过执行变更脚本的方式进行更新,坚决抵制人为修改数据库的做法。

与上一条实践一样,一旦对数据库直接进行手动更新,版本管理就变成了一纸空谈。因此必须通过签入版本控制系统中的脚本对数据库进行更新。

最佳实践之五:项目中的每个开发者都应当分配一个自有的数据库实例。

这一实践尤其适合于在大型团队中使用,因为在这种环境中,开发者的数据库变更很可能会与他人的变更产生冲突。而如果每位开发者都能够在一个独立的实例中进行开发,那么这种冲突可以在合并时通过版本控制系统解决。不过这种情况应当只适用于自动生成变更脚本的工具,否则不同的开发者会使用不同的脚本文件保存变更操作,版本控制系统对于不同文件中的冲突一无所知。

Vladimir 还建议为每个代码分支创建一个独立的数据库实例,当然这种做法取决于不同分支中的代码有多大的差别。这个实践在实际情况中可能会面临两种问题,一是如何修改配置信息,让开发者连接到不同的数据库,同时这种配置信息的变更不应签入版本库中。二是如果数据库信息非常庞大,在更新与分发时就非常耗时与占用磁盘空间。

最佳实践之六:将数据库的版本号也保存在数据库中。

Vladimir 就经常在一张独立的表 Settings 中保存一个数值型的版本信息。如果这个系统是一种可分发的应用(即每个用户都对应着一个不同的版本),那么可通过它了解当前客户所使用的应用的版本。

最佳实践的益处

Vladimir 随后简单地描述了这些最佳实践所带来的益处。最明显的一点就是,一旦出现数据库 Schema 不一致的情况,可以通过执行变更脚本确保升级到最新的版本。这一点对于可分发应用来说尤为明显。

最佳实践的第二个益处是实现了数据库变更的高内聚性,对于 Schema 与引用数据的全部改动都集中在版本控制系统中,而不是散落在应用程序的各处。同样,由于数据库脚本中包含了在开发某个特性时对数据库产生的所有变更,因而更易于理解这些变更的含义。

最后,Vladimir 表示,实现这些实践无需从一个全新的项目中开始。你可以现在就为数据库 Schema 创建一个初始化的脚本,将其作为版本 1,然后通过应用以上实践让你的脚本逐渐充实起来,最终成功地实现数据库版本管理的目标。

Vladimir 也在文中向读者强烈推荐了由 Ambler 等人撰写的著作《数据库重构》,有兴趣的读者可以仔细阅读此书,以便更深入地了解这一主题的相关知识。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-08-19 08:365751
用户头像

发布了 428 篇内容, 共 198.1 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

达观数据CTO 纪达麒:基于阿里云计算底座,打造智能办公机器人

阿里云弹性计算

机器人 神龙架构 智能办公

Hoo虎符研究院 ∣ 投资前沿——STARKNET 生态一览 (2022.3.18)

区块链前沿News

虎符研究院

区块链正在塑造医疗保健生态系统!

CECBC

Flutter 开发一个常用的登录界面

岛上码农

ios 移动端开发 3月月更 flutter开发 安卓开发

在线CSS3压缩美化格式化

入门小站

工具

网易数帆Curve加入PolarDB开源数据库社区

阿里云数据库开源

数据库 阿里云 开源数据库 polarDB

调查:区块链游戏玩家将玩NFT游戏视为一份潜在的全职工作

CECBC

全球央行积极推进CBDC 俄罗斯制裁或成催化剂?

CECBC

Rust的迭代器

Shine

rust 迭代器

国际自主智能机器人大赛强势来袭,NAACL同声传译任务等你来战

百度大脑

如何用建木CI实现前端代码自动格式化

Jianmu

前端 代码管理 格式化 prettier 建木CI

好评不断的文化纪录片《中国》,背后的“剪刀手”竟是它?

百度大脑

JVM自定义类加载器在代码扩展性的实践

Java工程师

JVM 代码 类加载器 实践 #java

失败案例之安全抓包测试

网络安全学海

网络安全 信息安全 渗透测试 安全漏洞 网络抓包

Flash退出历史舞台后,Web端3D会迎来怎样的发展?

Orillusion

WebGL 3D渲染 3D模型 Flash webgpu

2022最新IntellJ IDEA的mall开发部署文档

北极的大企鹅

开源 部署与维护 开发者, MAll

SpringBoot接入轻量级分布式日志框架(GrayLog)

Java工程师

程序员 分布式 Web spring-boot

北京大学董豪老师解密人工智能开发工具的过去与未来

OpenI启智社区

人工智能 开发工具 启智社区 北京大学

Linux之alias命令

入门小站

Linux

Apache DolphinScheduler&ShenYu(Incubating)联合 Meetup,暖春 3 月与你相约!

白鲸开源

大数据 开源 工作流调度 Apache DolphinScheduler

Redis集群架构剖析(2):槽位

非晓为骁

redis集群 slots 分布式,

架构实战营模块九-毕业设计-电商秒杀系统

Jude

架构实战营

深度关注 | 元宇宙如何改写人类社会生活

CECBC

golang里的一些奇奇怪怪的东西

不登山的小鲁

golang Go 语言

程序员的工作就只有写代码么?

程序员鱼皮

经验

重新刷新你对Redis集群的理解

Java工程师

数据库 复制 数据共享 集群 redis'

Redis Pipeline原来是这么用的

Java工程师

数据库 程序员 代码 pipeline redis'

第三空间娱乐体验重构:AITO 问界 M5雕刻的七宝楼台

脑极体

毕业总结

Geek_93ffb0

「架构实战营」

在线JSON转HTML工具

入门小站

工具

Java 中的静态字段和静态方法

踏雪痕

Java 3月程序媛福利 3月月更

数据库版本管理最佳实践_数据库_邵思华_InfoQ精选文章