-
1、基本规范
1.【强制】使用InnoDB存储引擎
--支持事务、行级锁、并发性能更好;
2.【强制】字符集统一使用utf8mb4字符集,禁止utf8和utf8mb4混用;
--utf8mb4是utf8的超集,emoji表情以及部分不常见汉字在utf8下会表现为乱码;
3.【强制】数据表、数据字段必须要有中文注释,常量枚举字段需要备注各个值所代表含义;
4.【强制】禁止存储大文件或者大照片,可在数据库里存文件URI或者照片URI;
2、命名规范1.【强制】库名、表名、字段名等使用有意义的英文词汇,词汇中间以下划线分割,禁止超过32个字符,禁止使用中文,禁止使用大写字母。
(2)、索引名,普通索引使用idx_开头,唯一索引使用uk_开头;
(3)、表名命名原则,命名尽量简洁,建议:表前缀 + 所属一级业务模块名(如: 账单 bill、供应商 supplier、物料 material等)+ 具体业务抽象数据名(比如:信息 info、明细 detail、分类 category、卡片card)等;列如:wms_supplier_category;
4.【强制】表达是与否的字段以is_开头,如is_delete表示是否删除
5.【强制】禁止使用MySQL关键字;
--比较常见的有status,desc等,应加上业务前缀避免跟保留字相同,并且字段意义更加明确。如check_status,order_status等。重点关注以下保留字
ACCESSIBLE ACCOUNT ACTION AVG BACKUP CACHE CATALOG_NAME CHAIN CHARACTER CODE DATA DATE DESC DESCRIBE ERROR EVENT EVENTS GROUP INDEX KEY KEYS LANGUAGE MEMORY OWNER RANGE SCHEMA SOURCE SQL STATUS STORAGE TEXT USAGE USER VALUE VALUES TYPE 所有字段必须有默认值
(6)、常用字段统一命名
是否必填字段名称字段类型含义必填 id bigint 表自增id 必填 created_by varchar(50) 创建人 必填 created_time datetime 创建时间,默认当前时间 必填 modified_by varchar(50) 修改人 必填 modified_time datetime 修改时间(代码更新时间),默认'1970-01-01 08:00:01' 必填 last_update_time datetime 数据库自动更新时间,默认值当前时间 必填 is_delete tinyint 是否删除(0:否,1:是)默认:0 选填 remark varchar(255) 备注 选填 xxx_type tinyint 业务类型 选填 xxx_status tinyint 业务状态 选填 xxx_code 业务编码 选填 archived tinyint 是否归档 选填 approve_by varchar(50) 审批人 选填 approve_time datetime 审批时间
3、表设计原则(1)、避免使用外键,如果有外键完整性约束,通过应用程序控制;
(2)、把字段定义为NOT NULL并且提供默认值;
(3)、尽量使用可以正确存储数据的最小数据类型,可以用tinyint就不要用int;
(4)、避免使用TEXT、BLOB类型;
(5)、常量类型使用tinyint,在注释中写清楚每个值的含义;
(6)、字段适当冗余,减少查询时的连表次数。冗余的字段注意保持数据一致性
(7)、需要join的字段,字段类型必须一致
(8)、表达关联关系的表以_xref结尾
4、索引设计原则(1)、经常查询、表连接的字段建议加上索引;
(2)、避免在更新十分频繁、区分度不高的字段上建立索引;
(3)、建立组合索引,必须把区分度高的字段放在前面,组合索引字段数避免超过5个;
5、字段类型如何选择1)、char 和 varchar
(1)、char:字段是固定长度选择char,否则选择varchar;
2)、text 和 blob
(1)、text只能存文本,比如文章或者日记;blob可以存二进制,比如图片;
(2)、建议将大字段拆分出去,单独建表;避免大字段做查询条件;
3)、浮点数(float、double)和定点数(decimal)
(1)、浮点数会精度丢失,作比较会有误差;
(2)、货币使用定点数进行存储,对应java里面的Bigdecimal;
4)、日期类型
(1)、日期类型统一使用datetime
6、SQL注意事项(1)、避免使用SELECT *,只获取必要的字段;性能、容易在增加或者删除字段后出现程序BUG;
(2)、避免使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性;否则容易在增加或者删除字段后出现程序BUG;
(3)、避免使用属性隐式转换,导致索引失效;
(4)、避免在WHERE条件的属性上使用函数或者表达式;
(5)、避免负向查询(!=、<>、NOT IN等),以及%开头的模糊查询;
(6)、一般情况下exist和join效率比in高,但当大表驱动小表是改用in可能提高效率
(7)、避免OR条件查询,改为IN查询,在没有索引的情况下or比in效率低;
(8)、避免左模糊匹配或者全模糊匹配
(9)、order by的字段必须是唯一的索引字段,如果不是唯一的索引字段,则必须满足复合索引的最左前列
(10)、如果有join操作,order by字段必须是左表的字段
(11)、超大分页查询使用延迟关联优化,如SELECT * FROM user a JOIN (SELECT id FROM user WHERE name='abc' ORDER BY age LIMIT 100000,10) b ON a.id=b.id
(12)、使用is null判断null值
(13)、严禁三张表以上的连表查询
7、SpringBoot事务最佳使用建议1)、启用事务管理功能
(1)、传统XML配置方式
(2)、使用注解:@EnableTransactionManagement(推荐)
2)、需要用到事务时,使用注解@Transactional
(1)、propagation:事务的传播行为,默认值为 REQUIRED。
(2)、rollback-for:指定能够触发事务回滚的异常类型,必须设定。
(3)、timeout:事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。建议设置。
(4)、read-only:指定事务是否为只读事务,默认值为 false。
(5)、no-rollback-for:抛出 no-rollback-for 指定的异常类型,不回滚事务。
3)、事务使用场景
(1)、只涉及到查询的业务逻辑,不使用事务;
(2)、涉及多个insert、update、delete混合操作,建议使用事务;
(3)、update操作只更新本次要更新的数据,禁止更新整个实体Bean;
(4)、数据库查询与数据库更新之间尽量间隔短,中间不宜插入太多其他逻辑,减少数据一致性的风险;
服务器原因造成的传输过程中消息丢失,无统一记录,无法对消息进行重试、补偿。