数据库名、表名、字段名都小写,名字越短越好,务必精炼
字段名字如有多个词组就用下划线分割,表名和数据库不建议有分隔符号
单库不超过300个表
单表字段数不超过50个字段以上
不允许用mysql保留字作为字段名
能用tinyint就不要用smallint,能用smallint就不要用int,能用int就不要用bigint
如需存储用户ip,则用int型存储,不要用char
优先使用enum或set
每个表和字段都加上comment
mysql引擎使用 innodb
不要使用text或blob数据类型
不允许null字段,只允许not null
不允许外键
不允许在mysql里做任何计算
字符字段必须建立前缀索引
所有sql必须有索引
根据合适的查询条件建立合适的索引,查询条件顺序必须和索引顺序一一对应
sql语句不允许出现like
不允许关联查询
保持事务短小,与事务无关操作放到事务外面
不允许使用存储过程和触发器
不使用select *,尽量使用具体字段
不使用or,要用in,注意in的数量,不超过100个
不使用负向查询,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、 NOT LIKE
前台应用不允许使用表关联
时间类字段使用bigint存储到毫秒
数据库只使用insert,update,select权限,删除用is_valid=0代替,特殊业务授于delete权限
一些注意点:
一、重复Insert问题
1、先使用redies.setnx(String key, int expireSecond, String value)方法来防止并发操作,该方法的返回值=1(long类型),表示没有并发,如果返回值=0,表示已有操作在进行,可直接抛出业务异常(BizValidateException或BizException均可)。
2、步骤1验证通过后,先查询DB中是否存在该数据,存在时直接返回业务异常,不存在时才进行insert操作(该步骤目的是防止dubbo处理超时客户端再次提交导致的重复Insert)。
注:可以配合唯一索引一起使用。
二、update或delete操作结束后缓存和DB中数据不一致的几种解决方案:
1、尽可能不使用事务。
编码:
建数据库表的时候请指定下编码为utf8mb4。