mysql 开发规范_专业级的MySQL开发设计规范及SQL编写规范

在团队开发过程中为了项目的稳定,代码的高效,管理的便捷制定内部种开发设计规范是必不可少的,

这里分享一份我们定义MySQL开发设计规范包括表设计规范,字段设计规范,SQL编写规范

数据库对象命名规范

数据库对象

命名规范的对象是指数据库SCHEMA、表TABLE、索引INDEX、约束CONSTRAINTS等的命名约定

数据库对象命名原则

命名使用具有意义的英文词汇,词汇中间以下划线分隔

命名只能使用英文字母、数字、下划线

避免用MySQL的保留字如:call、group等

所有数据库对象使用小写字母

数据库命名规范

数据库名不能超过30个字符

数据库命名必须为项目英文名称或有意义的简写

数据库创建时必须添加默认字符集和校对规则子句。默认字符集为UTF8(已迁移dumbo的使用utf8mb4)

命名应使用小写

表命名规范

同一个模块的表尽可能使用相同的前缀,表名称尽可能表达含义

多个单词以下划线(_)分隔

表名不能超过30个字符

普通表名以t_开头,表示为table,命名规则为t_模块名(或有意义的简写)_+table_name

临时表(运营、开发或数据库人员临时用作临时进行数据采集用的中间表)命名规则:加上tmp前缀和8位时间后缀(tmp_test_user_20181109)

备份表(DBA备份用作保存历史数据的中间表)命名规则:加上bak前缀和8位时间后缀(bak_test_user_20181109)

命名应使用小写

字段命名规范

字段命名需要表示其实际含义的英文单词或简写,单词之间用下划线(_)进行连接

各表之间相同意义的字段必须同名

字段名不能超过30个字符

用户命名规范

生产使用的用户命名格式为 code_应用

只读用户命名规则为 read_应用

数据库对象设计规范

存储引擎的选择

如无特殊需求,必须使用innodb存储引擎

字符集的选择

如无特殊要求,必须使用utf8或utf8mb4

表设计规范

不同应用间所对应的数据库表之间的关联应尽可能减少,不允许使用外键对表之间进行关联,确保组件对应的表之间的独立性,为系统或表结构的重构提供可能性

表设计的角度不应该针对整个系统进行数据库设计,而应该根据系统架构中组件划分,针对每个组件所处理的业务进行数据库设计

表必须要有PK

一个字段只表示一个含义

表不应该有重复列

禁止使用复杂数据类型(数组,自定义等)

需要join的字段(连接键),数据类型必须保持绝对一致,避免隐式转换

设计应至少满足第三范式,尽量减少数据冗余。一些特殊场景允许反范式化设计,但在项目评审时需要对冗余字段的设计给出解释

TEXT字段必须放在独立的表中,用PK与主表关联。如无特殊需要,禁止使用TEXT、BLOB字段

需要定期删除(或者转移)过期数据的表,通过分表解决

单表字段数不要太多,建议最多不要大于50个

MySQL在处理大表时,性能就开始明显降低,所以建议单表物理大小限制在16GB,表中数据控制在2000W内

如果数据量或数据增长在前期规划时就较大,那么在设计评审时就应加入分表策略

无特殊需求,严禁使用分区表

字段设计规范

INT:如无特殊需要,存放整型数字使用UNSIGNED INT型。整型字段后的数字代表显示长度

DATETIME:所有需要精确到时间(时分秒)的字段均使用DATETIME,不要使用TIMESTAMP类型

VARCHAR:所有动态长度字符串 全部使用VARCHAR类型,类似于状态等有限类别的字段,也使用可以比较明显表示出实际意义的字符串,而不应该使用INT之类的数字来代替;VARCHAR(N),N表示的是字符数而不是字节数。比如VARCHAR(255),可以最大可存储255个字符(字符包括英文字母,汉字,特殊字符等)。但N应尽可能小,因为MySQL一个表中所有的VARCHAR字段最大长度是65535个字节,且存储字符个数由所选字符集决定。如UTF8存储一个字符最大要3个字节,那么varchar在存放占用3个字节长度的字符时不应超过21845个字符。同时,在进行排序和创建临时表一类的内存操作时,会使用N的长度申请内存。(如无特殊需要,原则上单个varchar型字段不允许超过255个字符)

TEXT:仅仅当字符数量可能超过20000个的时候,才可以使用TEXT类型来存放字符类数据,因为所有MySQL数据库都会使用UTF8字符集。所有使用TEXT类型的字段必须和原表进行分拆,与原表主键单独组成另外一个表进行存放。如无特殊需要,严禁开发人员使用MEDIUMTEXT、TEXT、LONGTEXT类型

对于精确浮点型数据存储,需要使用DECIMAL,严禁使用FLOAT和DOUBLE

如无特殊需要,严禁开发人员使用BLOB类型

