开发规范
suichentree 11/13/2023 开发
[toc]
# 开发规范
记录一下开发规范
# mysql数据库开发规范
# 命名规范
# 通用命名规范
- 命名应该都使用小写。
- 命名只能使用英文字母、数字、下划线,以英文字母开头。
- 命名使用具有意义的英文词汇,词汇中间以下划线分隔。
- 避免用MySQL的保留字如:backup、call、group,order等
# 库的命名规范
- 库命名一般为项目名称+库含义的简写,比如IM项目的用户信息库,可以是 im_user。
- 库创建时必须添加默认字符集和校对规则子句。默认字符集为UTF8(或者utf8mb4),排序规则默认选择utf8_general_ci或者utf8mb4_general_ci
- 库的命名应该使用小写。
# 表的命名规范
- 常规表表名以t_开头,t代表table的意思。命名规则即 t + 模块(包含模块含义的简写)+ 表(包含表含义的简写),比如用户模块的教育信息表:t_user_eduinfo。
- 临时表(用于对数据进行临时处理的表),命名规则:temp前缀+模块+表+日期后缀。例如用户模块教育信息临时表:temp_user_eduinfo_20210719
- 备份表(用于作为灾备恢复的数据)命名规则,bak前缀+模块+表+日期后缀。例如用户模块的教育信息备份表:bak_user_eduinfo_20210719
- 对于相同模块的表应该使用相同前缀。
- 表名中的多个单词,应该以下划线连接。并且表名都使用小写
# 字段的命名规范
- 字段命名需要表示其实际含义的英文单词或简写,单词之间用下划线 _ 进行连接,如 service_ip、service_port。
- 各表之间相同意义的字段必须同名,比如a表和b表都有创建时间,应该统一为create_time,不一致会很混乱。
- 多个单词以下划线 _ 分隔
- 字段命名应该都使用小写。
# 索引命名规范
- 唯一索引使用uni + 字段名 来命名。例如 create unique index uni_uid on t_user_basic(uid) 。
- 非唯一索引使用idx + 字段名 来命名。例如 create index idx_uname_mobile on t_user_basic(uname,mobile) 。
- 索引的命名应该使用小写,并且用多个单词以下划线 _ 分隔。
- 多单词组成的索引名,应该用代表意义的缩写。例如 test_contact表member_id和friend_id上的组合索引:idx_mid_fid。
- 理解组合索引最左前缀原则,避免重复建设索引,如果建立了(a,b,c),相当于建立了(a), (a,b), (a,b,c)。
# 约束命名规范
- 命名应使用小写。
- 唯一约束:uk_表名称_字段名。uk是UNIQUE KEY的缩写。例如:ALTER TABLE t_dept ADD CONSTRAINT un_name UNIQUE(name);
- 出于性能考虑,如无特殊需要,建议不使用外键。表与表之间的互相联系由代码控制。从程序角度进行完整性控制,但是如果不注意,也会产生脏数据。
- 非空约束:如无特殊需要,建议所有字段默认非空(not null),不同数据类型必须给出默认值(default)
# 设计规范
# 通用设计规范
- 对于存储引擎,默认使用innodb存储引擎
- 对于字符集,如无特殊要求,必须使用utf8或utf8mb4。
-- 如下脚本来查看数据库的编码格式
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
-- 如下脚本来查看数据库的编码格式
SHOW VARIABLES Like '%char%';
1
2
3
4
2
3
4
# 表设计规范
- 不允许使用外键对表之间进行关联,确保组件对应的表之间的独立性,为系统或表结构的重构提供可能性。目前业内的做法一般 由程序代码来控制表之间的关联性。
- 表必须要有primary key,主键的优势是唯一标识、有效引用、高效检索,所以一般情况下必须有主键字段。
- 单表字段数不要太多,建议最多不要大于50个。过度的宽表对性能也是很大的影响。
- MySQL在处理大表时,性能就开始明显降低。建议单表物理大小限制在16GB,表中数据行数控制在2000W内。
- TEXT字段作为大体量文本存储,必须放在独立的表中,然后用PK与主表关联。如无特殊需要,禁止使用TEXT、BLOB字段。
# 字段设计规范
- INT:如无特殊需要,存放整型数字使用UNSIGNED INT型,整型字段后的数字代表显示长度。比如 id int(11) NOT NULL
- DATETIME:所有需要精确到时间(时分秒)的字段均使用DATETIME,不要使用TIMESTAMP类型。
- VARCHAR:所有动态长度的字符串,全部使用VARCHAR类型。类似于状态等有限类别的字段,也使用可以比较明显表示出实际意义的字符串,而不应该使用INT之类的数字来代替。
- 对于精确浮点型数据存储,需要使用DECIMAL,严禁使用FLOAT和DOUBLE。
- 如无特殊需要,尽量不使用BLOB类型
- 如无特殊需要,字段建议使用NOT NULL属性,可用默认值代替NULL
- 自增字段类型必须是整型且必须为UNSIGNED,推荐类型为INT或BIGINT,并且自增字段必须是主键或者主键的一部分。
# SQL语句使用规范
- 尽量避免使用
select *
。 - 严禁使用
select * from t_name
,而不加任何where条件,这样会变成全表全字段扫描。 - 分页查询语句全部都需要带有排序条件 , 否则很容易引起乱序。
- 用in 或 union替换or,效率会好一些。
- 严禁使用%前缀进行模糊前缀查询:如:
select a,b,c from t_name where a like ‘%name’;
- 可以使用%模糊后缀查询如:
select a,b from t_name where a like ‘name%’;
- 避免使用子查询,应该把子查询优化为join操作。
- 禁止使用不含字段列表的INSERT语句。例如:
insert into values ('a','b','c');
应该使用insert into t_name(c1,c2,c3) values ('a','b','c');
- 大批量写操作(UPDATE、DELETE、INSERT),应该分批多次进行操作。