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
TableClass
ColumnProperty
RowObject
Primary KeyPrimaryColumn
Index@Index

例如:

数据库:

idusername
1Tom

转换:

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 规范。

代码遵循语言规范。


六、主键设计 ⭐⭐⭐⭐⭐

企业推荐:

BIGINT

Entity:

@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_at

Entity:

@DeleteDateColumn() deletedAt:Date;

删除:

softDelete(id)

实际:

UPDATE user SET deleted_at='2026-07-13' WHERE id=1;

优点:

  • 保留历史
  • 可恢复
  • 方便审计

九、Entity 关系设计 ⭐⭐⭐⭐⭐

数据库关系:

三种:

一对一 一对多 多对多

十、一对一 OneToOne

例:

用户:

User

身份证:

Profile

关系:

User 1 ---- 1 Profile

Entity:

User:

@OneToOne(()=>Profile) @JoinColumn() profile:Profile;

Profile:

@OneToOne(()=>User) user:User;

十一、一对多 OneToMany / ManyToOne ⭐⭐⭐⭐⭐

最常用。

例如:

用户:

拥有多个订单。

关系:

User 1 | N Order

数据库:

外键放:

多的一方。

所以:

order:

user_id

Order:

@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_idrole_id
11
12

TypeORM:

User:

@ManyToMany( ()=>Role ) @JoinTable() roles:Role[];

Role:

@ManyToMany( ()=>User ) users:User[];

十三、RBAC Entity 设计

数据库:

user role permission user_role role_permission

User

@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 Product

Order:

@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 是否清晰。