#### 一、基础规范 1) 表存储引擎必须使用InnoDB 2) 表字符集utf8mb4 3) 禁止使用存储过程,视图,触发器,Event 4) 禁止在线上环境做数据库压力测试 #### 二、命名规范 1) 库名,表名,列名 必须见名知义.所有库名、表名、字段名、枚举名 全部用小写字母,单词之间用下划线\_分隔。 2) 表的命名: 推荐以'业务名称\_具体表名'为模板,如具体表名含义复杂,在具体表名后再增加含义如:'模块名称\_具体表名_xxxxx'。例如'project\_approval'表名。 3) 字段命名 * 对于本模型字段, 例如 `order`表中的订单编号, 推荐使用`item_no`, 而不是`order_item_no`. * 对于非本模型字段, 例如 `payment`表中的订单编号, 推荐使用`order_item_no`,而不是`item_no` #### 三、表设计规范 1) 每个表必须建立主键 2) 禁止使用外键 3) 根据业务区分使用char/varchar 4) 每个表中必需要有 `create_at` (插入时间) 和 `update_at` (更新时间)字段, * create_at 使用datatime, 语法: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' * update_at 使用datatime ,语法: DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间' 如果涉及操作人/更新人, 统一使用 `create_user_id`,`create_user_name`, `update_user_id`, `update_user_name` 5) 新建字段必须为NOT NULL,并设默认值为非null值 6) 字段类型长度应设置为保证正常使用需求下的最小长度。 7) 禁止删除列 8) 合理使用字段冗余, 禁止过分冗余. 9) 合理设计表的水平拆分, 禁止过分拆分. 10) 对于命名简单的字段, 可以不写注释. 对于命名复杂或难以理解的字段, 应该添加注释. enum字段必须添加注释.对应的代码中应该使用Enum或静态常量. #### 四、索引规范 1) 唯一索引使用uniqe_[字段名]来命名,eg:unique_asset_item_no 2) 非唯一索引使用idx_[字段名]来命名,eg:idx_asset_create_at 3) 单张表索引数量建议控制在5个以内 4) 对于大表,至少在一个时间字段上建立index. 5) 不建议在频繁更新的字段上建立索引(eg:尽量避免在update_at上建立index) 6) 非必要不要进行JOIN查询,如果要进行JOIN查询,被JOIN的字段必须类型相同,并建立索引 7) 理解组合索引最左前缀原则,避免重复建设索引,index(part1,part2,part3),相当于建立了 index(part1),index(part1,part2)和index(part1,part2,part3)三个索引. #### 五、数据操作规范 1) 禁止使用select * 2) insert必须指定字段,禁止使用insert into T values() 3) 隐式类型转换会使索引失效,导致全表扫描(select uid from user where phone=13811223344 --phone varchar(20) 为什么不能命中phone字段index) 4) 禁止在where条件列使用函数或者表达式 (select uid from where date(user_create_at)='2018-01-01' -- 为什么不能命中user_create_at index) 5) 同一个字段上的OR必须改为 IN,IN的值必须少于50个 6) 禁止 drop table/database/column ,truncate table #### 六、SQL语句优化规范 : 使用mysql explain 对sql执行效率进行检测 1)使用方法:在select语句前加上explain即可 。 2)explain 分析结果形式如下: table | type | possible_keys | key | key_len | ref | rows | Extra explain 分析结果形式中各属性含义: table :显示这一行的数据是关于哪张表的 type :这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL 。 possible_keys :显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句。 key :实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引。 key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好。 ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。 rows:MYSQL认为必须检查的用来返回请求数据的行数。 Extra :返回的描述的意义。 #### 七、本项目规范 * sku在其他表中的外键, 全部只能使用`sku_id`, 不得冗余`sku` * user_id 为varchar(10) ; user_name 为 varchar(30) #### polarDB polarDB数据一致性说明 https://help.aliyun.com/document_detail/99093.html?spm=a2c4g.11186623.6.639.36d66fb6V0UroR#title-ijd-kdt-8hk 我们当前使用会话一致性. 如果在写入数据库, 希望马上读取到, 需要保证这两个操作在同一个会话中, 即开启事务.