表设计规范

1、主键:主键名称必须为ID。数据类型建议采用Long(19)存储,或者使用String(32)类型存储。唯一主键。String 类型主键在后续查找时效率比Long类型要低。
2、字段:关联字段中采用 “” 来进行连接。如order_id;多单词也是采用下划线连接。
3、状态:状态类字段禁止使用 “is”命名,防止部分框架解析出现序列化问题。
4、索引:索引要求全库唯一,为兼容多数据库。
主键索引:**pk
表名缩写字段名
唯一索引:
uk
表名缩写字段名uniq表明该缩写字段名;
普通索引:
idx
表名缩写_字段名;
表名缩写(单词首字母组合)
5、区分、状态、类型:通常采用tinyint(3)来命名,tinyint(3)和tinyint(1)表示的大小一致,但
tinyint(1)会被 Mybatis 默认转换为boolean类型。也可以采用String(1)命名,但String类型无法参与某些位运算。
6、是否空值:字段类型尽量
Not Null **以减少性能消耗。

表业务规范

1、表名前缀:所有的表都需要添加业务前缀。如系统表sys_log、定时任务表quzrtz_log等;
2、基础字段:通常包含创建时间、创建者、修改时间、修改人;
3、逻辑字段:del_flag(tinyint(3)/varchar(1))表示,1表示删除,2表示未删除。通常不采用0来进行设置。
4、字符类型:varchar字符串类型通常不允许操作1000.
5、文本类型:文本类型通常采用text、longtext类型,不建议使用blob类型。而且文本类型字段通常建议独立建 表。
6、乐观锁:解决 高并发事务 问题i。数据库表中通常添加一个 version 字段;
查询记录:查询出当前记录的version信息;
更新记录:携带查询到的记录version信息;
执行更新:与查询version比较,一致则更新,更新完毕后version+1。
7、引擎类型:无特殊要求,引擎类型 一律为 InnoDB。编码字符为utf8、utf8mb4。

数据库设计

1、表库名:必须在32字符以内,相关模块之间的表名设计体现关联性,user、useraddr;
2、模块化:相同模块之间的表采用统一前缀。如定时任务采用quartz
前缀,系统采用sys_前缀;
3、分库分表:通常采用库名/表名+递增编号。如user_001、user_002等;
单表数据 大于100w 行时,建议进行分表。
4、特殊值:
IP地址类:IP地址类型通常采用 Int类型 存储,Int类型 4字节,32位;如果采用varchar(15)来进行存储,则需 15字节,数据量大时,则会造成空间浪费。MySQL中提供了 INET_ATON() 和 INET_NTOA()来进行转化。
Date时间类:建议采用 TimeStamp(4) 类型存储,4字节类型和int相同,但可读性更高,取值1970~2038;
超出TimeStamp类型的采用DateTime类型存储。极其不建议采用varchar类型存储。
5、财务相关:财务相关类型采用 decimal 类型。可以提供更加精确的计算。如果数据超出decimal,建议将整数 和小数分开存储。

索引规范

1、命名:主键 pk 开头,唯一 uk 开头,普通索引 idk_ 开头;
2、类型:InnoDB、MyISAM引擎中,索引类型必须为 BTREE;
3、数量:单表中索引不建议超过 7 个;
4、长度:单个索引长度不超过 64KB
5、多表:多表join查询时,关联键中通常采用 建立索引 来提高join驱动。

SQL规范

1、查询语句:SELECT中必须指定字段名,禁止使用 select 来进行查询。避免多于字段网络消耗,model与表字 段更新不匹配报错。
2、统计函数:不要使用count(列名)、count(常量)来代替count(
),count()是SQL92中统计行数的,与数据库、 Not Null和Null无关。说明:count()会统计所有null的行数,而count(列名)不会统计null值的行数。
3、sum()函数:某一列值全为NULL,则count(字段)返回结果为0,但sum(字段)返回结果为null。因此使用sum() 时要注意NPE问题。
4、join问题:多表join时,最好不要超过3个,且最好通过 小表驱动大表。