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

发布时间:2026/7/13 22:28:20
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_timeTypeORM EntitycreateTimeORM 会负责映射。三、字段命名规范推荐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 id1;直接删除。企业很多不会这样。例如用户注销账号。如果直接DELETE那么订单user_id怎么办找不到用户。所以企业更多UPDATE user SET deleted1 WHERE id1;数据仍然存在。只是查询WHERE deleted0这样既能恢复。又能保证历史数据完整。七、状态字段设计很多业务不要多个布尔字段。例如错误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 本章核心一句话企业数据库设计追求的不是能用而是易维护、易扩展、高性能。良好的数据库设计可以让项目在多年迭代中依然保持清晰、稳定。本章思考题为什么企业推荐使用BIGINT作为主键而不是INT或username企业推荐使用BIGINT AUTO_INCREMENT作为主键因为它容量大、稳定、不受业务变化影响。为什么金额字段必须使用DECIMAL而不能使用FLOAT或DOUBLE因为FLOAT 和 DOUBLE 属于浮点数会产生精度误差而金额必须保证精确计算。为什么很多企业采用软删除而不是直接执行DELETE数据逻辑上删除物理上仍然保留。为什么数据库字段通常使用snake_case下划线命名而 Java/TypeScript 使用camelCase驼峰命名因为这是各自领域长期形成的规范。为什么推荐使用status字段而不是多个is_xxx布尔字段因为status 更容易扩展也更容易维护。