数据库规范.md 4.8 KB

一、基础规范

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