跳至主要内容

什么是对象关系映射(ORM)?

什么是对象关系映射(ORM)?

对象关系映射(ORM)是抽象编程语言实体(对象)与其对应数据库元素之间连接的过程。

构建应用程序时,程序员会在代码中定义对象,这些对象对应于现实世界中的概念。对象数据在代码中进行操作,但存储在数据系统设计定义的数据库中。例如,您的代码中可能存在包含客户信息的客户对象,但底层数据库可将这些数据存储在多个表中。

对象关系映射是一种软件层,可将对象数据转换为底层数据库,从而使程序员无需关注数据库细节。这样,即使底层数据库替换为新的或不同的设计,代码也能保持不变。对象关系映射可创建易于管理和维护的模块化应用程序。

对象关系映射如何工作?

对象关系映射(ORM)将以面向对象型编程(OOP)语言编写的应用程序连接至底层数据库。这类应用程序和数据库通常协同使用,但各自处理数据的方式不同。在二者之间添加对象关系映射,使双方能够以对方理解的格式发送数据。您可以修改其中一个而不影响另一个。

面向对象型编程语言

OOP 语言将数据组织成对象,这些对象是具备一个或多个属性的代码结构。例如,在 OOP 应用程序中,您可以定义表示数据持久型类的对象,例如汽车,其属性包括品牌、型号、VIN、颜色里程数

一些常用的面向对象型编程(OOP)语言包括 PythonJavaJavaScript.NET/C#

关系数据库

关系数据库将数据组织成表,类似于一系列相互关联的电子表格。每张表由一组列构成,每行包含唯一的记录。

例如,您的汽车数据库可能包含多个表。其中某张表可能包含品牌数据,例如品牌、型号VIN。 另一张表可能存储单辆汽车的属性,例如车主、颜色里程数。一些常用的关系数据库包括 MySQLPostgreSQL 和 SQL Server。

在 Web 开发中,对象关系映射(ORM)工具将面向对象型应用程序发送的数据转换为关系数据库,无需应用程序了解该数据在数据库中的具体结构。

对象关系映射

您可以创建对象关系映射(有时称为对象关系管理器),其可指导数据库定位应用程序请求的所有数据,即使每种结构以不同的方式存储数据。当应用程序请求某辆汽车的所有属性时,ORM 会指导数据库如何跨多个表检索所有相关数据。

由于映射采用抽象化处理,即使数据库结构发生变化或迁移至新数据库,ORM 仍可通过最小程度的更新指向正确的数据。

常见的 ORM 框架

在许多常用的面向对象型编程语言中,均提供用于数据建模的 ORM 工具或框架。一些常用的工具或框架包括:

  • 适用于 Java 的 Hibernate
  • 适用于 Python 的 SQLAcademy
  • 适用于 .NET/C# 的实体框架

能否在非关系数据库中使用 ORM?

不能,非关系数据库以不同的格式存储数据,并以不同的方式与应用程序进行交互。最常见的非关系数据库类型是文档数据库。文档也可以有许多与对象类似的属性,但其程序化结构不同。

一些最受欢迎的非关系数据库包括 MongoDB NoSQL

ORM 和 ORDBMS 有何区别?

对象关系数据库管理系统(ORDBMS)是一种同时采用关系框架和面向对象框架的数据库类型。它可存储类似于以 OOP 语言编写的对象结构的记录。但您也可以对这些记录执行类似 SQL 的关系查询。相比标准的关系数据库,这种功能组合让您可以存储更广泛的数据类型。

对象关系映射(ORM)是指在应用程序层运行的数据抽象,而 ORDBMS 则直接在数据库级别提供面向对象的功能。

ORM 在应用程序代码中运行,并在后台生成 SQL。ORDBMS 在数据库级别管理数据存储和查询执行,同时对高级对象类型提供原生支持。

ORM 和 SQL 有何区别?

SQL(结构化查询语言)是用于与关系数据库进行交互的标准语言。它让您可以使用声明式命令创建和管理数据库架构、插入和更新数据以及查询记录。

SQL 提供对数据库的直接、低级控制。ORM 提供更高级别、更抽象的接口,通常可加快开发速度和提高代码的可维护性。

ORM 是简化常见数据库任务并与应用程序代码保持一致的理想之选,但当需要性能调优、复杂查询或完全控制数据访问时,SQL 仍不可或缺。

为何选择 ORM 而非 SQL 查询?

SQL 需要手动编写命令才能与数据库进行交互,而 ORM 可在后台自动将面向对象型代码转换为 SQL。

ORM 有助于减少开发面向对象程序所需的编码量,而这类程序必须执行大量数据库查询。开发人员无需手动编写大量需要维护的数据库查询,而是编写向 ORM 发送请求的程序。

使用更易于理解的编程语言,也能让代码更易于阅读和调试。

使用对象关系映射有哪些优势?

ORM 系统提供以下优势。

更快速的应用程序开发

