使用模式比较工具处理模式重构

时间:2013-10-29 01:08:22

标签: compare schema sql-server-data-tools

让我们假设我想将表规范化为2个表。例如。一个表具有列PhoneNumber1 ... PhoneNumber5的表人员和PhoneNumbers具有从Person到PhoneNumber的外键约束和从Person表中删除PhoneNumber1..PhoneNumber5列。我想保留数据,即PhoneNumber1..PhoneNumber5应该最终作为一个记录,每个记录用于PhoneNumber表中的非空数据。任何架构比较工具都可以帮助实现吗?我检查了SSDT并且它不支持它,即使这个“功能”在他们的“路线图”

这只是我日常生活中遇到的一个简单场景,我们一直在使用手工编写的SQL来管理它。在更复杂的情况下,一组表可以更改为另一组表。是否有一种简单的方法可以在任何工具中管理这些架构更改,同时成功管理数据映射?

2 个答案:

答案 0 :(得分:2)

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

  1. 创建PhoneNumbers表
  2. 从人员表
  3. 将数据复制到PhoneNumbers表中
  4. 修改人员表以删除PhoneNumber1-5列
  5. 假设在您的停机时间内可以接受复制数据所需的时间,这可以作为一个“迁移”运行。

    如果您要复制大量数据并且需要避免停机,那么您可以添加抽象层以从两个位置读取,同时逐步复制数据。类似的东西:

    1. 创建PhoneNumbers表
    2. 部署代码以从People或PhoneNumbers中读取,并仅写入新的PhoneNumbers表
    3. 在一段时间内将数据从人数复制到PhoneNumbers
    4. 删除从旧人员位置读取的代码
    5. 修改人员表以删除PhoneNumber1-5列
    6. 您需要部署更改1& 2,运行步骤3,无论它需要多长时间或在安静时段,然后部署更改4& 5。

      我发现Scott Ambler和Pramodkumar Sadalage撰写的这本书Refactoring Databases: Evolutionary Database Design在计划这样的改变时非常有用。

      就工具而言,如果您使用的是SQL Server(或Oracle),您可能有兴趣看一下Red Gate SQL Source Control。这可以在单个部署中处理此更改。完全披露 - 我为Red Gate工作。

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

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

答案 1 :(得分:0)

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

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

可以通过SSDT做到这一点,但我会使用该产品的多个版本来做到这一点: 1.使用新结构创建新表。 2.将数据从原始数据复制到新数据 - 需要自定义脚本。 3.将原始表重构为“Name_Backup”之类的内容 4.将新表重构为所需名称。

你可能会做第1步和第2步。 2在一个项目和可能的步骤3& 4在另一个版本的项目中。无论如何,这种重构需要更多的计划和手动工作,而不仅仅是重命名列或添加/删除对象的更简单的重构。