65.9K
CodeProject 正在变化。 阅读更多。
Home

对象/关系映射 (ORM)

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014 年 9 月 22 日

CPOL

5分钟阅读

viewsIcon

12964

对象/关系映射 (ORM)

在回答什么是 ORM 之前,我们将尝试找出为什么需要 ORM?

问题:对象-关系阻抗不匹配

什么是对象-关系阻抗不匹配?

对象-关系阻抗不匹配是指在使用面向对象编程语言或风格编写的程序操作关系型数据库管理系统 (RDBMS) 时,经常会遇到的一系列概念和技术上的困难;特别是当对象或类定义被直接映射到数据库表或关系模式时。 [来自维基]

有很多问题,其中几个重要的包括:

  1. 粒度:有时您的对象模型比数据库中相应的表数量更多。例如:Address
  2. 子类型(继承):继承是面向对象编程语言中的一个自然范例。然而,RDBMS 在整体上并没有定义类似的概念(是的,有些数据库确实支持子类型,但这是完全不标准化的)。
  3. 封装:在面向对象的框架中,给定对象的底层属性不应暴露给除了与其一起实现的接口之外的任何外部接口。然而,对象-关系映射必然会将对象的底层内容暴露给对象实现无法指定的接口进行交互。因此,对象-关系映射违反了对象的封装性。
  4. 数据类型差异

因此,为了在 80 年代末和 90 年代解决这些问题,对象数据库系统和持久化编程语言被引入,但它们失败了。对象数据库系统失败是因为它们对查询、查询优化和执行的支持不够强大,并且它们对事务的支持也不够强大和精心设计。在此之后,ORM 被引入并取得了很大进展,解决了大部分阻抗不匹配问题。

什么是 ORM 以及它有什么用处??

它是对象/关系映射。在设计或创建企业应用程序时,会出现与数据库交互的需求。此时,ORM 通过在数据库和类对象之间创建虚拟映射来帮助我们。因此,如果您数据库中有一个 User 表,并且您希望在代码中使用它。您将创建一个用户实体(具有与数据库列相似属性的用户对象),然后使用该实体以供进一步使用。因此,该实体将是数据库表/视图的精确副本。

在这种情况下,您可以通过一种称为关系的概念来维护外键。您可以拥有以下关系之一:

  1. 一对一
  2. 一对多
  3. 多对一
  4. 多对多

这可以通过在所需的实体中使用 List<XXClass> 来实现。

所以例如:一个 user 可以有 2 个 Address

所以,在 User 类中,您将有一个属性:List<Address>,它将映射到数据库中的 Address 表。

为什么我们需要映射器??

摘自 Martin Fowler 的书(企业应用程序模式)

ORM

对象和关系数据库在数据结构化方面有不同的机制。对象的许多部分,如集合和继承,在关系数据库中不存在。当您构建一个包含大量业务逻辑的对象模型时,使用这些机制来更好地组织数据及其行为是非常有价值的。这样做会导致模式的变体;也就是说,对象模式和关系模式不匹配。

您仍然需要在这两个模式之间传输数据,而这种数据传输本身就成了一个复杂的问题。如果内存中的对象了解关系数据库结构,那么一个的变化倾向于影响另一个。

数据映射器是分离内存对象和数据库的软件层。它的职责是在两者之间传输数据,并将它们彼此隔离。有了数据映射器,内存中的对象甚至不需要知道数据库的存在;它们不需要 SQL 接口代码,更不需要知道数据库模式。(数据库模式总是不知道使用它的对象。)由于它是一种映射器,数据映射器本身甚至对领域层是未知的。

ORM 的优点?

因此,使用 ORM 的主要优点是持久性。一旦加载数据,您可以让数据比应用程序进程的生命周期更长。

其他优点包括:

  • 简单且代码量少:您不需要不断编写 Create/update 语句。您可以为每个表或视图创建一个实体,然后使用它。
  • 成本:因此,由于重复性工作的减少,您可以降低软件的总成本,包括金钱和时间。
  • 维护:这是我最喜欢的部分。ORM 使您能够轻松维护。如果您要添加一个新列,您不需要去所有写过 insert 语句的地方添加它。只需将其添加到 ORM 文件中即可。
  • 缓存和并发:这两者都是可能的,从而提高了性能。
  • 延迟加载功能:您会按需加载数据。如果您的屏幕上有两个具有主子关系的网格,您可以在单击父记录时才加载子详细信息,从而节省初始屏幕打开时间,并且只获取所需详细信息。
  • 事务:事务得以维护。

最常用的 ORM??

  1. NHibernate:这是我最好的选择,我个人认为它是最好的 ORM。它与 Oracle 数据库配合良好。
  2. Entity Framework:这是微软对 NHibernate 的回应。它与 SQL 配合良好,但仍然落后于 NHibernate。
  3. LINQ to SQL:ORM 的轻量级版本。它本身不能称为 ORM,但可以利用其功能来实现 ORM 的功能。

扩展列表可以在此处找到。

© . All rights reserved.