【问题标题】:Is a ORM the right tool to use for migrating data?ORM 是用于迁移数据的正确工具吗?
【发布时间】:2013-06-12 20:03:12
【问题描述】:

背景

我们正在升级旧版导入工具,它所做的是将数据从连接到 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 |
+-----------+-------------+--------------------------------------+

Dest.dbo.Cities

+--------------------------------------+----------+-------+
|               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 |
+-----------+-------------+--------------------------------------+

Dest.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,但我部门中没有人熟悉它 and my supervisor feels 让每个人都学习另一种语言需要太多时间和资源维护它(这个迁移工具是在我在另一个问题中谈到的步骤之后运行的)。

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

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

我应该寻找什么样的工具来满足这些要求?

我问这个问题是因为我不认为 ORM 是正确的做法,但我不确定应该改用什么。除了 SSIS(因为太不同而被取消了),我不知道除了使用硬编码的 SQL 语句之外还能做什么,但这打破了我心中的“易于更改”的要求。

【问题讨论】:

  • 不,ORM 听起来并不适合将数据从一种模式转换为另一种模式。
  • @MattBall 我不这么认为,这就是促使我提出这个问题的原因。
  • 嗯,我学到了一个新术语 ETL(提取变换负载),这就是我正在尝试做的事情,这些是我需要寻找的工具。
  • 我会争取让 SSIS 重新回到桌面上,脚本组件可以在 C# 中,界面使用 Visual Studio,大部分东西都是拖放。
  • 我同意 @axawire 的观点,对于已经熟悉 C#、Visual Studio 和基本数据库的人来说,SSIS 并不是一个巨大的学习曲线。唯一的“语言”是脚本对象,可以在 C# 中完成。对于高级用途,有更多的学习曲线,但对于简单的 ETL,学习起来并不难。

标签: c# .net sql nhibernate orm


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你有什么建议可以让我参加 SSIS 速成课程,我可以证明它是否容易让其他人学习?
  • 除了 SSIS“已被取消”。
  • @Jason 好吧,如果我能证明 SSIS 像 Kzest 所说的那样简单,也许我可以尝试说服我的老板使用它(我上次尝试是在一月份,我也在与暂存数据库的数据导入器,也许数据库到数据库会更容易说服他。)
  • @ScottChamberlain 数据库到数据库:aspfree.com/c/a/ms-sql-server/… MySQL 示例:devart.com/dotconnect/mysql/docs/Tutorial_SSIS.html
【解决方案2】:

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

刚刚完成了一个类似的项目,用它来将数据从一个服务器移动到另一个服务器,它的工作和表现都非常出色。

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

【讨论】:

    【解决方案3】:

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

    鉴于 SSIS 不在讨论范围内( 如果它是一个选项,那么它是正确的选择),我会考虑查看 Rhino ETL。非常灵活,你可以使用SqlBulkCopy ,显然你应该考虑在这里做。是open source,太开机了。

    【讨论】:

      猜你喜欢
      • 2014-10-10
      • 2020-10-02
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 2021-11-06
      相关资源
      最近更新 更多