一、公共部分
1、存储引擎
默认Innodb,非特殊要求一律使用此引擎
2、字符集
Database Server 字符集统一默认UTF-8,table和column从server继承
二、表设计约定
1、主键
每张表必须包含物理自增主键,如主键字段不能满足业务需求,另建unique约束业务字段
2、外键
数据库表禁止主外键关联,需要在程序业务逻辑中维护。特殊情况如跟支付,财务模块相关,方可考虑主外键
3、表名,字段,索引命名规则
- TABLE: 同一业务模块使用相同表前缀,如tb_pay_xxxx,字典表用dim_xxxx
- Column: XXXX_XXXX,中间以下划线隔开
4、公共字段
- 每张表包含2个公共字段,created_at,updated_at
- is_delete作为标识记录逻辑删除,非必须字段,枚举类型(tinyint(4)),0有效,1删除,默认为0(有效),如数据量增长过大可通过归档,归档后在表中物理删除。
- created_at,updated_at 字段作为DT增量拉取数据和数据回退等场景下使用,created_at 默认current_timestamp
- updated_at 默认current_timestamp,on update current_timestamp
5、字段冗余
非严格遵守3NF,通过业务字段冗余来减少表关联
6、字段类型长度选择
- 主键字段:bigint(20),int(11) 根据预估数据量选择,如果选择int(11)需要标注为unsigned
- 字符串:尽可能使用定长char类型,如姓名,身份证号码,如需要变长varchar,尽可能根据实际情况限制长度,如description等
- 枚举类型:统一tinyint(4),只占一个字节
- 日期:date,datetime, timestamp,根据实际情况选择
- 金额:使用decimel(xx,2)
7、字段不允许为空
不允许可为空字段,必须有默认值
时间字段默认值建议:
1)date类型,默认值非current_date()下,默认值为'1970-01-01'
2)datetime类型,默认值非current_timestamp()下,设置为'1970-01-01 08:00:01'
3)timestamp类型,默认值非current_timestamp()下,设置成'1970-01-01 08:00:01'
8、注释
建表包含表注释,尤其枚举类型需要说明每一种含义
9、大字段(text/blob)
原则上不允许这种字段,尽可能的拆分成小字段,如果特别需要,而又读写频繁,另外建一张表
三、索引约定
1、命名
- 主键:pk_columnName (或者让数据库自动命名);
- 唯一键:uk_columnName;
- 普通索引:ix_columnName;
- 组合索引ix_column1_column2_column3; 如长度太长则截取部分,取义直观
2、必须包含索引
公共字段created_at和updated_at必须建立索引