如何在没有DBA的开发团队中维护共同数据库架构?

9 投票
4 回答
1064 浏览
提问于 2025-04-15 22:13

我很好奇其他人是怎么解决在没有数据库管理员的情况下,如何让10个以上的开发者之间保持数据库变更同步的问题的。简单来说,就是如果有人想对数据库做改动,有哪些策略可以做到这一点?(比如,我创建了一个“汽车”模型,现在我想把相应的数据库结构变更应用到数据库中,等等。)

我们主要使用Python,ORM工具是SQLAlchemy。之前,我们是通过ORM来创建模型的,但最近我们放弃了这种做法,原因有:

  • 我们无法通过ORM来跟踪变更
  • ORM的状态和数据库不同步(例如,主要是索引和唯一约束方面有很多差异)
  • 除非开发者通过邮件向团队记录数据库的变更,否则没有办法审计数据库的变更。

我们解决这个问题的方法是,基本上设定一个“守门人”,他会检查每一个数据库的变更,并把所有被接受的变更记录到一个accepted_db_changes.sql文件中。需要做数据库变更的开发者会把他们的请求放到一个proposed_db_changes.sql文件里。我们会把这个文件提交,当它更新时,我们都会把变更应用到自己开发机器上的个人数据库里。我们不在模型上创建索引或约束,而是直接在数据库上应用这些。

我想知道维护数据库结构的策略有哪些,我们的方法是否合理。

谢谢!

4 个回答

1

你可能会觉得这本书 《重构数据库》 很有帮助,因为它提供了一些管理数据库的通用策略,不仅仅是如何重构数据库。

他的系统假设每个开发者都会有自己的一份数据库副本,还有一个在正式上线前用的通用测试数据库。你的情况在书中描述的算是比较简单的,因为你没有很多不同的应用程序在使用同一个数据库(不过你确实需要有人懂得如何描述数据库迁移)。最重要的是能够根据源代码管理中的信息来构建数据库,并通过小的迁移来描述更改(可以参考@WoLpH的回答),而不是直接在数据库中做修改。如果你至少有 ORM 和数据库之间的测试来检查它们是否仍然同步,那事情会更简单。

1

你试过 SQLalchemy Migrate 这个工具吗?

这个工具是专门用来自动迁移你数据库设计变更的。

2

这个解决方案更多的是管理上的,而不是技术上的 :)

总的来说,规则很简单,项目中应该只有树状的依赖关系: - 项目中应该始终有一个主源文件,和项目的源代码一起存放在版本控制系统里。 - 每次主源文件更新时,所有受其影响的内容都应该自动重新生成,绝对不允许手动干预。如果自动生成不成功,就要修复主源文件或生成工具,而不是手动更新源代码。 - 所有的重新生成工作都应该由更新主源文件的人来完成,所有的更改,包括主源文件的更改,都应该视为一个整体(一次源控制提交,一次构建/部署,所有受影响的环境都包括数据库的更新)。

如果严格遵守这些规则,就能保证结果的可靠性达到100%。

主源文件基本上有三种选择: 1) 数据库元数据,源文件在数据库更新后由某个工具生成,这个工具连接到实时数据库。 2) 源代码,某个工具从特别标注的源代码生成SQL结构,然后在数据库上运行SQL。 3) 数据定义语言(DDL),SQL结构和源代码都是由某个工具生成的。 4) 使用其他描述方式(比如一个文本文件,通过特殊的Perl脚本生成SQL结构和源代码)。

选项1、2、3都是不错的选择,只要你需要的工具存在且价格合理。选项4是一个通用的方法,但必须从项目一开始就应用,并且需要维护几千行用奇怪语言写的代码。

撰写回答