如无特殊需要,字段建议使用NOT NULL属性,可用默认值代替NULL

自增字段类型必须是整型且必须为UNSIGNED,推荐类型为INT或BIGINT,并且自增字段必须是主键或者主键的一部分

索引设计规范

索引必须创建在索引选择性选择性较高的列上,选择性的计算方式为: select count(distinct(col_name))/count(*) from tb_name;如果结果小于0.2,则不建议在此列上创建索引,否则大概率会拖慢SQL执行

组合索引的首字段,必须在where条件中,对于确定需要组成组合索引的多个字段,建议将选择性高的字段靠前放

禁止使用外键

Text类型字段如果需要创建索引,必须使用前缀索引

单张表的索引数量理论上应控制在5个以内。经常有大批量插入、更新操作表,应尽量少建索引

ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面,形成覆盖索引

尽量使用Btree索引,不要使用其它类型索引

约束设计规范

PK应该是有序并且无意义的,尽量由开发人员自定义,且尽可能短,使用自增序列。

表中除PK以外,还存在唯一性约束的,可以在数据库中创建以“uidx_”作为前缀的唯一约束索引。

PK字段不允许更新。

禁止创建外键约束,外键约束由应用控制。

如无特殊需要,所有字段必须添加非空约束,即not null。

如无特殊需要,所有字段必须有默认值。

SQL编写规范

尽量避免使用select *,join语句使用select *可能导致只需要访问索引即可完成的查询需要回表取数

严禁使用select * from table而不加任何where条件

MySQL中的text类型字段存储的时候不是和由其他普通字段类型的字段组成的记录存放在一起,而且读取效率本身也不如普通字段块。如果不需要取回text字段,又使用了select *,会让完成相同功能的sql所消耗的io量大很多,而且增加部分的io效率也更低下

在取出字段上可以使用相关函数,但应尽可能避免出现now(),rand(),sysdate(),current_user()等不确定结果的函数,在Where条件中的过滤条件字段上严禁使用任何函数,包括数据类型转换函数

所有连接的SQL必须使用Join ... On ...方式进行连接,而不允许直接通过普通的Where条件关联方式。外连接的SQL语句,可以使用Left Join On的Join方式,且所有外连接一律写成Left Join,而不要使用Right Join

分页查询语句全部都需要带有排序条件,除非应用方明确要求不要使用任何排序来随机展示数据

WHERE条件中严禁在索引列上进行数学运算或函数运算

用in()/union替换or,并注意in的个数小于300

严禁使用%前缀进行模糊前缀查询:如:select id,val from table where val like ‘%name';可以使用%模糊后缀查询如:select id,val from table where val like ‘name%'

严禁使用INSERT ON DUPLICATE KEY UPDATE、REPLACE INTO、INSERT IGNORE

本文做个抛砖引玉,每个团队都有自己的开发设计规范,Mysql开发设计规范不单单只有这些,希望本文对您有所启发

本文标题: 专业级的MySQL开发设计规范及SQL编写规范

本文地址: http://www.cppcns.com/shujuku/mysql/364484.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之explicit关键字使用总结

1、explicit关键字介绍 C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式). 2、贴代码 #include <iostream> #include <stdi…

系统下载地址

系统下载地址 http://pan.baidu.com/s/1o6hVbPC 其中有xp win7和win8 32位 win7和win8 64位转载于:https://blog.51cto.com/freedom886/1403433

聊一聊DTM子事务屏障功能之SQL Server版

背景 前面写了两篇&#xff08;聊一聊如何用C#轻松完成一个SAGA分布式事务和聊一聊如何用C#轻松完成一个TCC分布式事务&#xff09;如何用 C# 基于 DTM 轻松实现 SAGA 和 TCC 的分布式事务&#xff0c;其中有一个子事务屏障的功能&#xff0c;很好的处理了空补偿、悬挂、重复请…

更为详细的Txtsetup.sif文件解释

更为详细的Txtsetup.sif文件解释;代码页定义, 以免文本安装模式下无法正常显示简体中文 (以下基本都是跟简体中文相关的, 不同语言版本的 Windows, 此处定义也不同)[nls]AnsiCodepage c_936.nls,936OemCodepage c_936.nls,936MacCodepage c_10008.nls,10008UnicodeCasetable…

C++类与const关键字

1、const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字 const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的 2、const 成员函数也称为常成员函数。 常成员函数需要在声明…

Dos中转义符

遇到个问题&#xff1a; java test R<file> 11 22 按理说应该打印 R<file>1122但是&#xff0c;系统报错&#xff0c;写的是系统找不到指定文件。 是"<>"引起的&#xff0c;加上Dos转义符中"^"即可。 java test R^<file^> 11 22 测…

ORA-00257+mysql_ORA-00257错误的解决办法

