【问题标题】:merging two similar database into one DB将两个相似的数据库合并到一个数据库中
【发布时间】:2011-11-11 04:52:05
【问题描述】:

我需要将两个相似的数据库合并为一个 例如

我有两个不同的应用程序版本 1.0 数据库看起来像这样

company 1 table

    id Name Address  state
    1  aaa  street2  CA
    2  bbb  street2  CA   


company 2 table

    id Name Address  state
    1  ccc  street2  CA
    2  ddd  street2  CA   

现在我想将两个不同的数据库合并为一个 i 应用程序版本 2 应用程序版本 2 表如下所示

id company_id name Address state
1   c1        aaa  street2  CA
2   c1        bbb  street2  CA      
3   c2        ccc  street2  CA
4   c2        ddd  street2  CA     

在两个版本中,id 列都是自动递增的标识列

这里的问题是,如果我将数据移动到第 2 版表中,我的 id 将发生变化,如果发生如何修改引用此 id 的子表数据。

是否有任何工具可以随时处理这个问题,或者我们需要编写自己的脚本来完成这个我有大量这样的表可以从版本 1 迁移到版本 2

我们将不胜感激。

谢谢。

【问题讨论】:

  • 这是一次性迁移还是会定期进行?是针对现有系统还是新系统所需的功能?如果它是一次关闭,我只会编写一个脚本并重新键入 id 列。

标签: sql database migration


【解决方案1】:

由于两个表中的 ID 都是身份,因此您可以安全地拥有来自两家公司的具有相同 ID 的客户:我建议您为 App2 创建一个新 ID,这也可以是身份,并存储用户的旧 ID,以便保持与其他表的关系。例如,您的新表必须如下:

NEW ID  old_id company_id name Address state
100     1       c1        aaa  street2  CA
101     2       c1        bbb  street2  CA      
102     1       c2        ccc  street2  CA
103     2       c2        ddd  street2  CA  

不知道有没有工具可以自动完成。

【讨论】:

    【解决方案2】:

    此过程的难易程度完全取决于所设置架构的质量。让我们从最差到最好:

    身份列由用户使用。

    这是最坏的情况,它违反了关于代理键(在本例中为 Id 列)的基本规则:它们应该对用户隐藏。如果允许用户查看、使用、打印输出、在物理项目上标记身份值,那么您的任务会困难得多。唯一合理的解决方案是添加一个指示系统来源的列,并修改标识列上的唯一或主键约束以包含这个新列。这样,您的数据将如下所示:

    id   company_id  name       address     state
    1    c1          aaa        street2     CA              
    2    c1          bbb        street2     CA
    1    c2          ccc        street2     CA              
    2    c2          ddd        street2     CA

    使这个解决方案如此糟糕的是你不能再使用 Identity 属性,所有业务层和接口代码必须更改以在将值保存到此表时将 company_id 作为参数传递,并且必须审查任何报告以确定它们是否会破裂或如何破裂。此外,必须更改所有外键关系以及写入这些表的所有代码。真是一团糟。

    用户未使用身份列,但没有业务密钥。

    我所说的“业务键”是对表中一组列的唯一约束,而不是充当代理键的 Identity 列。这违反了关于代理键的基本规则,而数据整合是它真正引起人们注意的一个领域。最简单的解决方案是在保存之前系统PK的表中临时添加一列,并使用它来导入相关表。

    Alter Table CompanyName
        Add Column LegacyPk int null 
    GO
    Insert NewTable( company_id, name, address, state, LegacyPk )
    Select company_id, name, address, state, id
    From company_2.Table
    
    Insert SomeChildTable(....
    Select ...
    From NewTable
        Join OldChildTable
            On OldChildTable.ParentId = NewTable.LegacyPk
    

    用户未使用标识列且存在业务密钥。

    这是最好的情况。在这种情况下,代理键按原样使用,您可以使用业务键进行连接:

    Insert NewTable( company_id, name, address, state )
    Select company_id, name, address, state
    From company_2.Table As C2
        Left Join company_3.Table As C1
            On C1.KeyCol = C2.KeyCol
    Where C1.KeyCol Is Null
    

    【讨论】:

      【解决方案3】:

      在两个表中的密钥标识中,您必须使用旧 id。因为您需要在不使用旧 id 的情况下保护所有数据,所以您无法检索旧值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-08
        • 1970-01-01
        • 2018-06-23
        • 1970-01-01
        • 2012-03-18
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多