【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

数据库版本管理最佳实践

  • 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:364803
用户头像

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

关注

评论

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

Java | static和不可变关键字final

陌上

编程 Java、 10月月更

代码规范以及commit扫描代码

甜点cc

前端 代码规范 React Native 10月月更

纵享丝滑,华为云CDN加速服务的极致体验

路过的憨憨

华为

鸿蒙开发实例|对象关系映射数据库

TiAmo

华为 华为云 10月月更

华为云桌面,随时随地助力企业轻松办公

科技怪授

华为云 桌面云 云桌面

个人和初创企业想要搭建网站,如何挑选一台便宜合适的云主机?

京东科技开发者

云主机 网站搭建 测评 性能评测

启科量子 QuBranch 正式开源

启科量子开发者官方号

量子计算 编程工具 启科量子

Go | 基本数据类型的相互转换

甜点cc

golang 学习笔记 10月月更

LF AI & Data AICon 2022—AI工程化回顾

星策开源社区

机器学习 微软 AI工程化 人工智能’ AICon

汽车云服务应用场景系列报告——自动驾驶仿真测试云服务行业图谱

易观分析

云服务 汽车

华为云网站安全解决方案,站在企业安全的最前沿

科技之光

从 Traefik 到 APISIX,汽车智能计算平台公司「地平线」在 Ingress Controller 的探索和实践

API7.ai 技术团队

开源 AI 网关 APISIX Ingress Controller

现代化SDLC与架构评审

I

安全架构设计 SSDLC

启科量子可视化量子编程——QuComposer

启科量子开发者官方号

量子计算 可视化开发 启科量子

校园大赛 | 数云融合 叩响未来——神州数码集团2022年校园大赛火热开启!

科技热闻

CDC ChangeLog Stream实时流入CLICKHOUSE最佳姿势

水滴

实时数仓 Clickhouse CDC Flink CDC Debezium

跨库分页

zarmnosaj

10月月更

独家!【隐秘而伟大】这群神秘的程序员,干了票大的

博文视点Broadview

企业如何从0到1搭建BI系统

葡萄城技术团队

BI 仪表盘识别 可视化数据

一文带你更了解Java中的方法

陌上

Java、 编程、 10月月更

鏖战 48 小时,TiDB Hackathon 都诞生了哪些硬核创意?

PingCAP

TiDB

使用Python的requests库爬取网页表情包

何极光

Python 10月月更 爬虫案例

JavaScript刷LeetCode心得

js2030code

JavaScript LeetCode

华为云加固企业网站安全堤坝,助您业务稳定流畅

科技之光

闻道Go语言,6月龄必知必会

有态度的马甲

华为云ECS,如何赋能企业开展云上业务?

路过的憨憨

华为

Java的一维数组和二维数组

陌上

数据结构 Java、 10月月更

「云渲染」渲染农场的架构原理、特点

Finovy Cloud

架构 原理 云渲染 云渲染农场

覆水也可收, 破镜可重圆! EasyRecovery帮你轻松找回丢失数据

淋雨

数据恢复 EasyRecovery

换行符不一致问题终极处理方案——gitattributes

甜点cc

JavaScript 前端 代码规范 10月月更

华为云桌面,助力企业扬帆起航

科技怪授

华为云 桌面云 华为云桌面

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