MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第一章:企业数据库设计规范

一、企业数据库设计流程

企业开发一般遵循下面的流程:

复制代码
复制代码
需求分析
    ↓
抽取业务实体
    ↓
分析实体之间关系
    ↓
设计表结构
    ↓
设计索引
    ↓
评审数据库设计
    ↓
正式建表

例如:

开发一个图书管理系统。

需求:

复制代码
复制代码
用户可以:
借书
还书
查看图书

首先抽取实体:

复制代码
复制代码
用户(User)

图书(Book)

借阅记录(BorrowRecord)

然后分析关系:

复制代码
复制代码
User
   │
   │ 1 : N
   │
BorrowRecord
   │
   │ N : 1
   │
Book

最后再开始建表。

不要一开始就写 CREATE TABLE


二、企业数据库命名规范

数据库命名是企业开发中最容易忽视,但影响长期维护的重要部分。

1. 表名

推荐:

复制代码
复制代码
user
role
permission
department
order
order_item
login_log

不推荐:

复制代码
复制代码
User
USER
tb_user
userTable

为什么?

因为:

  • 全小写更统一。
  • Linux 对大小写敏感。
  • 不同数据库(MySQL、PostgreSQL)兼容性更好。

2. 多个单词使用下划线

推荐:

复制代码
复制代码
order_item
user_role
login_log
create_time

不推荐:

复制代码
复制代码
orderItem
LoginLog
CreateTime

数据库一般使用 snake_case(下划线命名) ,而 Java/TypeScript 使用 camelCase(驼峰命名)

例如:

数据库:

复制代码
复制代码
create_time

TypeORM Entity:

复制代码
复制代码
createTime

ORM 会负责映射。


三、字段命名规范

推荐:

复制代码
复制代码
id
username
password
phone
email
status
create_time
update_time
deleted

不要写:

复制代码
复制代码
uname
pwd
num
time1
flag

因为:

半年以后,你自己都不知道:

复制代码
复制代码
flag = ?

代表什么。


四、主键设计规范 ⭐⭐⭐⭐⭐

企业项目:

几乎每张表都有:

复制代码
复制代码
id BIGINT PRIMARY KEY AUTO_INCREMENT

为什么?

因为:

主键必须:

  • 唯一
  • 不为空
  • 不修改

为什么不用用户名作为主键?

例如:

复制代码
复制代码
username

Tom

如果:

用户改名:

复制代码
复制代码
Tom

↓

Jack

所有关联数据都需要修改。

所以:

用户名不能作为主键。


为什么推荐 BIGINT?

很多初学者:

复制代码
复制代码
id INT

其实:

INT 最大:

复制代码
复制代码
2147483647

约:

21 亿。

互联网项目:

很容易达到。

企业:

通常:

复制代码
复制代码
BIGINT

最大:

约:

复制代码
复制代码
9 × 10¹⁸

几乎够用了。


五、公共字段设计 ⭐⭐⭐⭐⭐

企业项目:

几乎每张表都有这些字段:

复制代码
复制代码
id

create_time

update_time

deleted

例如:

复制代码
复制代码
CREATE TABLE user(

    id BIGINT PRIMARY KEY AUTO_INCREMENT,

    username VARCHAR(50),

    create_time DATETIME,

    update_time DATETIME,

    deleted TINYINT DEFAULT 0

);

create_time

表示:

创建时间。

例如:

复制代码
复制代码
2026-07-13 10:30:00

作用:

查看:

什么时候创建。


update_time

表示:

最后修改时间。

例如:

修改:

用户名。

自动更新:

复制代码
复制代码
update_time

方便:

排查问题。


deleted

软删除。

复制代码
复制代码
0

正常
复制代码
复制代码
1

删除

为什么?

后面讲。


六、软删除(Soft Delete)⭐⭐⭐⭐⭐

很多初学者:

删除:

复制代码
复制代码
DELETE
FROM user
WHERE id=1;

直接删除。

企业:

很多不会这样。


例如:

用户:

注销账号。

如果:

直接:

复制代码
复制代码
DELETE

那么:

订单:

复制代码
复制代码
user_id

怎么办?

找不到用户。


所以:

企业:

更多:

复制代码
复制代码
UPDATE user

SET deleted=1

WHERE id=1;

数据:

仍然存在。

只是:

查询:

复制代码
复制代码
WHERE deleted=0

这样:

既能恢复。

又能保证:

历史数据完整。


七、状态字段设计

很多业务:

不要:

多个:

布尔字段。

例如:

错误:

复制代码
复制代码
is_enable

is_lock

is_delete

推荐:

一个:

复制代码
复制代码
status

例如:

复制代码
复制代码
0

禁用

1

正常

2

锁定

3

审核中

以后:

新增:

复制代码
复制代码
4

冻结

更方便。


八、金额设计

很多人:

喜欢:

复制代码
复制代码
price FLOAT

错误。

原因:

浮点数:

存在精度误差。

例如:

