【问题标题】:Database Version / Change Control for Data not Schema?数据不是模式的数据库版本/更改控制?
【发布时间】:2014-01-25 11:50:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这对你来说可能很有趣:stackoverflow.com/questions/6409204/…
  • 嗨@Stevie G 是否有任何答案可以帮助您解决问题?如果不是,请在您的问题中添加不成功的内容。当某个答案对您有所帮助时,您是否可以通过单击旁边的空心绿色复选标记来接受它?

标签: mysql sql database git database-versioning


【解决方案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 列中,您可以输入像 =B..&"|"&C..& "|" & ... 这样的 Excel 函数,它将所有内容连接起来,使其适合加载工具加载。

例如在代码中,你可能会有这样的调用:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 2020-04-03
      • 2011-09-25
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多