SQL重构 - UniqueIdentifier的唯一名称

时间:2009-07-15 21:37:23

标签: sql refactoring

我正在重构我的数据库以支持升级到我们基于网络的工具。

想象一下,我有四个表:里程碑,类别,技能和PayRates。在旧模式下,这些表中的每一个都只列出了一个名称,该名称是该表的键。

在新架构下,每个表不仅有一个名称,还有一个生成的唯一标识符,作为表的键。

现在,我想象一下,我有一个表任务,其中每个任务由一个名称,一个里程碑,一个类别,一个技能和一个PayRate组成,每个任务都是从它们各自的表中选择的。在旧架构下,此表仅存储名称。在新架构下,此表将存储四个表的ID而不是名称,如下所示:

TaskID  TaskName  MilestoneID  CategoryID  SkillID  RateID

其中TaskID是该任务的生成唯一标识符。

这些表中的每一个当前都包含需要从旧架构传输到新架构的数据。我可以假设任务的四个组件中的每个组件的名称以及任务本身的名称在旧模式中都是唯一的。

我的问题是,将数据从旧架构移动到新架构的最简单查询是什么?

这样做是为了支持在同一个数据库中存储两个单独的里程碑,任务等列表。

1 个答案:

答案 0 :(得分:3)

我会做以下

  • 第0步:备份数据库

  • 第一步:将唯一标识符添加到里程碑,类别,技能和PayRates。这是一个简单的列添加,默认值为下一个id。这将生成现有名称的标识符。

  • 第二步:将四个新列添加到现有任务表中(如果需要,可以将外键添加到源表中),而不删除旧的名称指向列。

  • 第三步:运行(假设旧的名称指向列称为里程碑,技能等)

      update Tasks set MilestoneID = (
                                      select MilestoneID from Milestones where 
                                      Milestone = Tasks.Milestone
                                     ), 
                       CategoryID = (
                                      select CategoryID from Categories where 
                                      Category = Tasks.Category
                                    ),
                       SkillID = (
                                      select SkillID from Skills where 
                                      Skill = Tasks.Skill
                                    ),
                       PayRateID = (
                                      select PayRateID from PayRates where 
                                      PayRate = Tasks.PayRate
                                    )
    
  • 第四步:检查一切是否到位

  • 第五步:从“任务”表中删除旧列,使新字段为非空