作为一名后端开发程序员,我们离不开与数据库打交道,最近也在做项目,遇到很多数据库上的设计问题,故整理下来与大家分享。
命名规范
表名
-
使用小写字母、数字、下划线,不能以数字开头,不能在两个下划线之间只出现数字
-
可读性高(使用英文,尽量不使用缩写,避免使用拼音),使用
业务名称_表的作用
形式命名 -
不使用复数名词(表名应该表示表中的实体内容,而不应该表示实体的数量,对应的实体类名也应使用单数形式)
字段名
-
使用小写字母、数字、下划线,不能以数字开头,不能在两个下划线之间只出现数字
-
对于表达是与否的字段,使用
is_xxx
的形式命名,数据类型应为 unsigned tinyint,对应实体类的属性不应该添加 is 前缀,通过设置映射关系解决。
索引名
-
主键索引名使用
pk_字段名
-
唯一索引名使用
uk_字段名
-
普通索引名使用
idx_字段名
字段规范
-
每个表必须具有 id,create_time,update_time 字段。id为主键,类型为 unsigned bigint,单表时自增,步长为1; create_time,update_time为 datetime 类型。
-
尽可能选择存储空间小的字段类型。 tinyint、smallint、int、bigint。
-
如果需要存储的字符串长度几乎相等,使用 char 定长字符串类型。
-
varchar 长度不要超过5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率。
-
小数类型使用decimal。float和double存在精度损失的问题。
-
尽可能使用 not null 定义字段,可防止出现空指针问题,NULL 值也可能导致索引失效。
索引规范
-
对于索引字段,不使用左模糊或全模糊查询,防止索引失效。索引文件具有最左前缀匹配原则,如果左边的值未确定,则无法使用索引。
-
建立组合索引时,区分度最高的字段在最左边
-
业务上具有唯一特性的字段,即使是组合字段,也要建成唯一索引。
-
在 varchar 字段上建立索引时,必须指定索引长度,根据实际字符串区分度决定索引长度。
使用explain命令对SQL进行性能优化时,type 要求是ref级别,至少要达到range级别,最好是consts级别。
- range:对索引进行范围检索
- ref:使用了普通索引
- consts:使用了主键或者唯一索引
SQL语句规范
-
不要使用count(列名)或count(1)代替count( * )。 count( * )是 SQL92 定义的标 准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关。
-
使用ISNULL()判断是否为NULL值。(NULL与任何值的直接比较结果都是NULL)
-
不要使用外键和级联,外键概念由应用层解决
-
不要使用存储过程,存储过程难以调试和扩展
-
涉及多个表时,都需要在字段前加表的别名进行限定
-
表的别名前加 as ,并以t1、t2、t3…的顺序依次命名