我应该如何将数据从“糟糕”的数据库设计迁移到可用的设计?

时间:2009-03-21 20:38:22

标签: sql sql-server refactoring rdbms normalization

我继承的当前项目主要围绕一个非标准化表。有一些尝试正常化,但没有实施必要的限制。

示例:在Project表中,有一个客户端名称(以及其他值),还有一个客户端表,它只包含客户端名称[无任何键在任何地方]。 clients表仅用作值池,以便在添加新项目时为用户提供。客户端表或外键上没有主键。

诸如此类的“设计模式”在数据库的当前状态和使用它的应用程序中很常见。我可以使用的工具是SQL Server 2005,SQL Server Management Studio和Visual Studio 2008.我最初的方法是手动确定哪些信息需要规范化并运行Select INTO查询。有没有比个案更好的方法,或者无论如何这可以自动化?

修改 此外,我发现“工单号”不是IDENTITY(自动编号,唯一)字段,它们是按顺序生成的,对每个工单都是唯一的。现有编号也存在一些差距,但都是独一无二的。在迁移之前编写存​​储过程以创建虚拟行的最佳方法是什么?

7 个答案:

答案 0 :(得分:10)

迁移到可用设计的最佳方法?的仔细

除非您愿意破坏(并修复)当前使用数据库的每个应用程序,否则您的选项会受到限制,因为您无法更改现有结构。

在开始之前,请仔细考虑您的动机 - 如果您有现有问题(要修复的错误,要做的改进),请继续进行。然而,为了实现其他任何人都不会注意到的改进,使用一个正常工作的生产系统是很有必要的。请注意,这可能对您有利 - 如果存在问题,您可以向管理层指出,解决问题的最具成本效益的方法是以方式更改数据库结构。这意味着您可以获得对更改的管理支持 - 并且(希望)如果某些内容变成梨形状,则可以进行备份。

一些实际的想法......

一次更改一次 ... 一次更改。在继续之前确保每个更改都是正确的。 “两次测量,一次切割”的古老谚语是相关的。

自动化自动化 ...永远不要使用SQL Server Management Studio对生产系统进行“实时”更改。编写一次性执行整个更改的SQL脚本;针对数据库的副本开发和测试这些,以确保您正确使用它们。不要将生产用作测试服务器 - 您可能会意外地针对生产运行脚本;使用专用的测试服务器(如果数据库大小低于4G,请使用在您自己的盒子上运行的SQL Server Express)。

备份 ...任何脚本的第一步都应该是备份数据库,以便在出现问题时你可以回过头来。

文档 ...如果有人在十二个月内找到您,询问他们的应用程序功能 X 是否已损坏,您需要准确更改的历史记录制作数据库以帮助诊断和修复。第一个好的步骤是保留所有更改脚本。

...通常最好将主键和外键保持在数据库中,而不是通过应用程序显示。在业务层面看起来像钥匙的东西(比如你的工作订单号)有一个令人不安的例外习惯。将您的密钥作为具有适当约束的附加列引入,但不要更改现有密钥的定义。

祝你好运!

答案 1 :(得分:0)

我想不出一种合理的自动化方法......如果你想让输出有用,一些人的输入是这种重构的关键。

重新下单;假设您希望它继续作为IDENTITY列;你可以填充数据,找到最大的,然后使用ALTER TABLE使其成为IDENTITY?我没有任何TSQL工具可供使用,所以不幸的是我无法测试。或者,只需将其视为自然键

答案 2 :(得分:0)

  1. 以您认为应该构建的方式创建新数据库。
  2. 在新数据库中使用“oldId”和“errorDesc”等列创建importError表
  3. 编写一个简单,程序化,易读的脚本,尝试从旧结构中选择一行并将其插入新结构中。如果插入失败,请尽可能将错误记录到importError表中(具体而言,为什么插入失败)。
  4. 运行脚本。
  5. 验证新数据。检查是否有错误记录到importError表中。如果数据无效或存在错误,请重构脚本并再次运行,可能会在必要时修改新的数据库结构。
  6. 重复步骤1-5,直到获得可靠的转换脚本。
  7. 此过程的结果将是您: a)一个新的数据库结构,它针对旧结构进行了验证,并针对“实用主义”进行了测试; b)您可能需要编写代码的潜在问题的日志(例如您无法通过转换修复的错误,因为它们需要您的架构中您不想要的让步)

    (我可能会注意到,在您选择的脚本/编程语言中编写脚本是有帮助的,而不是在SQL中编写脚本。)

答案 3 :(得分:0)

我建议使用存储过程来帮助翻译过程。

具体做法是:

  1. 逐个替换代码中使用的查询和存储过程。作为替换的一部分,直接对存储过程进行写入单元(或集成)测试。考虑使用代码级StoredProcs帮助程序类来整合数据库访问。
  2. 在所有查询都是sprocs之后,您可以使用这些单元测试重构数据库,以确保不会改变预期的行为。
  3. 增加了优势:您将进行这些单元测试,以防止未来出现中断。

答案 4 :(得分:0)

您没有说明是否需要保留当前的应用程序界面,或者您是否计划重写应用程序中的任何查询。

无论哪种方式,我都会

  • 设计新架构
  • 在必要时使用游标编写T-SQL批处理以迁移数据

游标虽然不是操作查询的首选,但对于这种类型的应用程序非常有用,因为您可以以非常有条理的方式完成任务。这些脚本往往非常易读,当它不能立即工作并且你经历了几次迭代时,这很重要。

答案 5 :(得分:0)

您可以使用SQL Server Integration Services(SSIS)作为SQL Server 2005的一部分来帮助您进行迁移。它用于将数据从一种形式传输到另一种形式:

http://en.wikipedia.org/wiki/SQL_Server_Integration_Services http://www.microsoft.com/sqlserver/2005/en/us/integration-services.aspx

答案 6 :(得分:0)

只是添加一个简单的提示。当您在一个A4或A3前面有实体关系图时,正确的标准化将意味着没有多对多的关系。 也请检查此book or at least the site