使用架构比较工具处理架构重构



让我们假设我想将一个表规范化为 2 个表。例如。具有列的表人员电话号码1...电话号码 5 放入表中的"人员"和"电话号码",外键约束从"人员"到"电话号码"并删除"电话号码1"。"人员"表中的"电话号码5"列。 我想保留数据,即电话号码1。PhoneNumber5 应最终成为 PhoneNumber 表中非空数据的每个记录。任何模式比较工具都可以帮助实现这一目标吗? 我检查了SSDT,即使这个"功能"在他们的"路线图"上,它也不支持它

这只是我在日常生活中面临的一个简单的场景,我们一直在使用手工编码的SQL来管理它。在更复杂的方案中,一组表可能会更改为另一组表。在任何工具中是否有一种简单的方法来管理这些类型的模式更改,同时成功管理数据映射?

Peter建议的方法听起来很明智,例如

  1. "创建电话号码"表
  2. 将数据从"人员"表复制到"电话号码"表中
  3. 修改"人员"表以删除"电话号码1-5"列

前提是在停机时间内复制数据所需的时间是可以接受的,可以作为一个"迁移"运行。

如果要复制大量数据并且需要避免停机,则可以添加一个抽象层,以便在一点一点复制数据时从两个位置读取数据。 像这样:

  1. "创建电话号码"表
  2. 部署代码以从"人员"或"电话号码"中读取,并仅写入新的"电话号码"表
  3. 在一段时间内将数据从"人员"批量复制到电话号码
  4. 删除从旧"人员"位置读取的代码
  5. 修改"人员"表以删除"电话号码1-5"列

您将部署更改 1 和 2,运行步骤 3 无论需要多长时间或在安静期间,然后部署更改 4 和 5。

我发现这本书 重构数据库:进化数据库设计 由 Scott Ambler 和 Pramodkumar Sadalage 撰写,在计划这样的更改时非常有用。

在工具方面,如果您使用的是SQL Server(或Oracle),您可能有兴趣查看Red Gate SQL源代码管理。 这可以在单个部署中处理此更改。 完全披露 - 我确实为红门工作。

SQL 源代码管理会自动检测在开发数据库中所做的更改,并将这些更改链接到现有源代码管理系统中。 然后,它可以生成将这些更改同步到另一个数据库所需的 SQL。 有一个名为迁移的高级功能,它允许您将自动生成的更改的子集转换为手动 SQL 步骤,以用于更复杂的方案(如此数据迁移)。 您可以使用迁移来执行本文顶部描述的更改。

在开发数据库中,SQL 源代码管理会自动检测到创建新的电话号码表,以及删除人员表中的电话号码 1-5。 您可以在工具中选择这两个更改,并添加额外的 SQL 以在它们之间复制数据。 它会将其保存为迁移脚本,SQL Compare 将在部署到另一个数据库(例如 QA/生产数据库)时识别并运行该脚本,以及它自动找到的任何其他更改。

这远远超出了我所知道的任何工具的重构。SSDT 可帮助你管理和控制架构,但你需要通过仔细规划和处理来处理此类更改,以避免数据丢失。

如果您正在创建一个全新的数据库来容纳新的结构/数据,那可能会有所不同。但是,当您尝试通过重命名/重新设计现有表来执行此操作时,您需要在计划中非常详细并小心处理它。

您可以通过 SSDT 执行此操作,但我将使用产品的多个版本来执行此操作:1. 使用新结构创建新表。2. 将数据从原始复制到新 - 需要自定义脚本。3. 将原始表重构为类似"Name_Backup"4. 将新表重构为所需的名称。

您可能会在一个项目中执行步骤 1 和 2,也可能在项目的另一个版本中执行步骤 3 和 4。不管你怎么做,这种重构需要更多的规划和手动工作,而不是仅仅重命名列或添加/删除对象的更直接的重构。

最新更新