全书目录

第二十四篇:TypeORM 完全指南 —— 数据映射施工队宇宙

第三章:Active Record 与 Data Mapper —— 楼自己施工,还是图纸和施工队分离

1 分钟 445 字 第 435 / 962 个阅读单元

这是 TypeORM 和很多 JS ORM 很不同的一点:

TypeORM 同时支持 Active Record 和 Data Mapper。

这两个模式不是“哪个更高级”,而是组织方式不同。

#1. Active Record:楼自己带施工能力
ts
import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  name!: string;
}

const user = new User();
user.name = "Lin";
await user.save();

const users = await User.find();

它的心智是:

text
实体 = 图纸 + 施工方法

像一栋楼自己带着:

  • save()
  • remove()
  • find()

优点:

  • 上手快
  • 小项目直观
  • demo 和简单 CRUD 很顺手

代价:

  • 业务逻辑容易和实体耦在一起
  • 测试、分层、复杂协作时容易糊
  • 领域边界不够干净

#2. Data Mapper:图纸归图纸,施工归施工队
ts
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  name!: string;
}

const userRepository = dataSource.getRepository(User);

const user = userRepository.create({ name: "Lin" });
await userRepository.save(user);

const users = await userRepository.find();

它的心智是:

text
实体 = 蓝图
Repository / Manager = 施工队
Service = 项目经理

优点:

  • 分层清楚
  • 更适合中大型后端
  • 测试和依赖替换更自然
  • 业务逻辑不容易黏在实体上

代价:

  • 比 Active Record 多一层抽象
  • 初学者会觉得“怎么这么绕”

#3. 什么时候选哪个

一条很实用的判断线:

text
个人项目 / 教学样例 / 小工具
-> Active Record 可以

团队项目 / 分层后端 / 长期维护
-> Data Mapper 更稳

如果你以后会接 NestJS、Express 分层项目、复杂 service、事务边界,那你最好优先建立 Data Mapper 心智