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 更容易扩展,也更容易维护。
相关推荐
敲代码的嘎仔11 分钟前
互动问答系统实战:两级评论模型、ES 搜索集成、Caffeine 多级缓存全记录
java·开发语言·数据库·elasticsearch·缓存·mybatis·高并发
倔强的石头_12 分钟前
SQL Server数据库迁移,为什么 KES V9R4C019 能把改代码变成改连接
数据库
那年窗外下的雪.14 分钟前
AIDC 学习日志|第 25 天|设备输出反推、MAC Flapping 与 EAD 撤销
前端·网络·git·学习·macos
黑色的白兔No123 分钟前
deepin 25安装mysql
数据库·mysql·debian
个 人 练 习 生36 分钟前
数据结构:排序算法详解
c语言·数据结构·经验分享·学习·算法·排序算法
cc57250265338 分钟前
2026 秋招采购数据分析校招 JD、面试真题与项目准备|2027 届求职复盘
数据库
老当益壮梁奶奶40 分钟前
51单片机中断系统详解
c语言·单片机·嵌入式硬件·学习·51单片机
程序员清风1 小时前
Python 操作 MySQL、Redis 与消息队列的完整实践
redis·python·mysql
风哥2号2 小时前
数据库教程FGMT28‑Windows‑MySQL5.7‑8.0‑8.4-9.7安装配置
数据库·mysql
sunshine22 girl9 小时前
Java学习二 基本语法2, 算术运算符
java·学习