dot 快速的未来即将在您所在的城市举办活动。

加入我们在 Redis 发布会

关于对象关系映射的 3 个常见误解

大多数软件开发人员都熟悉对象关系映射 (ORM),这是一种编码技术,它在面向对象编程语言和数据库之间创建抽象层。但尽管它很有价值,但 ORM 并非在所有情况下都是理想的选择 - 特别是在程序员对它的使用做出错误的假设时。我们将揭穿一些这样的错误观念,以便您可以正确地使用 ORM。


不要误解:我们感谢 ORM。Redis 热烈支持该技术,并支持多种编程语言。但重要的是要有一个良好的开端。

ORM 在其最纯粹的形式下充当连接系统的翻译器。它们通过允许程序员通过他们喜欢的编程语言简化通信而不是直接依赖结构化查询语言 (SQL) 或其他特定于数据库的语言,提供了很大的灵活性。由于系统通常依赖于不同的编程语言并以不同的方式存储数据,因此很容易引入复杂性。如果没有 ORM,许多面向对象的应用程序将难以与数据库进行通信。

尽管如此,程序员可能会对 ORM 的作用产生误解,这会导致混淆,有时还会带来挫败感。

这三个误解会阻止您正确使用 ORM,并从该技术中获得最大的收益。那将是一件憾事。

1. 由于 ORM 模糊了与数据库的交互,因此您不需要了解 SQL

您一定熟悉 SQL,它是用于在关系数据库中存储、操作和检索数据的标准化语言。您可以使用特定的查询与数据库进行交互:INSERT、SELECT、UPDATE、DELETE、DROP TABLE 等等。

ORM 帮助程序员用他们喜欢的语言(例如 Python)与数据库进行交互,而不是从头开始手动编写 SQL 查询。这是一个重大的优势。使用 ORM,数据以结构化的方式建模,这有助于程序员与数据库的布局和内容进行交互。

您不必使用 SQL,因为 ORM 替您做了很多工作。这节省了时间和精力,特别是对于那些不了解 SQL 或对其技能缺乏信心的人。根据 2020 年 StackOverflow 调查,只有56.9% 的开发人员在全球范围内使用 SQL。但快捷方式与为无知辩护并不一样。一些开发人员假设“我不需要深入了解 SQL”与“学习数据库概念是多余的,因为 ORM 从头到尾都做完了一切”是一样的。

这不是真的。

ORM 非常适合处理简单的 SQL 查询。但是,当您做任何复杂的事情时,您需要了解 SQL 可以做什么,以便充分发挥其功能。这并不奇怪。您对其他开发工具也这样做。工具应该支持我们的工作,而不是取代我们的理解。

然而,开发人员有时会将“我有一个帮助我的工具”概括为“如果你有一个工具,你就无需了解任何关于数据库设计的东西”。高级抽象并不总是能编写出最佳代码。它们容易出错,您需要了解 SQL 才能识别何时出现这种情况。如果您不了解 SQL,调试、性能调整或整理复杂数据会变得更加繁琐和令人沮丧。

了解 SQL 使您对应用程序有更多控制权,并允许您调整 SQL 查询以优化性能。使用 ORM 来帮助您更快地工作 - 而不是阻止您思考。

2. ORM 提供的唯一功能是编写 SQL 代码

一些反 ORM 人士认为,自己编写 SQL 查询始终更好。他们认为 ORM 提供的唯一功能是编写 SQL 代码。

但软件不仅仅是编写查询。ORM 会参与面向对象模型以及数据在数据库和该模型之间的移动方式;这与实际编写 SQL 查询是正交的。

ORM 还促进了代码的可维护性和可重用性,因为它们使开发人员能够以对象而不是原子数据片段的方式进行思考。

3. 如果你使用 ORM,你就无需担心数据库安全性

SQL 注入 的结果可能是灾难性的,导致未经授权的数据库访问。幸运的是,ORM 在保护应用程序免受 SQL 注入攻击方面更加有效。它们可以将对象和操作映射到与数据库相关的代码,因此您无需手动编写特定于安全性的代码。

然而,“它有帮助”与“因此它万无一失”并不一样。ORM 包不能使您的数据库应用程序免受网络安全攻击。与任何软件一样,ORM 可能存在漏洞(甚至Hello World 也是脆弱的),使数据驱动应用程序暴露在另一个攻击领域。

ORM 防御 SQL 注入攻击的主要方式是使用参数化查询。但是,并非所有 ORM 都以这种方式工作。在您假设特定 ORM 是安全的之前,您至少应该验证它如何将您的操作转换为 SQL。

为了获得更好的保护,实施您在手工编写代码时会采用的所有数据库安全技术。无论应用程序如何创建,请确保您的软件 QA 流程包含一个完整的安全测试套件(不仅针对SQL 注入攻击)。ORM 可能会降低安全漏洞的可能性,但最好是安全起见。

Redis 有 ORM 吗?

在 Redis,我们热衷于任何能够使应用程序开发更快、更准确、更有效的工具 - 让程序员能够思考如何以创新的方式帮助数据驱动应用程序更好地服务其用户。所以当然,我们完全支持 ORM。它们促进了代码可重用性,并在数据访问层中提供了更清晰的分离。

Redis OM 客户端库介绍 解释了对象映射器如何帮助您充分利用 Redis 的模块。Redis OM 的目标是提供一组高级抽象,使您能够轻松地在您最熟悉的编程环境中使用 Redis 数据。它包含四个用于 Redis 的高级客户端库,我们邀请您探索它们

需要查找其他相关概念的定义吗?查看我们的术语表部分