对象关系映射Object-Relational-MappingORM
ORM是连接“面向对象编程语言”(如 TypeScript, Java, Python)与“关系型数据库”(如 PostgreSQL, MySQL, SQL Server)的一座桥梁。
#status / growing
#type / concept
#tech / dev
对象关系映射Object-Relational-Mapping_ORM
为什么需要 ORM?
在现代软件开发中,我们面临一个“语言不通”的问题:
- 代码端(Object):我们使用对象来组织数据(例如在 TypeScript 中定义一个
User类或接口)。 - 数据库端(Relational):数据库使用表格、行和列来存储数据。
如果没有 ORM,你必须在代码里手写复杂的 SQL 语句来操作数据。而 ORM 的出现,让你能像操作本地对象一样去操作数据库,而不需要(或很少需要)编写原始的 SQL。
ORM 是如何工作的?
ORM 将数据库的结构映射到编程语言的代码结构中。你可以参考下表:
| 数据库概念 (Relational) | 代码概念 (Object) | 例子 |
|---|---|---|
| Table (表) | Class (类) / Model (模型) | User 表对应 User 类 |
| Row (行) | Instance (实例 / 对象) | 表中的某一条用户记录 |
| Column (列) | Property (属性) | 用户的 email 或 age |
使用 ORM 的优缺点
✅ 优点
- 开发效率高:不需要写大量的 SQL 语句,减少了重复代码。
- 类型安全(特别是 Prisma):如果你使用 TypeScript,ORM 可以在编译时告诉你字段是否写错,避免运行时的数据库报错。
- 数据库抽象:如果你决定从 MySQL 切换到 PostgreSQL,通常只需要更改少量配置,而不需要重写所有查询语句。
- 安全性:ORM 通常内置了防止 SQL 注入攻击的机制。
❌ 缺点
- 性能损耗:由于多了一层转换,在处理极其复杂的查询时,性能可能略低于手写优化的 SQL。
- 黑盒效应:如果完全依赖 ORM,开发者可能会忽略底层数据库的逻辑,导致写出低效的查询(如著名的 N+1 问题)。
Prisma
Prisma 是目前 Node.js 生态中最受欢迎的 ORM 之一,因为它解决了传统 ORM 的很多痛点:
核心优势:
- Schema 驱动:你只需要在一个
schema.prisma文件里定义模型,它会自动生成对应的数据库表和 TypeScript 类型定义。- 极致的自动补全:在写代码时,编辑器会准确提示你数据库里有哪些字段,极大地减少了 Bug。
Related notes
- 所属 MOC: Node.js 后端面试 MOC
- 所属 MOC: Prisma 完整指南
- 相关概念: 数据库连接池
- 相关概念: 关系型数据库
- 相关概念: SQL