MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第六章:TypeORM Entity 设计
一、Entity 是什么?
定义
Entity:
ORM 中用于描述数据库表结构的类。
数据库:
sys_user对应:
TypeORM:
User Entity关系:
MySQL Table | | ↓ TypeScript Entity例如:
数据库:
CREATE TABLE sys_user( id BIGINT PRIMARY KEY, username VARCHAR(50) );Entity:
@Entity('sys_user') export class User { @PrimaryGeneratedColumn() id:number; @Column() username:string; }二、Entity 与 Table 的对应关系
| 数据库 | Entity |
|---|---|
| Table | Class |
| Column | Property |
| Row | Object |
| Primary Key | PrimaryColumn |
| Index | @Index |
例如:
数据库:
| id | username |
|---|---|
| 1 | Tom |
转换:
User{ id:1, username:'Tom' }三、Entity 基础结构
企业项目:
@Entity('sys_user') export class User { @PrimaryGeneratedColumn() id:number; @Column() username:string; @Column() password:string; @CreateDateColumn() createTime:Date; @UpdateDateColumn() updateTime:Date; @DeleteDateColumn() deletedAt:Date; }包含:
- 主键
- 业务字段
- 创建时间
- 更新时间
- 删除时间
四、字段映射 Column
普通字段
@Column() username:string;对应:
username varchar指定类型:
@Column({ type:'varchar', length:50 }) username:string;数据库:
username varchar(50)五、数据库命名规范
企业:
数据库:
snake_case
例如:
user_name create_time update_time代码:
camelCase
例如:
userName createTime updateTime映射:
@Column({ name:'create_time' }) createTime:Date;原因:
数据库遵循 SQL 规范。
代码遵循语言规范。
六、主键设计 ⭐⭐⭐⭐⭐
企业推荐:
BIGINTEntity:
@PrimaryGeneratedColumn({ type:'bigint' }) id:number;原因:
1. 查询效率高
数字比较快。
2. 索引小
BIGINT:
8字节。
UUID:
36字符。
3. 自增方便
1 2 3 4不推荐:
用户名:
username PRIMARY KEY原因:
用户名可能修改。
七、自动时间字段
企业表基本都有:
创建时间
@CreateDateColumn() createTime:Date;新增:
自动:
2026-07-13 10:00更新时间
@UpdateDateColumn() updateTime:Date;修改:
自动更新。
八、软删除设计
不用:
DELETE FROM user增加:
deleted_atEntity:
@DeleteDateColumn() deletedAt:Date;删除:
softDelete(id)实际:
UPDATE user SET deleted_at='2026-07-13' WHERE id=1;优点:
- 保留历史
- 可恢复
- 方便审计
九、Entity 关系设计 ⭐⭐⭐⭐⭐
数据库关系:
三种:
一对一 一对多 多对多十、一对一 OneToOne
例:
用户:
User
身份证:
Profile
关系:
User 1 ---- 1 ProfileEntity:
User:
@OneToOne(()=>Profile) @JoinColumn() profile:Profile;Profile:
@OneToOne(()=>User) user:User;十一、一对多 OneToMany / ManyToOne ⭐⭐⭐⭐⭐
最常用。
例如:
用户:
拥有多个订单。
关系:
User 1 | N Order数据库:
外键放:
多的一方。
所以:
order:
user_idOrder:
@ManyToOne( ()=>User, user=>user.orders ) user:User;User:
@OneToMany( ()=>Order, order=>order.user ) orders:Order[];重点:
外键永远放在多的一方。
十二、多对多 ManyToMany
例如:
用户角色:
User N | N Role不能:
User:
roleIds="1,2,3"因为违反数据库设计。
需要中间表:
user_role结构:
| user_id | role_id |
|---|---|
| 1 | 1 |
| 1 | 2 |
TypeORM:
User:
@ManyToMany( ()=>Role ) @JoinTable() roles:Role[];Role:
@ManyToMany( ()=>User ) users:User[];十三、RBAC Entity 设计
数据库:
user role permission user_role role_permissionUser
@Entity() export class User{ @ManyToMany( ()=>Role ) @JoinTable() roles:Role[]; }Role
@Entity() export class Role{ @ManyToMany( ()=>Permission ) @JoinTable() permissions:Permission[]; }Permission
@Entity() export class Permission{ name:string; code:string; }关系:
User ↓ Role ↓ Permission十四、订单系统 Entity 设计
数据库:
orders order_item product关系:
Order 1 | N OrderItem N | 1 ProductOrder:
@OneToMany( ()=>OrderItem, item=>item.order ) items:OrderItem[];OrderItem:
@ManyToOne( ()=>Order ) order:Order; @ManyToOne( ()=>Product ) product:Product;Product:
@OneToMany( ()=>OrderItem, item=>item.product ) items:OrderItem[];十五、为什么 OrderItem 必须独立 Entity?
因为:
订单和商品:
是多对多。
一个订单:
多个商品。
一个商品:
出现在多个订单。
需要中间表:
order_item同时保存:
商品成交价格 购买数量 优惠金额所以:
不能:
Order{ products:Product[] }十六、企业 Entity 目录结构
推荐:
src ├── modules │ ├── user │ ├── user.entity.ts │ ├── role │ ├── role.entity.ts │ ├── order │ ├── order.entity.ts │ ├── order-item.entity.ts │ ├── product │ ├── product.entity.ts不要:
entity.ts 里面100个Entity十七、Entity 设计原则总结
原则1
Entity只描述数据。
不要:
写业务。
原则2
一个表一个Entity。
原则3
关系明确。
不要:
数组存ID。
错误:
roleIds:string原则4
公共字段统一:
例如:
BaseEntity包含:
id createTime updateTime deletedAt十八、本章总结
| 知识 | 作用 |
|---|---|
| Entity | 数据库表映射 |
| Column | 字段映射 |
| PrimaryGeneratedColumn | 主键 |
| CreateDateColumn | 创建时间 |
| UpdateDateColumn | 更新时间 |
| DeleteDateColumn | 软删除 |
| OneToOne | 一对一 |
| ManyToOne | 多对一 |
| OneToMany | 一对多 |
| ManyToMany | 多对多 |
| JoinTable | 中间表 |
本章核心一句话:
Entity 是数据库设计在代码中的表达,好的 Entity 设计决定了后续 Service、Repository 是否清晰。
