3

背景

我们正在升级旧版导入工具,它所做的是将数据从连接到 SQL Server 的一个数据库移动到同一服务器上的第二个数据库,该数据库具有不同的模式,在此过程中执行翻译和映射。

这是一个示例来帮助解释正在发生的事情

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

Source.dbo.Client_Info

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

目标.dbo.Clients

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

目的地.dbo.Cities

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

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

目标.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 |
+-----------+-------------+--------------------------------------+

目的地.dbo.Cities

+--------------------------------------+----------+-------+
|               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 语句之外还能做什么,但这打破了我心中的“易于更改”的要求。

4

3 回答 3

2

SSIS 是执行此操作的完美工具,毫无疑问。

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

另一方面,SSIS 是为 ETL(提取转换负载)而设计的,在数据​​库、数据仓库级别安全。与存储过程相比,迁移的发生率也显着提高。

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

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

于 2013-06-16T21:55:02.697 回答
2

我也不会使用完整的 ORM,但是像 Dapper 这样的微型 ORM 非常适合这样的任务(除其他外)。超级快,如果您熟悉 TSQL 和 c#,您可以非常接近地运行它以获得高性能和易用性,它使用起来很容易。(你可以在 15 分钟内提高工作效率)

刚刚完成了一个类似的项目,用它把数据从一个服务器移动到另一个服务器,它的工作和表现就像一个冠军。

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

于 2013-06-17T01:46:24.397 回答
1

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

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

于 2013-06-16T21:48:52.313 回答