数据库开发规范
第一章 总则
目的
为了更稳定的开展数据库相关的需求分析,设计,开发,测试,运维工作,便于不同团队对之间的沟通协调,以及在相关规范上达成共识,提升所有数据库相关工作的效率和可维护性以及提升数据库的稳定性。
标签
【禁止】严令禁止的数据库使用方式,如若必须使用,请先行与DBA团队沟通;
【不建议】尽量避免的数据使用方式,可以采取其他方案实现相关需求;
第二章 MySQL表相关字段设计规范
2.1:设计总则
1.所有命名采用 英文小写字 \数字\下划线 组成;
2.命名尽量短,长度不超过30个字符;
字段设.
3.命名尽量描述实体的内容,由英文单词、单词组合或单词缩写组成;
4.[禁止]命名禁止以数字和_开头;
5.[禁止]命名禁止使用SQL保留字段;
2.2:表设计规范
1.表名必须使用英文小写字母|数字一下划线组成;
2.若表名仅有一个单词,则使用完整的单词而非缩写
3.同一模块的表名尽可能使用相同的前缀,表名称尽可能表达含义;
4.[禁止] 禁止表名出现数字开头;
5.[禁止] 禁止表名两个下划线中间只出现数字
6.[禁止] 禁止在创建表时不设置主键;
7.尽量设置主键字段类型为BIGINT UNSIGNED;
8.尽量为表添加注释;
2.3:字段设计
1.字段名必须使用小写英文单词或单词缩写,一般不超过三个英文单词,以下划线分割。布尔类型的字
段以"is_"作为前缀;
2.字段名应尽可能表达字段的功能或意义;
3.各表之间意义相同的字段应同名;
4.下列字段命名需要统一( 各团队自行定义如下字段名称,但是必须要有)
created_by|created_time|modified_by|modified_time|disabled
5.每个字段需要添加字段注释;
6.不建议表中存储过多的字段;
7.[禁止] 禁止在数据库中使用blob、图片等大对象字段
8.Varchar字段长度不要过长;
9.[不建议]不建议使用不推荐的字段类型 (如布尔值)
10.[不建议] 不建议使用高于秒级精度的时间数据类型;
表名示例: 订单预览表:order_header 订单明细表:order_detail 付款日志表 :log_payment 字段名示例: 创建人:created_by 创建时间:created_time 修改人:modified_by 修改时间:modified_time| 是否删除/可见 :disabled |
第三章 MySQL索引设计规范
3.1:索引命名规范
1.非唯一索引必须按照”idx_<构成索引的字段名>”进行命名
2.唯一索引必须按照“uidx_<构成索引的字段名>"进行命名;
3.复合索引建议包含所有字段名,过长的字段名可以采用缩写形式,
3.2:索引创建
1.简洁原则,确定每个索引创建的必要性;
2.单个表上的索引个数不能超过6个;
3.在有单字段索引的情况下,尽量减少相应的的复合索引;
4.索引一定要创建在选择性高的字段上;
5. 使用自增字段作为主键,若使用联合自增主键时,将自增字段作为第一字段;
6.[不建议] 不建议使用外键等递归关系;
索引示例 在 age 字段上添加非唯一索引 idx_age ; 在 cardid 字段上添加唯一索 uidx_cardid ; 添加 age 字段和 name 字段的复合索引 idx_age_name ; |
第四章 MySQL查询/更新规范
1.[禁止]禁止SELECT的查询语句where条件不包含索引字段;
2.[禁止]禁止在WHERE条件中,对索引字段进行函数计算;
3.[禁止]禁止使用前项通配符执行SELECT语句,比如 where name like"%dewu";
4.[禁止]禁止使用没有通配符的LIKE查询;
5.[禁止] 禁止在WHERE子句中对字段进行NULL值判断;
6.[禁止] 禁止使用HINT,禁止使用FORCE INDEX、IGNORE INDEX;
7.[禁止] 禁止SELECT目标字段类型与表字段实际类型不一致;
8.[禁止] 禁止对于WHERE语句中的拥有索引的字段,不符合最左前缀匹配原则;
9.[禁止] 禁止IN语句中列表内的元素数量超过500;
10.[禁止]禁止使用负向查询,如: NOT IN、NOT LIKE:
11.[禁止] 禁止一次性大批量进行写操作,避免大事务;
第五章 前车之鉴,警钟长鸣
事件一: 隐式转换致使索引失效
1.首先展示引起故障的SQL语句
DELETE money FROM rec_feea_content WHERE contentid= 404761082 ; |
2.隐式转换的发生: 上述语句是删除目标表中 content_id 为12345678(整数型)的项,而查看表的SQL结构却发现,content_id 字段是字符串类型,此时MYSQL为了能让SELECT语句能正常进行,会将两个类型的数据转化为相同的数据类型再进行比较,而一旦数据类型发生变化,原有的根据此字段建立的索引自然就失效了。这就是隐式转换带来的索引失效;
3 . MYSQL高并发引起执行索引失效的语句,导致CPU负载激素上升
事件二: 笛卡尔积导致的RDS磁盘段时间暴涨,最终击穿存储
select l.id id, t1.warehouse_code warehouseCode, t1.tenant_code tenantCode, from inv_inventory tl LEFT JOIN bas_location t2 on t1.location_code = t2.location_code LEFT JOIN inbound_extend t5 0N t1.tenant_code = t5.tenant_id and t1.warehouse_code = t2.warehouse_codeWHERE t1.tenant_code = ' 3 ! AND t1.warehouse_code in ( '95SH04' ,95SH03 ,95SH02 ')AND t2.area_code in (' 9A') and t5.washed = 0 order by id desc limit 20 |
上面的SQL的表在连接查询时,连接字段的值重合度高,再加上where条件的数据过滤效果很差,最终会形成一个极大的笛卡尔积,如果我们 MySQL 没有设置查询语句超时时间,就会导致该语句需要的空间无限膨胀,最终击穿我们的可用存储;
3.结论:数据暴涨不是因为insert,而是不合理的join操作导致创建临时表过大导致的磁盘空间极速占用;
第六章 禁止类规范
1.[禁止] 禁止修改字段名;
2.[禁止] 禁止“随意”修改字段类型!
3.[禁止] 禁止使用联合主键、禁止使用字符串做主键;
4.[禁止] 禁止在创建表时不设置主键;
5.[禁止] 禁止在数据库中使用BLOB、图片等大对象字段;
6.[禁止] 禁止删除主键;
7.[禁止] 禁止UPDATE主键;
8.[禁止] 禁止自定义字段字符集,字符集统一使用utf8mb4;
9 .[禁止] 禁止使用讨多的JIOIN操作;
11.[禁止] 禁止使用视图、存储过程、触发器、自定义函数
12.[禁止] 禁止别名与表或字段的名字相同;
13.[禁止] 禁止将索引创建在选择性低的字段上;
14.[禁止] 禁止“随意”删除索引,删除前请和DBA团队确认;
15.[禁止] 禁止SQL查询顺序与索引顺序不匹配 (不考虑ICP的情况下) ;
16.[禁止] 禁止在表上创建过多的索引;
17.[禁止] 禁止在默认值为空的字段上创建索引;
18.[禁止] 禁止使用select *进行查询;
19.[禁止] 禁止select count (*) ;
20.[禁止] ]禁止隐式转换查询,
21.[禁止] 禁止时间类型的隐式转换
22.[禁止] 禁止3B操作、大事务、大SOL、大批量。5000行
23.[禁止] 禁止使用跨数据库的联接查询
24.[禁止] 禁止在顺序子句中对多个条件使用不同方向的排序;
25.[禁止] 禁止使用%前缀模糊查询,如“%vcredit”;
26.[禁止] 禁止随意进行深度分页查询;
27.[禁止] 整止对索引列进行函数计算和数值计算:
28.[禁止] 禁止使用FORCE INDEX或IGNORE INDEX;
29.[禁止] 禁止在使用UPDATE语句时不指定WHERE条件;
30.[禁止] 禁止在使用UPDATE或者DELETE语句时中加入LIMIT条件;
31.[禁止] 禁止设置utf8mb4以外的字符集,统一字符集使用;
第七章 不建议类规范
1.[不建议] 不建议主键ID,或者其他可能位数过长的字段使用INT,能unsigned最好!
2.[不建议] 不建议使用float和double类型;
3.[不建议] 不建议设置字段字符集;
4.[不建议] 不建议在一个表中存储多个长度较大的varchar字段、text字段;
5.[不建议] 不建议使用不推荐的字段类型(如BOOLEAN);
6.[不建议] 不建议将BLOB和TEXT类型的字段设置为NOT NULL;
7.[不建议] 不建议对已存在int bigint字段,修改为unsigned;
8.[不建议] 不建议varchar(n)过长,n表示的是字符数不是字节数,4000以内;
9.[不建议] 不建议对每个查询单独创建索引;
10.[不建议] 不建议新表不带索引上线;
11 .[不建议] 不建议联表删除或更新;
12. [不建议] 不建议在OTLP场景下多表join查询;
13. [不建议] 不建议in的格式超过200;
14. [不建议] 不建议使用or;
15.[不建议] 不建议使用大SQL;
16.[不建议] 不建议流量高峰期使用truncate table 操作;
17.[不建议] 不建议使用负向查询,not ,!=, <>,!<>,not exist,not in ,not like;
18.[不建议] 不建议使用insert on duplicate key update;
19.[不建议] 不建议表中存储过多的字段;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)