9

在这里和周围阅读了几篇文章后,我意识到开发团队中的数据库版本控制实际上非常重要。

dump whole database到现在为止,每次有更新时我一直使用一个简单的,如果只有一个表被更改,有时我们可以通过转储单个表然后重新导入来逃脱。不是最好的,但效果很好,对于附加更改,我们还没有遇到任何问题。

现在,我.mwb (Mysql Workbench diagram)在我正在处理的项目的 git 存储库中保存了一个文件。然后我还使用dbv forschema management和 git,每个分支都根据项目命名,并且运行良好。这使我能够对原理图更改进行版本化,并能够恢复或回滚。

但是,表中包含的数据呢?如何保持这种状态?也许我最好还是坚持旧方法。我了解具有相同数据库结构但数据不同的项目,这很好,但是具有需要版本控制和管理的特定数据库数据的站点呢?

另外,需要更改数据库的已部署站点的基础又如何呢?这怎么可能是无缝的。有些人建议使用更新/更改脚本,并且可以很好地使用默认值等。但是,如果我在一个网站平台上进行了更改,需要更改每个网站数据库并保持数据完整,该怎么办?

4

2 回答 2

1

我主要从事业务应用程序开发和配置管理。您的问题代表了这种环境中的挑战;例如,当您升级 Microsoft Word 时,您不需要立即将所有文档从 doc 更改为 docx。并且文档甚至具有更简单的结构一个完整的关系数据库。

商业应用程序并非如此;用户跳过版本,对数据模型进行未经授权的更改,系统需要继续运行并提供正确的数字......

我们为自己的应用程序(最大的一个像 600 个表)使用了一个包括分支/合并的自行开发的 CASE 工具,但该方法也可以手动完成。

版本控制数据模型

数据模型可以结构化的方式写下来。例如,作为表格内容(CSV 加载到带有元数据的表格中)或作为检测正在使用的版本并在缺失时添加列和表格的代码,包括非平凡的迁移。

这甚至允许多个用户同时更改数据模型。

当您使用自动检测时(例如,我们使用名为“verify_column”而不是“add_column”的调用),这甚至可以实现独立于客户开始升级的版本号的平滑迁移。这样的过程分析要更改的表并发出正确的 DDL,例如alter table t1 add col1 number not null当列丢失或alter table t1 modify col1 not null列已经存在但可以为空时。

对于 Oracle 和 SQL Server,我可以为您提供一些示例过程。在 MySQL 中,我将使用客户端语言对此进行编码,最好是独立于操作系统,以允许安装在 Windows 和 Linux 上运行。当你有这方面的经验时,也许会使用 Apache Ant。

版本控制数据

我们将表格分为四类:

  • R:参考数据;应用站点在实际使用系统之前必须提供的数据。例如,总帐科目代码。参考数据在上线后很少更改,并且不会持续增长。内容反映了使用该应用程序的站点的商业模式。
  • T:交易数据;网站在使用应用程序期间注册、更改和删除的数据。例如,总帐分录。交易数据从 0 开始持续增长。当公司收入翻倍时,交易数据也会翻倍。
  • S:种子数据;数据不是由用户在网站上维护,而是由开发方提供和维护。本质上,这是将代码转换为数据。例如,“F”代表“女性”。种子数据中的错误可能导致系统错误。
  • O:其余的(理想情况下不需要,因为它们是技术性的,但有些系统需要临时表 A 或临时表 B)。

“S”类表(种子数据)的内容置于版本控制之下。我们通常在案例工具中将这些注册为元数据,然后命名为“数据集”,但您也可以使用 Microsoft Excel 甚至代码。

例如,在 Excel 中,您将有一个种子数据行列表。在 A 列中,您可以输入一个 Excel 函数,该函数=B..&"|"&C..& "|" & ...将所有内容连接起来并使其适合加载器工具加载。

例如,在代码中,您可能会有如下调用:

verifySeed('TABLE_A', 'CODE', 'VALUE')

Excel 有点难以控制版本控制,允许多个用户同时更改内容。使用代码的方法非常简单。

请记住还要添加功能以删除过时的种子数据。例如,通过明确列出过时的种子数据或自动删除表中存在但上次安装未触及的所有种子数据。

于 2014-01-09T15:04:07.013 回答
0

您需要在与您的代码版本同步的数据模型上保留事务日志。对于每个添加信息的更新(即一个新字段),您可以简单地输入诸如“ALTER TABLE x ADD COLUMN y ...”之类的语句,并在更新脚本中提供一个默认值(可能带有一个函数)。以及用于更新脚本的“ALTER TABLE x REMOVE COLUMN y ...”。在截断表中的信息之前,您需要导出数据。您可以将转储的表数据转换为反向事务的 SQL,以便您可以使用这些添加缺少的信息。

您可以使用数据模型中的“日志”表来使用表示应用脚本的简单序数来跟踪这些事务。每当安装该软件时,它可以比较这些数字以创建要播放的事务列表,以将数据库从状态 N 移动到状态 X,向后或向前移动,而不会丢失任何数据!

于 2014-01-21T22:09:55.340 回答