我继承的当前项目主要围绕一个非标准化表。有一些尝试正常化,但没有实施必要的限制。
示例:在Project表中,有一个客户端名称(以及其他值),还有一个客户端表,它只包含客户端名称[无任何键在任何地方]。 clients表仅用作值池,以便在添加新项目时为用户提供。客户端表或外键上没有主键。
诸如此类的“设计模式”在数据库的当前状态和使用它的应用程序中很常见。我可以使用的工具是SQL Server 2005,SQL Server Management Studio和Visual Studio 2008.我最初的方法是手动确定哪些信息需要规范化并运行Select INTO查询。有没有比个案更好的方法,或者无论如何这可以自动化?
修改 此外,我发现“工单号”不是IDENTITY(自动编号,唯一)字段,它们是按顺序生成的,对每个工单都是唯一的。现有编号也存在一些差距,但都是独一无二的。在迁移之前编写存储过程以创建虚拟行的最佳方法是什么?
答案 0 :(得分:10)
迁移到可用设计的最佳方法?的仔细强>
除非您愿意破坏(并修复)当前使用数据库的每个应用程序,否则您的选项会受到限制,因为您无法更改现有结构。
在开始之前,请仔细考虑您的动机 - 如果您有现有问题(要修复的错误,要做的改进),请继续进行。然而,为了实现其他任何人都不会注意到的改进,使用一个正常工作的生产系统是很有必要的。请注意,这可能对您有利 - 如果存在问题,您可以向管理层指出,解决问题的最具成本效益的方法是以此方式更改数据库结构。这意味着您可以获得对更改的管理支持 - 并且(希望)如果某些内容变成梨形状,则可以进行备份。
一些实际的想法......
一次更改一次 ... 仅一次更改。在继续之前确保每个更改都是正确的。 “两次测量,一次切割”的古老谚语是相关的。
自动化自动化 ...永远不要使用SQL Server Management Studio对生产系统进行“实时”更改。编写一次性执行整个更改的SQL脚本;针对数据库的副本开发和测试这些,以确保您正确使用它们。不要将生产用作测试服务器 - 您可能会意外地针对生产运行脚本;使用专用的测试服务器(如果数据库大小低于4G,请使用在您自己的盒子上运行的SQL Server Express)。
备份 ...任何脚本的第一步都应该是备份数据库,以便在出现问题时你可以回过头来。
文档 ...如果有人在十二个月内找到您,询问他们的应用程序功能 X 是否已损坏,您需要准确更改的历史记录制作数据库以帮助诊断和修复。第一个好的步骤是保留所有更改脚本。
键 ...通常最好将主键和外键保持在数据库中,而不是通过应用程序显示。在业务层面看起来像钥匙的东西(比如你的工作订单号)有一个令人不安的例外习惯。将您的密钥作为具有适当约束的附加列引入,但不要更改现有密钥的定义。
祝你好运!答案 1 :(得分:0)
我想不出一种合理的自动化方法......如果你想让输出有用,一些人的输入是这种重构的关键。
重新下单;假设您希望它继续作为IDENTITY列;你可以填充数据,找到最大的,然后使用ALTER TABLE使其成为IDENTITY?我没有任何TSQL工具可供使用,所以不幸的是我无法测试。或者,只需将其视为自然键。
答案 2 :(得分:0)
此过程的结果将是您: a)一个新的数据库结构,它针对旧结构进行了验证,并针对“实用主义”进行了测试; b)您可能需要编写代码的潜在问题的日志(例如您无法通过转换修复的错误,因为它们需要您的架构中您不想要的让步)
(我可能会注意到,在您选择的脚本/编程语言中编写脚本是有帮助的,而不是在SQL中编写脚本。)
答案 3 :(得分:0)
我建议使用存储过程来帮助翻译过程。
具体做法是:
StoredProcs
帮助程序类来整合数据库访问。答案 4 :(得分:0)
您没有说明是否需要保留当前的应用程序界面,或者您是否计划重写应用程序中的任何查询。
无论哪种方式,我都会游标虽然不是操作查询的首选,但对于这种类型的应用程序非常有用,因为您可以以非常有条理的方式完成任务。这些脚本往往非常易读,当它不能立即工作并且你经历了几次迭代时,这很重要。
答案 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 。