ORM 使用开发人员最熟悉的 OOP 语言中的可理解代码,助力检索复杂的数据。它们可以处理常规数据库操作,例如创建、读取、更新和删除记录(CRUD),因此开发人员无需在应用程序中重复编写这些操作的代码。

更简单的应用程序维护

通过 ORM 抽象数据库查询,开发人员可使用单一语言进行开发,从而使代码更易于理解和维护。

提高安全性

SQL 注入攻击是一种恶意尝试,攻击者通过在应用程序的用户表单中发送 SQL 查询以访问私有数据。ORM 使用参数化查询,首先向数据库发送包含占位符值(而非真实数据)的查询(例如,?:param)。真实数据单独发送。这确保将用户输入视作数据,而非可执行的 SQL 代码。使用 ORM 工具可防止通过 SQL 注入进行未经授权的数据访问

提高性能

ORM 通过在应用程序层实现透明的对象缓存,以提升系统性能。它可将最常检索的数据存储在更接近应用程序的位置,以便加快访问速度。

使用对象关系映射面临哪些挑战?

ORM 存在以下挑战。

阻抗不匹配

复杂的数据结构在面向对象型程序与数据库之间进行映射时可能存在困难。无论 ORM 多么强大,可在 OOP 中进行编码的层次结构在数据库中通常都难以有效表示。

较高复杂度下的性能问题

直接查询数据库比使用 ORM 的计算效率更高。对于高度复杂的查询,使用 SQL 代码可能比使用对象关系映射(ORM)工具更为高效。

学习曲线

虽然 ORM 工具可帮助避免学习复杂的 SQL 代码,但开发人员仍需掌握这些工具的使用方法。

何时应使用对象关系映射?

由于 ORM 工具能够抽象化和自动化数据库查询,因此开发人员可以将更多精力集中在应用程序开发上,而非编写可能复杂的查询。以下情况时考虑使用 ORM:

应用程序包含许多对象

手动构建复杂对象接口和结构的查询可能是一项耗时且费力的任务。允许 ORM 工具将对象映射到数据库中存储的数据可使精确检索更快、更可靠。

应用程序重复执行类似的数据库查询

ORM 可轻松地自动执行许多常规的 CRUD 操作(创建、读取、更新和删除数据),因此您需要的 SQL 代码更少。

架构演变正在持续进行

如果您的数据模型仍在不断演变,ORM 工具可帮助您更轻松地管理数据库架构变更。许多 ORM 都包含迁移工具,这些工具可让您以结构化方式对变更进行版本控制和应用,从而降低跨环境不一致的风险。

数据库可移植性至关重要

ORM 是一种抽象层,可有意将应用程序调用的操作与任何特定数据库进行分离。虽然不能保证完全的可移植性,但这种抽象可减少在系统间迁移所涉及的工作量。例如,如果您的汽车应用程序需要从使用 MySQL 数据库切换到 PostgreSQL,您无需重写整个应用程序。如果表结构发生任何变化,您只需对 ORM 进行微调即可。

何时不应使用对象关系映射?

尽管它们是功能强大的工具,但在某些情况下,对象关系映射器仍非最佳解决方案。

对于简单的数据库交互

如果您正在构建仅执行简单 CRUD 操作的应用程序,维护 ORM 所需的时间和精力可能超过直接在应用程序中手动维护查询所需的时间和精力。

高性能计算至关重要时

对于许多应用程序而言,ORM 导致的额外计算时间和资源消耗无关紧要。但对于实时分析这类任务,毫秒级延迟都至关重要,此时可能无法使用 ORM。

需要使用非规范化架构时

某些情况下,开发人员可能希望在数据库 Web 服务(称为非规范化架构)的多个表中维护冗余数据。当应用程序需执行涉及多个表的复杂关系查询时,这可以提升性能。在 ORM 中映射这些查询并非总是有效。

AWS 如何帮助您满足数据管理需求?

AWS 提供一系列云数据库解决方案,使数据管理既高效又经济实惠。

Amazon Relational Database Service(Amazon RDS)是一种托管服务,可在云中轻松设置、操作和扩展关系数据库。它可以在管理耗时的数据库管理任务的同时提供经济高效的可调容量,使您能够腾出时间专注于应用程序和业务。

Amazon Aurora 是一项现代关系数据库服务,可大规模提供高性能和高可用性。它提供完全开源的 MySQL 和 PostgreSQL 兼容版,以及一系列用于构建无服务器和机器学习(ML)驱动型应用程序的开发工具。

Amazon Redshift 支持大规模的现代数据分析,与其他云数据仓库相比,其性价比最高可提高 3 倍,吞吐量最高可提高 7 倍。

Amazon DocumentDB(兼容 MongoDB)是一项快速、可扩展、高度可用且完全托管的企业文档数据库,可将数据存储在与 JSON 对象类似的文档中。它们利用从原生对象返回给开发人员所用编程语言的驱动程序,从而无需依赖 ORM 工具。

立即创建免费账户,开始在 AWS 上使用数据库。