博客
关于我
MySQL数据库设计与开发规范
阅读量:788 次
发布时间:2023-02-12

本文共 2996 字,大约阅读时间需要 9 分钟。

数据库设计规范

1. 规范背景与目的

本规范旨在为公司线上业务提供数据库设计指导,涵盖变更流程、表设计、SQL编写等方面,确保系统稳定健康运行。

2. 设计规范

2.1 数据库设计

2.1.1 库名

  • 强制:库名控制在32字符以内,模块表名尽量体现join关系,如useruser_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_timeupdate_time
  • 建议:所有字段设为NOT NULL,定义默认值。
  • 建议:大字段垂直拆分,减少join查询。
  • 建议:反范式设计,减少join操作。
  • 强制:中间表和备份表定期清理。
  • 强制:DDL变更需DBA审核,业务低峰期执行。

2.1.3 列数据类型优化

  • 建议:自增列使用bigint
  • 建议:状态字段如status使用tinyint
  • 建议:IP地址使用int代替char(15)
  • 建议:避免使用enumset,使用tinyintsmallint
  • 建议:大字段垂直拆分。
  • 建议:存储金额使用intdecimal
  • 建议:文本字段优先使用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审核。
  • 建议:减少程序端数据库连接数量。
  • 建议:定期清理中间表和备份表。

转载地址:http://ijdfk.baihongyu.com/

你可能感兴趣的文章
mysql数据分组索引_MYSQL之索引配置方法分类
查看>>
mysql数据取差,mysql屏蔽主外键关联关系
查看>>
MySQL数据和Redis缓存一致性方案详解
查看>>
MySQL数据和Redis缓存一致性方案详解
查看>>
Mysql数据库 InnoDB存储引擎中Master Thread的执行流程
查看>>
MySQL数据库 范式
查看>>
Mysql数据库B-Tree索引
查看>>
mysql数据库io空闲_mysql数据库磁盘io高的排查
查看>>
mysql数据库root密码忘记,查看或修改的解决方法
查看>>
MySQL数据库SQL注入靶场sqli通关实战(附靶场安装包)
查看>>
MYSQL数据库下载安装(Windows版本)
查看>>
MySQL数据库与Informix:能否创建同名表?
查看>>
mysql数据库中的数据如何加密呢?mysql8.0自带新特性
查看>>
MySQL数据库优化
查看>>
MySQL数据库优化总结
查看>>
MySQL数据库入门看这一篇文章就够了
查看>>
Mysql数据库函数contac_函数:函数删除操作语法&使用例——《mysql 从入门到内卷再到入土》...
查看>>
mysql数据库命令备份还原
查看>>
mysql数据库基础教程
查看>>
MySQL数据库备份
查看>>