author&#xff1a; headsen chendate&#xff1a; 2018-04-17 11:12:39notice&#xff1a;个人原创&#xff0c;转载请注明作者和出处&#xff0c;否则依法追击法律责任。1&#xff0c;oracle数据库正常使用中&#xff0c;突然报ora-00257的错误&#xff0c;原因是归档日志满…

可穿戴设备对企业的积极意义

在耐克裁掉该公司的FuelBand运动手环硬件部门后&#xff0c;众多媒体和肇事者即开始唱衰可穿戴设备。在这些唱衰可穿戴的人总&#xff0c;有一些人从来没有用过可穿戴设备&#xff0c;有的甚至都没有见过可穿戴设备&#xff0c;他们只是根据自己的臆想&#xff0c;过往的经验&a…

学习路线

为什么80%的码农都做不了架构师&#xff1f;>>> 一、构想 1.专门制定某领域学习路线。 2.为人们进入某领域而学习提供依据。 转载于:https://my.oschina.net/kun123/blog/838360

C++之inline函数使用总结

一、C++为什么引入inline函数? 主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题。 C语言中的宏定义,它使用预处理器实现,没有了参数压栈、代码生成等一系列得到操作,因此效率很高。 但缺点如下: 预处理器符号表中的简单替换,不能进行参数…

数字图像处理技术在TWaver可视化中的应用

数字图像处理&#xff08;Digital Image Processing&#xff09;又称为计算机图像处理&#xff0c;它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。常用的图像处理方法有图像增强、复原、编码、压缩等&#xff0c;数字图像处理应用领域非常广泛。具体关于数字…

WPF 实现调用本机摄像头~

WPF开发者QQ群&#xff1a;340500857由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。接着很久前的上一篇此项目使用了OpenCVSharp加载本地摄像头&#xff0c;多个摄像头支持切换展示&…

python process 函数_Python Process创建进程的2种方法详解

前面介绍了使用 os.fork() 函数实现多进程编程&#xff0c;该方法最明显的缺陷就是不适用于 Windows 系统。本节将介绍一种支持 Python 在 Windows 平台上创建新进程的方法。Python multiprocessing 模块提供了 Process 类&#xff0c;该类可用来在 Windows 平台上创建新进程。…

全球增长最快域名解析商Top10:中国占据四席

IDC评述网&#xff08;idcps.com&#xff09;04月29日报道&#xff1a;根据国外域名统计机构DailyChanges最新实时数据显示&#xff0c;4月27日&#xff0c;在全球增长最快的十家域名解析服务商榜单中&#xff0c;中国占据四个席位。上榜的中国域名解析商分别是&#xff1a;51D…

webpake-node-sass 报错

问题描述&#xff1a; npm run dev 就报错&#xff0c;在安装node-sass错误 解决方法 &#xff1a; 找到node_modules下的node-sass文件&#xff0c;进入&#xff0c;如果没有vendor文件夹&#xff0c;就创建一个空文件夹&#xff0c;命名为vendor。 1:下载 对于版本的 binding…

C++之‘nullptr’ was not declared in this scope

在vim里面写了一个简单cpp文件,为了避免野指针,需要指针初始化 char *p2 = nullptr 1、编译时报错如下 2、解决办法 编译加上 g++ -std=gnu++0x int.cpp -o int 3、C里面的null和C++里面的nullptr、NULL介绍 NULL在C++中的定义 /* Define NULL pointer value */ #ifndef …

IOS原生地图与高德地图

原生地图 1、什么是LBS LBS: 基于位置的服务 Location Based Service 实际应用:大众点评&#xff0c;陌陌&#xff0c;微信&#xff0c;美团等需要用到地图或定位的App 2、定位方式 1.GPS定位 2.基站定位 3.WIFI定位 3、框架 MapKit:地图框架&#xff0c;显示地图 …

想说爱你不容易 | 使用最小 WEB API 实现文件上传

前言在 .NET 6 之前&#xff0c;实现文件上传功能十分简单&#xff1a;[HttpPost("upload")] public async Task<IActionResult> Upload(IFormFile file) {//对file执行操作return Ok(file.FileName); }但是&#xff0c;当使用 .NET 6 的最小 WEB API 来实现相…

python商用_python实现sm2和sm4国密(国家商用密码)算法的示例

GMSSL模块介绍GmSSL是一个开源的加密包的python实现&#xff0c;支持SM2/SM3/SM4等国密(国家商用密码)算法、项目采用对商业应用友好的类BSD开源许可证&#xff0c;开源且可以用于闭源的商业应用。安装模块pip install gmsslSM2算法RSA算法的危机在于其存在亚指数算法&#xff…

Android下载文件

2019独角兽企业重金招聘Python工程师标准>>> package com.test;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URL;import java.net.URLConnection;import android.app.Activity;import android.content.Intent…