9

我正在从事的项目正在尝试提出一种解决方案,使数据库和代码变得敏捷,并且能够一起构建和部署。

由于应用程序是代码加上数据库模式和数据库代码表的组合,因此除非您拥有与代码一起进行版本控制的数据库,否则您无法真正拥有应用程序的完整构建。

我们还没有想出一个好的敏捷方法来进行数据库开发以及敏捷/scrum 环境中的代码。

以下是我的一些要求:

  1. 我希望能够拥有一个与系统的完整构建相对应的 svn 版本号。
  2. 我不想将二进制文件签入数据库的源代码控制。
  3. 开发人员需要能够将代码提交到持续集成服务器并一起构建整个系统和数据库。
  4. 必须能够自动部署到不同的环境,而无需在构建服务器上进行原始构建以外的重建。

(更新)我将在此处添加更多信息以进一步解释。

没有 OR/M 工具,因为它是一个包含大量代码的遗留项目。我已经阅读了敏捷数据库设计信息,并且孤立的这个过程似乎有效,但我正在谈论将它与主动代码开发相结合。

这里有两个场景

  1. 开发人员签入需要更改数据库的代码更改。开发人员应该能够同时签入数据库更改,以便自动构建不会失败。

  2. 开发人员检查数据库更改,这应该会破坏代码。自动化构建需要运行和失败。

最大的问题是,这些东西如何同步起来。没有“签入数据库更改”之类的东西。现在,数据库更改的应用程序是一个人必须做的手动过程,而代码更改是不断进行的。它们需要一起制作并一起检查,构建系统需要能够构建整个系统。

(更新 2)这里再添加一个:

你不能降低生产,你必须修补它。重建整个生产数据库是不可接受的。

4

5 回答 5

3

您需要一个构建过程来构建数据库模式并添加任何必要的引导数据。如果您使用的是支持模式生成的 O/R 工具,那么大部分工作都会为您完成。任何不是工具生成的,都保存在脚本中。

对于持续集成,理想情况下,“构建”应该包括数据库的完全重建和静态测试数据的重新加载。

我刚刚看到你没有 ORM 工具......这是我们在我曾经工作过的公司所拥有的

db/
db/Makefile (run `make` to rebuild db from scratch, `make clean` to close db)
db/01_type.sql
db/02_table.sql
db/03_function.sql
db/04_view.sql
db/05_index.sql
db/06_data.sql

安排然而必要......每个*.sql脚本都将运行以生成结构。开发人员每个人都有数据库的本地副本,任何数据库更改都只是另一个代码更改,没什么特别的。

如果您正在处理已经具有构建过程(Java、C、C++)的项目,这是第二天性。如果您以根本没有构建过程的方式使用脚本,这将是一些额外的工作。

于 2008-12-12T23:07:29.003 回答
2

“没有“检查数据库更改”之类的东西。”

实际上,我认为您可以检查数据库更改。诀窍是停止使用简单的——未版本化的——模式和表名。

如果您将版本号作为一个整体(或表)附加到模式,那么您可以轻松地进行版本签入。

请注意,数据库版本没有花哨的主要-次要版本。应用软件中的“主要”版本通常反映了基本的兼容性水平。该基本级别的兼容性应定义为“使用相同的数据模型”。

所以应用程序版本 2.23 和 2.24 使用数据库模式的版本 2。

版本签入有两个部分。

  1. 新表。例如,MyTable_8 是给定表的版本 8。

  2. 迁移脚本。例如 MyTable_8 包括一个 MyTable_7 到 MyTable_8 脚本,它移动数据,提供默认值或任何需要的东西。

有几种使用方法。

  • 兼容升级。当仅更改表以添加允许空值的列时,版本号保持不变。

  • 不兼容的升级。当添加非空列(需要初始值)或更改表的基本形状或列的数据类型时,您正在进行重大更改并且您有一个迁移脚本。

请注意,旧数据会一直保留,直到在更改过程结束时明确删除。您必须运行测试以确保一切正常。

您可能有两部分的删除-首先重命名,然后(一周后)最终删除。

于 2008-12-15T01:44:31.647 回答
1

确保您的 O/R-Mapping 工具能够根据其默认配置构建必要的表,并添加缺失的列。这应该涵盖 90% 的案例。

其他 10% 是

  • 处理插入数据后添加的列的缺失值
  • 为需要在版本之间进行更多基本更改的罕见情况编写数据迁移脚本
于 2008-12-12T23:00:50.560 回答
1

请参阅 DBDeploy 开源项目。http://dbdeploy.com/

它允许您签入数据库更改脚本。然后它将生成一个合并的更改脚本,包括所有尚未应用的更改。该站点很好地描述了该过程。

该项目基于之前提到的 Martin Fowler 文章中的技术。我参与了马丁这篇文章所依据的项目。DbDeploy 是我们使用的过程的一个很好的实现。

于 2008-12-15T02:08:40.787 回答
1

Ruby on Rails的迁移工具正是为了满足这种需求而开发的。如果您的应用程序没有使用 Rails,您可能会查看是否已将相同的概念移植到您选择的框架中,或者阅读它并确定是否可以编写一些实现相同功能的快速脚本。

于 2009-11-18T21:56:33.380 回答