说明
- 是否遵守共同的开发规范是决定产品成败的关键,所以编写规范的目的是让所有数据开发人员在开发过程中有依可循。
数据库库表设计规范
- 猪八戒所有的数据库、表原则上统一使用utf8编码,如果需要使用emoji表情请使用utf8mb4编码。
- 所有数据库名以zhubajie_打头,库名、表名必须使用下划线分割开,全部用小写字母,表名以库名的首字母缩写作为前缀(如zhubajie_market库下所有的表都以mk_打头),以保证该表的全局唯一性。
- 库名表名都是用名词,不使用动词,能见名知意。
- 数据库引擎建议使用innodb 尽量不要使用myisam,日志尽量使用tokudb。
- 存储精度浮点数必须使用decimal替代float和double。
- 非负值的数字统一使用unsigned类型存储。
- 必须使用int unsigned存储IPV4。
- 整形定义中,不添加字段长度,比如使用int而不是int(5),即便定义了对字段长度、占用空间也没有意义。
- 能使用短数据类型的尽量使用短数据类型。比如取值范围是0-255时,使用tinyint unsigned。
- 使用tinyint类型代替enum类型(记录状态)。
- 尽可能不适用text,禁止使用blob类型。如果必须使用text和blob类型,建议把该字段拆分独立成一个表。
- 新版本的varchar(N)其中N是字节数而不是字符数。控制在255内。
- 存储年使用year类型。
- 存储日期使用date类型,默认值禁止使用0000-00-00,正确的应该使用linux最小时间戳1970-01-01,或者当前时间戳CURRENT_TIMESTAMP。
- 使用精确时间戳(精确到秒)尽量使用timestamp类型,因为timestamp使用4字节,datetime使用8字节。
- 必须将字段定义为not null,需要null时设置默认值(除text之外)。
- 禁止在数据库中使用varbinary、blob存储图片、文件等。
- 新建表必须添加create_time(创建时间)、update_time(更新时间),类型为timestamp,默认值为CURRENT_TIMESTAMP。例如:
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', -
建表语句示例
CREATE TABLE `gift_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) DEFAULT NULL COMMENT '礼品类别id',
`securities` varchar(100) DEFAULT NULL COMMENT '券号',
`gift_isdelte` int(11) DEFAULT '2' COMMENT '是否删除【1是,2否】',
`gift_sendstatus` int(11) DEFAULT '1' COMMENT '礼品发送状态【1待发送,2已发送,3发送失败】',
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '礼品发放';
索引设计规范
- 索引的命名统一以idx_开头,后面包括索引字段名字,分别以下划线分隔,每一个字段只能占用一个名字位。如idx_id_name(这是一个符合索引,包含了id和name两个字段)
- 索引名称必须使用小写。
- 复合索引的字段数不能超过5个。
- 单表的索引数量尽量控制在5个以内。
- 必须设置唯一主键,尽量使用自增id作为主键。
- 联合索引的字段排列顺序以去重后字段的数值的个数大小排序先后顺序。比如表mk_task有id,name,id有50000个独立值,name有5000个独立值,那么,顺序是id在name前面,建立的索引是idx_id_name。
- Order by、distinct、group by后的字段尽量建立索引。
- 状态字段建立索引,比如性别字段(只有2个选项)。
- 根据update、delete的where尽量使用有索引的字段或主键。
- 超过20字节的varchar字段建议建立前缀索引。
- 合理创建联合索引(避免冗余),(a,b,c)相当于(a)、(a、b)、(a、b、c)。
- 不能使用数据库外键,由程序保证。
- Text类型字段不能使用索引。
- where语句中必须使用合适的数据类型,避免mysql进行隐式类型转换。如id列定义成了varchar(20),我们的sql写成select name from table where id=100;这样的sql会发生隐式类型转换。
- 尽量不使用mysql函数,把逻辑实现在应用程序里。
- 禁止使用整表count。
- 禁止使用存储过程、视图、事件、触发器。
SQL语句开发规范
- 控制sql的in列表值小于50个。
- where语句中必须使用合适的数据类型,避免mysql进行隐式类型转换。
- 禁止使用select *,select只获取需要的字段。
- insert必须显示指明字段名称,如:不能使用insert into table values();必须使用insert into addressbook(fname,lname,phone,fax,email) values('Rob',Rabbit,'674 1536','382 8364','rob@some.domain');这种方式。
- 避免使用不等于条件,where条件中的不等于不能使用索引。
- 合理使用分页提高分页效率,避免使用大的偏移量分页,如select id from user limit 1000,10。
- 统计表中记录使用count(*),不适用count(primary_key)和count(1)。
- 禁止jira提交的任何sql脚本包含drop语句,如果上线确实需要drop表,请找dba单独说明。
- 所有生产环境的sql都需要提jira申请,然后再执行。
- 线上统计性质sql,left join表数量不能超过3个。
- 禁止使用强制索引,如 select id from user use index(idx_user_id) where user_id = 123;
-
对同一个表的多次alter操作必须合并为一次操作,如 alter table t add column b varchar(10),add index idx_aa(aa);
Mysql开发规范
说明
- 是否遵守共同的开发规范是决定产品成败的关键,所以编写规范的目的是让所有数据开发人员在开发过程中有依可循。
数据库库表设计规范
- 猪八戒所有的数据库、表原则上统一使用utf8编码,如果需要使用emoji表情请使用utf8mb4编码。
- 所有数据库名以zhubajie_打头,库名、表名必须使用下划线分割开,全部用小写字母,表名以库名的首字母缩写作为前缀(如zhubajie_market库下所有的表都以mk_打头),以保证该表的全局唯一性。
- 库名表名都是用名词,不使用动词,能见名知意。
- 数据库引擎建议使用innodb 尽量不要使用myisam,日志尽量使用tokudb。
- 存储精度浮点数必须使用decimal替代float和double。
- 非负值的数字统一使用unsigned类型存储。
- 必须使用int unsigned存储IPV4。
- 整形定义中,不添加字段长度,比如使用int而不是int(5),即便定义了对字段长度、占用空间也没有意义。
- 能使用短数据类型的尽量使用短数据类型。比如取值范围是0-255时,使用tinyint unsigned。
- 使用tinyint类型代替enum类型(记录状态)。
- 尽可能不适用text,禁止使用blob类型。如果必须使用text和blob类型,建议把该字段拆分独立成一个表。
- 新版本的varchar(N)其中N是字节数而不是字符数。控制在255内。
- 存储年使用year类型。
- 存储日期使用date类型,默认值禁止使用0000-00-00,正确的应该使用linux最小时间戳1970-01-01,或者当前时间戳CURRENT_TIMESTAMP。
- 使用精确时间戳(精确到秒)尽量使用timestamp类型,因为timestamp使用4字节,datetime使用8字节。
- 必须将字段定义为not null,需要null时设置默认值(除text之外)。
- 禁止在数据库中使用varbinary、blob存储图片、文件等。
- 新建表必须添加create_time(创建时间)、update_time(更新时间),类型为timestamp,默认值为CURRENT_TIMESTAMP。例如:
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', -
建表语句示例
CREATE TABLE `gift_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) DEFAULT NULL COMMENT '礼品类别id',
`securities` varchar(100) DEFAULT NULL COMMENT '券号',
`gift_isdelte` int(11) DEFAULT '2' COMMENT '是否删除【1是,2否】',
`gift_sendstatus` int(11) DEFAULT '1' COMMENT '礼品发送状态【1待发送,2已发送,3发送失败】',
`create_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '礼品发放';
索引设计规范
- 索引的命名统一以idx_开头,后面包括索引字段名字,分别以下划线分隔,每一个字段只能占用一个名字位。如idx_id_name(这是一个符合索引,包含了id和name两个字段)
- 索引名称必须使用小写。
- 复合索引的字段数不能超过5个。
- 单表的索引数量尽量控制在5个以内。
- 必须设置唯一主键,尽量使用自增id作为主键。
- 联合索引的字段排列顺序以去重后字段的数值的个数大小排序先后顺序。比如表mk_task有id,name,id有50000个独立值,name有5000个独立值,那么,顺序是id在name前面,建立的索引是idx_id_name。
- Order by、distinct、group by后的字段尽量建立索引。
- 状态字段建立索引,比如性别字段(只有2个选项)。
- 根据update、delete的where尽量使用有索引的字段或主键。
- 超过20字节的varchar字段建议建立前缀索引。
- 合理创建联合索引(避免冗余),(a,b,c)相当于(a)、(a、b)、(a、b、c)。
- 不能使用数据库外键,由程序保证。
- Text类型字段不能使用索引。
- where语句中必须使用合适的数据类型,避免mysql进行隐式类型转换。如id列定义成了varchar(20),我们的sql写成select name from table where id=100;这样的sql会发生隐式类型转换。
- 尽量不使用mysql函数,把逻辑实现在应用程序里。
- 禁止使用整表count。
- 禁止使用存储过程、视图、事件、触发器。
SQL语句开发规范
- 控制sql的in列表值小于50个。
- where语句中必须使用合适的数据类型,避免mysql进行隐式类型转换。
- 禁止使用select *,select只获取需要的字段。
- insert必须显示指明字段名称,如:不能使用insert into table values();必须使用insert into addressbook(fname,lname,phone,fax,email) values('Rob',Rabbit,'674 1536','382 8364','rob@some.domain');这种方式。
- 避免使用不等于条件,where条件中的不等于不能使用索引。
- 合理使用分页提高分页效率,避免使用大的偏移量分页,如select id from user limit 1000,10。
- 统计表中记录使用count(*),不适用count(primary_key)和count(1)。
- 禁止jira提交的任何sql脚本包含drop语句,如果上线确实需要drop表,请找dba单独说明。
- 所有生产环境的sql都需要提jira申请,然后再执行。
- 线上统计性质sql,left join表数量不能超过3个。
- 禁止使用强制索引,如 select id from user use index(idx_user_id) where user_id = 123;
-
对同一个表的多次alter操作必须合并为一次操作,如 alter table t add column b varchar(10),add index idx_aa(aa);