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 更容易扩展,也更容易维护。
相关推荐
凌虚5 分钟前
面向 MySQL 用户的 PostgreSQL 快速上手指南
数据库·后端·架构
五阿哥永琪14 分钟前
MySQL中操作json的函数!
数据库·mysql·json
来者皆善19 分钟前
了解Mysql优化吗?如何优化索引?
数据库·mysql
MartinYeung53 小时前
[论文学习]OSReward:为跨平台计算机使用奖励模型建立标准化评估
人工智能·学习
dong1326973 小时前
Agent Skills学习笔记
笔记·学习
赤壁小虾3 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
MC皮蛋侠客3 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python
for_ever_love__3 小时前
iOS:网络请求再学习
网络·学习·ios·objective-c
世人万千丶4 小时前
鸿蒙Crash高级捕获与异常监控:全局异常兜底/崩溃栈解析/符号表还原/智能聚类/闭环修复
学习·机器学习·华为·数据挖掘·harmonyos·鸿蒙·聚类
奈斯先生Vector4 小时前
把 Midjourney 二次编辑做成生产系统:customId 能力令牌、Action Graph 与 WebUI 精修工作台
数据库·人工智能·架构·aigc·音视频·midjourney