使用各种整数类型作为主键

时间:2014-08-28 07:51:53

标签: database-migration ssis

我是SSIS的新手,我正在尝试将旧数据库数据转换为新的数据库模式。我已经玩了一段时间,但我无法理解如何在2个或更多目的地来源之间保持完整性。例如,我在旧数据库(建筑物项目)中有一个项目表,其中包含以下信息:

+------------------------+
+ TABLE: Projects        +
+------------------------+
+ ProjectID (PK)         + (primary key of project)
+ ProjectCode            + (unique code of the project)
+ ProjectBuildingName    + (name of the building for this project)
+ ProjectCompletionDate  + (date when the project has been completed)
+ AddressLine1           + (AddressLine, Postalcode and City of the building)
+ Postalcode             +
+ City                   +
+------------------------+

在我的新数据库设计中,我想将[Projects]的数据分成表:[Projects],[Projectbuildings]和[Addresses]。

在SSIS中,我选择旧的。[Projects]表作为源,并将这些表映射到相应的源。在此之前,我转换数据并进行多播,如下图所示:

enter image description here

在此流程中,我将我想要的数据迁移到我想要的表中,但这些表将不具有FK完整性。例如,我的新设计看起来像这样:

+--------------------------+
+ TABLE: Projects          +
+--------------------------+
+ ProjectID (PK)           +
+ ProjectCode              +
+ ProjectCompletionDate    +
+ ProjectBuildingID (FK)   +
+--------------------------+

+--------------------------+
+ TABLE: ProjectBuildings  +
+--------------------------+
+ ProjectBuildingID (PK)   +
+ ProjectBuildingName      +
+ AddressID (FK)           +
+--------------------------+

+--------------------------+
+ TABLE: Addresses         +
+--------------------------+
+ AddressID (PK)           +
+ Country                  +
+ City                     +
+ Postalcode               +
+ AddressLine1             +
+--------------------------+

(P.S。忽略图中的第4列,这将是[Contacts]列。这是一个有限的数据示例,可以帮助我指出我的问题)

当我现在将1映射为1时,我确实在正确的表和列中传输数据,但是我如何确保所有表的关系也以正确的方式相互关联?

我已经看到其他2个stackoverflow帖子或多或少相同的问题,但我无法解决它。我希望有一个更明确的答案。

注意:我正在使用SQL Server 2008数据中心+集成服务与Microsoft Visual Studio 2008.我正在尝试从旧数据库迁移到新数据库,两者都在同一个SQL Server 2008上。

修改 我在How do I split flat file data and load into parent-child tables in database?找到了很好的解释。

我设法将一个表拆分为两个表(一个子表和一个父表),插入父表,然后查找插入的ID,并使用该ID插入子表。当此子项也是第3个表的父项时出现问题。我认为为第二个孩子运行相同的流程将是相同的:查找child1的插入ID的ID,然后在插入child2时使用它。出于某种原因,它并没有真正起作用。

修改 好的,这是真实的例子。我正在尝试将以下列迁移出旧数据库(全部在1个表中):

[OLDDB].Customersurname        ---->     [People].Surname
[OLDDB].Customerforename       ---->     [People].Forename
[OLDDB].Customergender         ---->     [People].bGender
[OLDDB].Customeraddressline    ---->     [Addresses].AddressLine1
[OLDDB].Customerpostalcode     ---->     [Addresses].Postalcode
[OLDDB].Customercity           ---->     [Addresses].City
[OLDDB].Customerphone          ---->     [AdditionalAddresses].Phone1
[OLDDB].Customeremail          ---->     [AdditionalAddresses].Email

enter image description here

现在我设法插入[AdditionalAddresses]和[Addresses]及其相应的链接(并将Country和AddressTypes留空)。我的问题是[Contacts]表,它只包含[Address] .AddressID和boolean,它告诉[联系人]是个人还是公司。我认为,如果[People]和[Companies]都将[Address] .AddressID包含为FK,它就可以工作。

所以我到目前为止所做的是:

  1. 迁移到[AdditionalAddresses](完成)
  2. 查找父[AdditionalAddresses]键(DONE)
  3. 根据[AdditionalAddresses](DONE)的查找键导出到[地址]
  4. 接下来我会:

    1. 导出到[人物],这将创建新的唯一ID,我将不得不关闭FK约束
    2. 查找父[人物]键
    3. 根据[人物]
    4. 的查找键导出至[联系人]

      然后是最后一部分,用属于那个人的[Address] .AddressID更新[Contacts]表...

1 个答案:

答案 0 :(得分:1)

要确切满足您的需求的几个问题:

  • 是不是单手操作?
  • 目标表是空的吗?
  • 你做了很多数据转换/转换吗?

同时调查的两个选项:

  • 最简单的解决方案之一是将数据流分成四个不同的数据流,按优先约束排序。在第一个中,您提取并加载 Projects 。在第二个中,您提取 ProjectBuildings ,查找 Projects 表以获取相应的ProjectID,然后插入它。
  • 另一种选择是使用临时表,但对于你提交的案例来说,这似乎有些过分。