Answers:
我使用基于代码的数据库迁移工具,并将迁移代码保留在源代码管理中。
通过将时间戳记用作版本号,大多数数量的开发人员都可以随意随意添加迁移,我们可以放心地对数据库的任何副本运行迁移工具。
我曾经在版本控制下使用SQL脚本,但是发现基于代码的方法要容易得多,因为它们都位于一个逻辑“点”中,并且能够用一个命令执行所有需要的脚本。
在版本控制和持续集成下构建脚本以对其进行验证
对我有用的一种方法是让每个开发人员使用他们自己的架构,他们可以按照自己的意愿进行工作。他们的模式是可破坏的,并填充了由所有开发人员贡献的版本控制脚本集中的测试数据。
每晚进行的持续集成构建采用了所有脚本的最新版本,并尝试从中构建一个内聚的测试数据库。然后,该应用程序进行了一系列集成和功能测试,以验证当前架构是否与当前发行候选版本一致。
在走这条路之前,已经进行了相当扎实的数据库设计,并且DBA始终密切注意事情,以防止开发人员对非规范化和其他恐怖感到发狂。
版本控制在这里非常有用,因为对脚本的更改很明显。我们还利用数据库VERSION
表来识别数据库的整体状态。这是一个简单的整数序列,未链接到任何特定的应用程序。
总体而言,它运行良好,意味着开发人员不再担心更改持久性层,因为他们可以始终回滚自己的模式而不影响其他模式。
除了将模式和其他SQL脚本保持在版本控制下之外,另一种便捷的做法是在实际的DB中维护“模式版本”表。
create table schema_migrations (
`appliedAt` timestamp not null default CURRENT_TIMESTAMP,
`migrationCode` varchar(256) not null,
`extraNotes` varchar(256),
primary key (`migrationCode`)
)
Doctrine有一个很棒的迁移工具:http : //www.doctrine-project.org/documentation/manual/1_2/en/migrations,最好的部分是它们是自动生成的或可以很容易地手工编码。