news 2026/7/15 4:21:15

MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第六章:TypeORM Entity 设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 是否清晰。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 4:20:14

FIBF与SE37实战:BTE增强在会计凭证过账前的数据捕获与分流

1. BTE增强技术入门:会计凭证处理的隐形抓手第一次接触BTE增强是在五年前的一个财务系统优化项目上。当时客户要求在会计凭证过账前自动检查特定科目的辅助核算完整性,传统用户出口无法满足需求。折腾了两周后,我在SAP的底层代码中发现了&quo…

作者头像 李华
网站建设 2026/7/15 4:19:22

Android逆向:Xposed框架实战——从模块开发到方法Hook的完整指南

文章目录 每日一句正能量 一、引言:Xposed框架在Android逆向中的核心地位 二、Xposed框架架构与Hook原理 2.1 核心架构 2.2 方法Hook执行流程 2.3 Xposed框架演进 三、LSPosed环境搭建与配置 3.1 前置条件 3.2 安装LSPosed 3.3 LSPatch免Root方案(替代方案) 四、Xposed模块开…

作者头像 李华
网站建设 2026/7/15 4:17:55

微信小程序下拉刷新:从基础配置到高级自定义动画实战

1. 微信小程序下拉刷新基础配置下拉刷新是移动端常见的交互方式,微信小程序提供了两种开启方式:全局配置和页面级配置。全局配置会影响所有页面,适合需要统一风格的场景;页面级配置则更灵活,可以针对特定页面单独设置。…

作者头像 李华
网站建设 2026/7/15 4:17:17

本地化代码助手实战:Qwen2.5-Coder+llama.cpp工作流搭建

1. 项目概述:这不是“平替”,而是重新定义本地代码助手的使用逻辑“炸裂!ClaudeCode 超低成本使用方案来了,国内完美平替!!”——看到这个标题,我第一反应不是点开,而是放下手机&…

作者头像 李华
网站建设 2026/7/15 4:16:27

WhatsApp聊天记录分析:Pandas清洗与Plotly交互可视化实战

1. 项目概述:从聊天记录里挖出真实的人际行为图谱你有没有试过翻看一个活跃了三年的微信群或WhatsApp群聊记录?满屏的“收到”“好的”“哈哈哈”,还有凌晨两点突然炸锅的讨论,以及每逢节假日准时刷屏的祝福接龙。这些看似杂乱无章…

作者头像 李华
网站建设 2026/7/15 4:15:28

从微分到电压:电容电感伏安关系的动态电路分析与实战

1. 动态电路中的电容与电感基础刚接触电子电路时,很多人都会被电容和电感这两个元件搞得晕头转向。我记得自己第一次搭建LC谐振电路时,怎么都调不出谐振点,后来才发现是没搞懂它们的动态特性。电容和电感之所以被称为动态元件,是因…

作者头像 李华