这是 TypeORM 和很多 JS ORM 很不同的一点:
TypeORM 同时支持 Active Record 和 Data Mapper。
这两个模式不是“哪个更高级”,而是组织方式不同。
#1. Active Record:楼自己带施工能力
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();它的心智是:
实体 = 图纸 + 施工方法像一栋楼自己带着:
save()remove()find()
优点:
- 上手快
- 小项目直观
- demo 和简单 CRUD 很顺手
代价:
- 业务逻辑容易和实体耦在一起
- 测试、分层、复杂协作时容易糊
- 领域边界不够干净
#2. Data Mapper:图纸归图纸,施工归施工队
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();它的心智是:
实体 = 蓝图
Repository / Manager = 施工队
Service = 项目经理优点:
- 分层清楚
- 更适合中大型后端
- 测试和依赖替换更自然
- 业务逻辑不容易黏在实体上
代价:
- 比 Active Record 多一层抽象
- 初学者会觉得“怎么这么绕”
#3. 什么时候选哪个
一条很实用的判断线:
个人项目 / 教学样例 / 小工具
-> Active Record 可以
团队项目 / 分层后端 / 长期维护
-> Data Mapper 更稳如果你以后会接 NestJS、Express 分层项目、复杂 service、事务边界,那你最好优先建立 Data Mapper 心智。