复制代码
复制代码
0.1

+

0.2

=

0.3000000004

企业:

必须:

复制代码
复制代码
DECIMAL(10,2)

例如:

复制代码
复制代码
price DECIMAL(10,2)

表示:

复制代码
复制代码
99999999.99

九、时间字段设计

推荐:

复制代码
复制代码
DATETIME

例如:

复制代码
复制代码
create_time DATETIME

为什么?

DATETIME:

表示:

复制代码
复制代码
2026-07-13 14:30:20

更直观。


很多互联网项目:

也会:

复制代码
复制代码
BIGINT

保存:

毫秒时间戳。

例如:

复制代码
复制代码
1752385200000

适合:

前后端统一处理。


十、是否允许 NULL?

企业建议:

尽量避免 NULL。

例如:

错误:

复制代码
复制代码
phone VARCHAR(20) NULL

推荐:

复制代码
复制代码
phone VARCHAR(20) NOT NULL DEFAULT ''

为什么?

因为:

SQL 判断:

复制代码
复制代码
IS NULL

比较特殊。

还影响:

索引和统计。


十一、字段长度设计

不要:

复制代码
复制代码
username VARCHAR(500)

实际上:

用户名:

一般:

复制代码
复制代码
VARCHAR(50)

即可。

例如:

字段 推荐
用户名 VARCHAR(50)
手机号 VARCHAR(20)
邮箱 VARCHAR(100)
密码(哈希) VARCHAR(255)

合理长度可以减少存储空间,提高缓存利用率。


十二、企业建表示例

复制代码
复制代码
CREATE TABLE user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',

    username VARCHAR(50) NOT NULL COMMENT '用户名',

    phone VARCHAR(20) NOT NULL DEFAULT '' COMMENT '手机号',

    status TINYINT NOT NULL DEFAULT 1 COMMENT '状态',

    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
        ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

    deleted TINYINT NOT NULL DEFAULT 0 COMMENT '是否删除'
);

这里还加入了:

  • COMMENT:字段注释,方便维护。
  • DEFAULT:默认值。
  • ON UPDATE CURRENT_TIMESTAMP:自动更新时间。

十三、企业数据库设计规范总结

规范 推荐做法
表名 小写 + 下划线
字段名 小写 + 下划线
主键 BIGINT AUTO_INCREMENT
金额 DECIMAL
时间 DATETIME
公共字段 id、create_time、update_time、deleted
状态 status,不使用多个 is_xxx
删除 软删除
字段长度 按业务合理设置
NULL 尽量不用,使用 NOT NULL + DEFAULT
字段注释 使用 COMMENT

🎯 本章核心一句话:

企业数据库设计追求的不是"能用",而是"易维护、易扩展、高性能"。良好的数据库设计,可以让项目在多年迭代中依然保持清晰、稳定。


本章思考题

  1. 为什么企业推荐使用 BIGINT 作为主键,而不是 INTusername
    企业推荐使用 BIGINT AUTO_INCREMENT 作为主键,因为它容量大、稳定、不受业务变化影响
  2. 为什么金额字段必须使用 DECIMAL,而不能使用 FLOATDOUBLE
    因为 FLOAT 和 DOUBLE 属于浮点数,会产生精度误差,而金额必须保证精确计算。
  3. 为什么很多企业采用软删除,而不是直接执行 DELETE
    数据逻辑上删除,物理上仍然保留。
  4. 为什么数据库字段通常使用 snake_case(下划线命名),而 Java/TypeScript 使用 camelCase(驼峰命名)?
    因为这是各自领域长期形成的规范。
  5. 为什么推荐使用 status 字段,而不是多个 is_xxx 布尔字段?
    因为 status 更容易扩展,也更容易维护。
相关推荐
IvorySQL1 小时前
PG 日报|新增 VFD 缓存监控视图,精细化数据库调优
大数据·数据库·人工智能·缓存·postgresql·区块链
咏方舟【长江支流】1 小时前
【开源】跨语言·跨平台·跨数据库(3) —— 为用宝框架增加ORM,让AI执行
数据库·人工智能·开源·ai编程·orm·咏方舟-长江支流·用宝框架
工业甲酰苯胺2 小时前
AI×JNPF实战:3个案例拆解企业数智转型核心逻辑
大数据·数据库·人工智能·低代码
360智汇云2 小时前
一次Redis超时引发的“冤案“
数据库·redis·php
吃着火锅x唱着歌2 小时前
Effective C++ 学习笔记 条款33 避免遮掩继承来的名称
c++·笔记·学习
她说彩礼65万2 小时前
Asp.net core 返回类型
数据库·后端·asp.net
你想知道什么?2 小时前
Matplotlib学习笔记
笔记·学习·matplotlib
weixin_307779133 小时前
Linux下Docker Compose里运行Milvus向量数据库故障诊断Shell脚本
linux·运维·数据库·docker·milvus
m0_626535203 小时前
qwen2.5vl学习
学习