当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/1191368/

相关文章:

  • ARM64嵌入式Linux系统FIT uImage启动流程详解与实战
  • 电力系统稳定性的三大支柱:功角、电压与频率稳定的内在关联与工程实践
  • 阿里云轻量服务器+飞书+Qwen3.6-Plus零基础AI助手部署指南
  • 数字逻辑实验进阶——基于Multisim的组合逻辑电路设计与仿真
  • Unity游戏框架GameFramework快速入门:10分钟搭建可运行项目
  • Java控制台交互实战:从Scanner精准捕获到printf优雅格式化
  • 【Multisim仿真实战】从零构建四路抢答器:核心电路模块深度解析与调试技巧
  • 沁恒 CH32V208(二): 深入解析存储映射、零等待机制与多外设时钟配置
  • TK1初始使用全指南:设备校准、行为基线与服务激活三步闭环
  • GaussianSplatting训练教程
  • IO口魔术师:查理复用算法在数码管驱动中的实战与权衡
  • Python爬取笔趣阁小说:从零构建可搜索的批量下载器(附源码)
  • TDA3x SoC硬件设计:引脚、电源与时钟系统实战解析
  • Arduino与TMC2209驱动42步进电机实战:从基础接线到静音控制
  • 从源码到签名:深入解析Android应用获取System权限的两种实践路径
  • DS90UB935-Q1图形发生器配置实战:从寄存器到1080p30彩条信号
  • UE5 AI行为树实战:构建智能感知与追逐系统
  • 基于Java微服务构建淘客返利平台的模块化拆分与演进策略
  • STM32F103C8T6多路灰度传感器ADC+DMA高效采集实战
  • C++手搓WebSocket服务器:从协议解析到高并发架构实战
  • 科研节奏管理:4篇/月的论文精读操作系统
  • 跨VLAN子网互通实战:基于路由器子接口与DHCP的自动化地址分配
  • 基于Spring Cloud Gateway的Java外卖API网关:路径重写与限流规则配置详解
  • WhatsApp聊天记录分析:Pandas清洗与Plotly交互可视化实战
  • 从“推”到“拉”:深入解析SMTP与POP3协议的工作机制与实战应用
  • 为什么Cell级文章,技术路线选择“单细胞测序+空间蛋白组”?
  • 【SpringAI 12】对话机器人进阶
  • 带标注的饮料瓶罐分类,可识别玻璃瓶,塑料瓶,水壶易拉罐,识别率95% ,15645张图,支持yolo,coco json,voc xml,文末有模型训练代码
  • SAML2.0 HTTP绑定方式详解:Redirect、POST与Artifact的选型指南
  • 围棋AI分析工具:识别定式陷阱与双虎变化实战指南