ORM是用于迁移数据的正确工具

本文关键字:工具 数据 用于 迁移 ORM | 更新日期: 2023-09-27 18:18:50

Background

我们正在升级旧版导入工具,它的作用是将数据从附加到 SQL Server 的一个数据库移动到同一服务器上的第二个数据库,该数据库具有不同的架构,在此过程中执行转换和映射。

下面是一个有助于解释正在发生的事情的示例

假设源数据库有一个名为 Client_Info 的表,目标表有两个名为 ClientsCities 的表

Source.dbo.Client_Info

+-----------+----------+----------+-------+
| FirstName | LastName |   City   | State |
+-----------+----------+----------+-------+
| John      | Smith    | Richmond | VA    |
| Jeff      | Walters  | New York | NY    |
+-----------+----------+----------+-------+

Dest.dbo.Clients

+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
+-----------+-------------+--------------------------------------+

城市

+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
+--------------------------------------+----------+-------+

合并后,我希望目的地看起来像这样

Dest.dbo.Clients

+-----------+-------------+--------------------------------------+
| FirstName |  LastName   |               CityGuid               |
+-----------+-------------+--------------------------------------+
| Scott     | Chamberlain | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| John      | Smith       | 07d954bf-3214-4df4-b640-48c27db2b1ed |
| Jeff      | Walters     | 98a75f88-eeaa-49ba-b464-2ac988a7b093 |
+-----------+-------------+--------------------------------------+

城市

+--------------------------------------+----------+-------+
|               CityGuid               | CityName | State |
+--------------------------------------+----------+-------+
| 07d954bf-3214-4df4-b640-48c27db2b1ed | Richmond | VA    |
| 98a75f88-eeaa-49ba-b464-2ac988a7b093 | New York | NY    |
+--------------------------------------+----------+-------+

目前它是一个 VB6 项目,我们只使用硬编码的 SQL 语句来随机排列临时 #t 表的记录,并根据需要使用现有值或新值填充 GUID 列。

从那以后,我们搬到了C# .NET商店,并且认为是时候将导入工具更新为C#了,因为当我们的软件新版本发布时,当目标数据库更改时,对该工具进行更改变得越来越困难(这是一场战斗,只是为了安装Visual Studio 6并在Windows 8上工作(。

我的问题

像NHibernate这样的ORM工具是适合这项工作的工具吗?我们以前都没有真正使用过ORM(我们不是编写与新数据库对话的软件以供日常使用的开发团队,我们只是负责将旧数据库迁移到新数据库,"真正的开发人员"告诉我们他们对每个版本进行的模式进行了哪些更改(。我不太确定是否要使用ORM,因为我认为ORM用于向客户端CRUD操作之类的事情,而不是像这样的服务器数据库迁移。

我认为这是"正确"的方法是使用 SSIS,但我部门中没有人熟悉它,我的主管认为让每个人都学习另一种语言来维护它需要花费太多时间和资源(这个迁移工具是在我在我的另一个问题中谈论的步骤之后运行的(。

我正在寻找的主要内容是一种进行此迁移的方法:

  • 海量数据
  • 允许在传输过程中设置某些列(如重用外键 GUID(
  • 易于随着目标数据库架构的更改而更改
  • 最好用 C# 或 SQL 完成。

对于这些要求,我应该寻找什么样的工具?

我问这个问题是因为我认为 ORM 不是正确的做法,但我不确定我应该使用什么。除了SSIS(由于差异太大而被取消(之外,除了使用硬编码的SQL语句之外,我不知道该怎么做,但这打破了我脑海中的"易于更改"的要求。

ORM是用于迁移数据的正确工具

SSIS是做到这一点的完美工具,毫无疑问。

ORM 仅适用于应用程序中的 CRUD 操作(如您正确提到的(,并且很有可能引起对大数据传输的严重关注。大多数ORM甚至不建议用于涉及大量行的CRUD操作,忘记数据库级数据迁移。ORM 主要用于简化软件应用程序和数据库之间的持久数据连接的编码。

另一方面,SSIS 是在数据库、数据仓库级别安全地为 ETL(提取转换加载(制作的。与存储过程相比,迁移的发生频率也明显更高。

我想补充的另一件重要事情是,SSIS非常简单(根据我的经验(。大多数操作涉及在 Visual Studio 设计器上拖放 ETL 控件,然后在配置屏幕上配置数据类型。除非你真的喜欢编写代码,或者在极其复杂的场景中,否则你最好只写代码和一些数据类型的转换(T(片段。

我理解,老板目前认为这是不必要的投资。然而,SSIS是Microsoft在数据仓库领域的王牌。查看您当前的需求,这正是您的组织所需要的。根据我们组织的经验,只要Microsoft活着,这项投资就会证明每一分钱都是值得的。

我也不会使用成熟的ORM,但是像Dapper这样的微型ORM非常适合这样的任务(以及其他事情(。超快的速度,如果您熟悉 TSQL 和 c#,那么您可以非常接近金属运行它,以实现高性能和易用性,那么使用起来很容易。(您可以在 15 分钟内提高工作效率(

刚刚完成了一个类似的项目,使用它将数据从一个服务器移动到另一个服务器,它像冠军一样工作和执行。

https://code.google.com/p/dapper-dot-net/

ORM绝对不是正确的工具,正如您正确指出的那样,它们适用于OLTP应用程序。

鉴于SSIS不在桌面上(如果这是一个选择,这是正确的选择(,我会考虑看看Rhino ETL。非常灵活,您可以使用SqlBulkCopy,显然您应该考虑在这里这样做。它是开源的,也是启动的。