说来惭愧,这是耽误了将近1年的工作,一直零零散散拖着没做完,昨天总算是卯着劲出了一个版本。

最初是打算更新一版MySQL开发规范,把一些新的技术栈和思路都更新迭代,与时俱进,但是做了一段时间,发现这件事情比自己想得要复杂。比如:

1)索引设计规范,就得从更高的维度去思考什么样的索引是最合适的,需要有哪几个重点要素考量,这个话题就开水考验我的思考能力了。

2)SQL设计规范,什么样的SQL是最合理的,也需要提炼SQL质量模型,还得带一些通用性,同时具备实用性,否则就都是废话了。

先说说总体的成果,SQL开发规范我是打算拆分为5个部分,包括数据库命名规范,对象结构设计规范,SQL优化设计规范、高并发设计规范和开发规范落地指南,这是循序渐进,从基础到进阶落地的内容组织形式。

对这五个部分的定位和标签是:

1)数据库命名规范:规范始于命名

2)对象结构设计:结构设计是基石

3)SQL优化设计规范:SQL性能无小事

4)高并发设计规范:并发高阶必备技

5)开发规范落地指南:快速稳落地

我先列出一部分的内容,比如数据类型设计规范,是属于对象结构设计章节的。

数据库类型主要以MySQL为例进行说明,主要包括数值类型,字符类型和日期类型:

数值类型

注:

1)用户pid数据类型,根据平台统一规划应设计为bigint unsigned

2)MySQL中每个数据表中字段数量尽可能少且字段长度尽可能小,可以用int的则不能用bigint,能用tinyint的不能用int;

3)对于布尔值的设置,建议使用TINYINT来代替布尔类型

4)不建议使用ENUM类型,可使用TINYINT来代;

5)用DECIMAL代替FLOAT和DOUBLE存储精确浮点数;

6)使用无符号整型(UNSIGNED)存储非负整数;

7)在存储IP地址时,不建议存储成字符型数据,建议使用INT UNSIGNED,建议从应用层面控制IP地址的格式转换;

字符类型

注:

1)对于可变长字符串VARCHAR,只分配真正需要的空间;

2)多个数据表中都有相同属性字段时,数据类型和属性需保持一致;如同样表示用户名的字段,需要在各相关表中都设置同样的属性:varchar(20)

3)尽可能不使用TEXT、BLOB类型,这类大对象在数据库存储和使用时,比较容易产生存储和性能问题;

4)数据库中不允许存储大文件,或者照片,可以将大对象放到其他存储上,数据库中存储它的路径。

日期类型

注:

1)普遍情况,建议使用datetime,因为datetime和timestamp的存储占用空间不同,datetime占用8个字节,timestamp占用4个字节,所以说timestamp支持的时间范围要窄一些。范围为:1970-01-01 08:00:01到2038-01-19 11:14:07 而datetime支持的时间范围则要大很多。1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

2)如果对于时间类型字段需要设置动态的默认值,在MySQL 5.6.5以前不支持,需要使用timestamp,或者不设置默认值。

3)date数据类型的精度较低,如果精度为日,则优先使用。

4)日期和时间字段精确度到“秒”,建议使用unix时间戳格式存储(数据类型为int),在展示的时候需要注意一下时区问题;每条记录都需要有插入时间字段,如果有需要,可以增加记录修改时间字段;重要的数据记录和数据操作,可以记录日志。