MySQL数据库设计与开发规范
发布日期:2025-04-17 23:24:31
浏览次数:16
分类:精选文章
本文共 2996 字,大约阅读时间需要 9 分钟。
数据库设计规范
1. 规范背景与目的
本规范旨在为公司线上业务提供数据库设计指导,涵盖变更流程、表设计、SQL编写等方面,确保系统稳定健康运行。
2. 设计规范
2.1 数据库设计
2.1.1 库名
强制:库名控制在32字符以内,模块表名尽量体现join关系,如
user和user_login。强制:命名格式为业务名称+子系统名,统一使用前缀。
强制:分库命名如
wenda_001,或按时间生成如db_20230301。强制:创建数据库时必须指定字符集为utf8或utf8mb4。
create database db1 default character set utf8;
2.1.2 表结构
- 强制:表必须有主键,
id为自增。 - 强制:禁止外键设计,程序端处理完整性。
- 强制:表名和列名不超过32字符,仅小写字母、数字和下划线。
- 强制:创建表时指定utf8或utf8mb4字符集。
- 强制:默认使用InnoDB,其他引擎需审核审批。
- 强制:建表必须有comment,字段级别也需注释。
- 建议:主键设为
id,使用bigint,避免随机插入性能问题。 - 建议:核心表添加
create_time和update_time。 - 建议:所有字段设为
NOT NULL,定义默认值。 - 建议:大字段垂直拆分,减少join查询。
- 建议:反范式设计,减少join操作。
- 强制:中间表和备份表定期清理。
- 强制:DDL变更需DBA审核,业务低峰期执行。
2.1.3 列数据类型优化
- 建议:自增列使用
bigint。 - 建议:状态字段如
status使用tinyint。 - 建议:IP地址使用
int代替char(15)。 - 建议:避免使用
enum和set,使用tinyint或smallint。 - 建议:大字段垂直拆分。
- 建议:存储金额使用
int或decimal。 - 建议:文本字段优先使用
varchar。 - 建议:时间字段优先使用
datetime。
2.1.4 索引设计
- 强制:InnoDB主键为
id,不可更新。 - 建议:索引命名统一,如
uk_或uq_。 - 强制:InnoDB和MyISAM索引为BTREE,MEMORY可选。
- 强制:单索引记录长度不超过64KB。
- 建议:表索引不超过5个,优先联合索引。
- 建议:多表join优先索引驱动表。
- 建议:避免冗余索引。
2.1.5 分库分表
- 强制:分区键必须索引。
- 强制:单分区表分区数不超过1024。
- 强制:分区表操作需策略,访问需分区键。
- 建议:单分区文件不超过2G,总大小不超过50G。
- 强制:分区表alter操作业务低峰期执行。
- 强制:分库数量不超过1024,分表不超过4096。
- 建议:分表建议不超过500万行。
2.1.6 字符集
- 强制:数据库、表、列字符集统一为utf8或utf8mb4。
- 强制:前端字符集与数据库一致。
2.1.7 建表示例
CREATE TABLE user ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户id', `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '用户ID', `username` varchar(45) NOT NULL DEFAULT '' COMMENT '真实姓名', `email` varchar(30) NOT NULL DEFAULT '' COMMENT '用户邮箱', `nickname` varchar(45) NOT NULL DEFAULT '' COMMENT '昵称', `avatar` int(11) NOT NULL DEFAULT '0' COMMENT '头像', `birthday` date NOT NULL DEFAULT '0000-00-00' COMMENT '生日', `sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '性别', `short_introduce` varchar(150) NOT NULL DEFAULT '' COMMENT '一句话介绍自己', `user_resume` varchar(200) NOT NULL DEFAULT '' COMMENT '用户简历地址', `user_register_ip` int NOT NULL COMMENT '注册IP', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE NOT NULL COMMENT '更新时间', `user_review_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '审核状态', PRIMARY KEY (`id`), UNIQUE KEY `uq_user_id` (`user_id`), KEY `idx_username` (`username`), KEY `idx_create_time` (`create_time`, `user_review_status`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '网站用户表';
3. SQL编写规范
3.1 DML语句
- 强制:SELECT指定字段,避免
*。 - 强制:INSERT指定字段,不要使用
values()。 - 建议:INSERT值列表不超过500。
- 建议:使用
UNION ALL替代UNION。 - 建议:IN列表控制在500以内。
- 建议:事务中批量操作控制数量。
- 强制:事务表必须为InnoDB。
- 强制:写入主库,读取从库。
- 强制:WHERE条件必须索引。
- 强制:禁止使用
hint。 - 强制:WHERE条件字段类型一致。
- 建议:减少全表扫描,避免超过25%数据量。
- 建议:避免全模糊LIKE,需其他条件配合。
- 建议:索引不使用函数或表达式。
3.2 多表连接
- 强制:禁止跨库join,减少耦合。
- 强制:禁止更新join语句。
- 建议:不建议子查询,优先join。
- 建议:多表join不超过3个表。
3.3 事务
- 建议:事务行数控制在1000以内。
- 建议:批量操作间隔时间控制。
- 建议:并发插入控制在200以内。
- 建议:更新语句基于主键或唯一键。
- 建议:避免外部调用在事务中。
- 建议:主从延迟敏感的查询强制访问主库。
3.4 排序和分组
- 建议:减少order by和group by。
- 建议:order by基于索引。
- 建议:结果集控制在1000行以内。
3.5 禁用SQL
- 高危:禁止带limit的update。
- 高危:禁止关联子查询。
- 强制:禁止存储过程、触发器等。
- 建议:禁止insert on duplicate key。
4. 其他规范
- 强制:DDL变更需DBA审核。
- 建议:减少程序端数据库连接数量。
- 建议:定期清理中间表和备份表。
发表评论
最新留言
表示我来过!
[***.240.166.169]2026年05月28日 00时41分17秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP:第一章——PHP中常量和预定义常量
2023-02-28
PHP:第一章——PHP中的位运算
2023-02-28
phpcms
2023-02-28
phpcms 2008 product.php pagesize参数代码注射漏洞
2023-02-28
phpcms V9 自定义添加 全局变量{DIY_PATH}方法
2023-02-28
Redis五种核心数据结构的基本使用与应用场景
2023-02-28
PHPCMS多文件上传和上传数量限制
2023-02-28
phpEnv的PHP集成环境
2023-02-28
PHPExcel一些基本设置总结
2023-02-28
PHPExcel导入导出 若在thinkPHP3.2中使用(无论实例还是静态调用(如new classname或classname::function)都必须加反斜杠,因3.2就命名空间,如/c...
2023-02-28
PHPMailer发送邮件
2023-02-28
phpmailer发送邮件,可以带附件
2023-02-28
phpmyadmin 安装
2023-02-28
phpmyadmin数据库建表及插入
2023-02-28
phprpc简单使用
2023-02-28
phpstorm中Xdebug的使用
2023-02-28
phpstorm中使用svn版本控制器
2023-02-28
phpstorm配置php脚本执行
2023-02-28
phpStudy安装教程
2023-02-28
phpunit
2023-02-28