数据库规范

1.命名规范

1)库名表名列名【强制】

数据库对象名(库名,表名,列名)必须用小写,只能使用英文字母,数字,下划线。以英文字母开头,禁止以数字开头。库名,表名,列名必须见名知义,长度不要超过32字符

临时库,临时表名必须以tmp为前缀,并以日期为后缀,中间用下划线分割.tmp_aaaa_20181010

备份库,备份表必须以bak为前缀,并以日期为后缀,中间用下划线分割  .bak_aaaa_20181010

2)索引命名【强制】

非唯一表名_字段名称[_字段名] ”进行命名

唯一索引按照“唯一表名_字段名称[_字段名] ”进行命名

复合索引按照“idx_com_表名_字段1首字母_字段2首字母[_字段Ñ首字母]”

3)约束命名【强制】

主键约束:pk_表名称。

唯一约束:唯一表名称_字段名。

4)触发器命名【强制】

trg_表名_操作。

5)函数过程命名【强制】

pro_动名词。

6)序列命名【强制】

seq_表名

 

2.表设计规范

1 )

建表统一使用utf8mb4字符集。【强制】

2 )

单表创建的列尽量不要超出30个。【建议】

3 )

一般情况下避免使用分区表,需要使用分区表先与DBA沟通。【建议】

 

3.字段设计规范

1 )

每个Innodb 表都必须有一个主键,且不使用更新频繁的列作为主键,不使用多列主键。建议选择使用自增列作为主键。(bigint unsigned NOT NULL AUTO_INCREMENT)【强制】 【强制】

2 )

如果字段值非空,尽量使用NOT NULL 。【建议】

3 )

每个字段(除主键)添加COMMENT ,提高表的业务可读性。【建议】

4 )

整形定义中不添加长度,比如使用INT,而不是INT[4]。【强制】

5)

金额字段使用decimal。存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。【强制】【强制

6)

时间字段一律使用datetime or timestamp or or datetime(精度) timetamp(精度)。【强制】

7)

标示或状态字段(0~127)一律使用tinyint(1),比如flag。【强制】  【强制】

8)

char适合存储固定长度列或者很短的列,如性别,电话、手机、身份证使用char。【建议】

9)

varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度大于5000,定义字段类型为text。【建议】

10)

每张表数据量建议控制在2000W以内,单库500G内。【建议】

11)

禁止在数据库中存储明文密码。【强制】  【

12)

尽量不使用TEXT、BLOB类型。 【建议】

13)

慎用外键。因每次修改数据都需要去另外一个表检查数据,需要获取额外的锁,高并发环境下出现性能问题。【建议】

#创建表:

CREATE TABLE `products` (

    `id` INT NOT NULL AUTO_INCREMENT COMMENT '主键',

    `productid` INT NOT NULL COMMENT '产品ID',

    `productcode` CHAR (3) NOT NULL COMMENT '产品编码',

    `name` VARCHAR (30) COMMENT '名称',

    `quantity` INT COMMENT '数量',

    `price` DECIMAL (7, 2) COMMENT '价格',

    `sale_date` TIMESTAMP COMMENT '销售日期',

    PRIMARY KEY (`id`)

) COMMENT = '产品表' ENGINE = INNODB;

 

4.索引

1)

在WHERE子句中最频繁使用的字段【建议】

2)

选择高选择性的字段,即重复值少的字段【建议】

3)

联接语句中的联接字段【建议】

4)

索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;【强制】

5)

不在索引列进行数学运算和函数运算【建议】

6)

尽量建单列索引,不要建复合索引【建议】

7)

避免冗余的索引,如:primary key(id),index(id),unique index(id) 【建议】

8)

避免重复的索引,如:index(a,b,c),index(a,b),index(a) 【建议】

5.SQL规范

1)

最好给表起个别名,每个字段指定表名做前缀。【建议】

2)

SELECT只获取必要的字段,禁止使用SELECT *。  【建议】

3)

避免隐式转换。数值类型禁止加引号;字符串类型必须加引号。【建议】

4)

尽量避免使用子查询。必要时推荐用JOIN代替子查询。 【建议】

5)

INSERT语句必须指定字段列表 【建议】

6)

INSERT语句可以使用batch提交(INSERT INTO table VALUES(),(),()…)【建议】

7)

禁止单条SQL语句同时更新多个表。 【强制】

8)

尽量避免使用存储过程、触发器、视图、自定义函数。【建议】

9)

limit分页注意效率。Limit越大,效率越低。可以利用关联查询优化分页。【建议】

10)

一个事物应有捕获SQL异常的处理机制,必要时通过rollback显式回滚。 【建议】

11)

尽量不使用负向查询,如not in,not like。【建议】

12)

可以使用EXPLAIN判断SQL语句是否合理使用索引,尽量避免extra列出现:Using File Sort、

Using Temporary。 【建议】

13)

获取大量数据时,建议分批次获取数据,每次获取数据少于2000条,结果集应小于1M。

14)

事务要简单,整个事务的时间长度不要太长。Sql尽量简单,大的sql想办法拆成小的sql语句,

避免大事务。 【建议】

15)

UPDATE、DELETE语句不使用LIMIT。【强制】

16)

UPDATE多个字段时,更新字段之间用“,”,不要用“and”。正确写法:

update t01 set sales=100, bonus=200 where id=1; 【强制】

#分页

select id,name,bonus from t1 order by bonus,id limit 9,3;

=>

select t1.id, t1.name, t1.bonus

  from t1

  join (select id from t1 order by bonus,id limit 9, 3) t2

  on t1.id = t2.id;

 

6.行为规范

1)

重要项目的数据库方案选型和设计必须提前通知DBA参与。 【强制】

2)

重要业务的表结构变更必须通知DBA进行审核。 【强制】

3)

提交线上建表改表需求,必须详细注明涉及到的SQL语句,便于DBA进行审核和优化。 【强制】

4)

批量导入、导出数据必须通过DBA审核,并在执行过程中观察服务。 【强制】

5)

数据订正时,DELETE或UPDATE记录时,要先SELECT,避免出现误删除,确认无误才能执行更新语句。【强制】

6)

产品出现非数据库导致的故障时,如被攻击,必须及时通知DBA,便于维护服务稳定。 【强制】

7)

业务部门程序出现BUG等影响数据库服务的问题,必须及时通知DBA,便于维护服务稳定。 【强制】

8)

业务部门推广活动或上线新功能,必须提前通知DBA进行服务和访问量评估,并留出必要时间以便DBA完成扩容。 【强制】

9)

出现业务部门人为误操作导致数据丢失,需要恢复数据的,必须第一时间通知DBA,并提供准确时间点、误操作语句等重要线索。 【强制】

10)

线上业务,严格禁止使用replace覆盖数据。 【强制】

11)

禁止有SUPER、DDL、DCL权限的应用程序账号存在。 【强制】

12)

开发、测试环境无用冗余数据应及时清理,留出磁盘空间;生产无用冗余数据,及时归档后清理。 【强制】

 

7.数据库规范

1)

使用INNODB存储引擎。默认INNODB引擎。【强制】

2)

禁止在数据库中存储图片、文件等大数据。 【强制】

3)

尽可能不使用使用存储过程,视图,触发器,Event;这些对数据库性能影响较大,在应用层实现。【建议】

4)

禁止在线上做数据库压力测试。 【强制】

5)

生产环境和测试环境的数据库配置必须一致。 【强制】

6)

重要业务数据库,必须有主从库;或者使用公司统一的集群。确保数据库高可用。 【强制】

posted @ 2023-05-10 18:47  跳出圈子  阅读(65)  评论(0)    收藏  举报