#### 一、基础规范
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
我们当前使用会话一致性. 如果在写入数据库, 希望马上读取到, 需要保证这两个操作在同一个会话中, 即开启事务. 

