当前位置:   article > 正文

从SQL质量管理体系来看SQL审核(3)- SQL开发规范

sql审核

从SQL质量管理体系来看SQL审核系列包括多篇文章,将从SQL质量管理体系的角度来讨论如何设计一个优秀SQL审核引擎,欢迎订阅。

从SQL质量管理体系来看SQL审核(1)- SQL质量管理体系概览

从SQL质量管理体系来看SQL审核(2) - SQL质量标准

本篇我们来详细地介绍SQL质量管理体系的第二个组成部分,SQL开发规范的内容。SQL开发规范是一个组织针对组织对于SQL质量的要求,依据SQL质量标准制定的一套标准化的规则和准则。它指导开发人员如何编写高质量、可维护的SQL代码。这些规范可以是非常详细的,包括SQL相关的各个方面,譬如包括范式设计、语法规则、编码风格、命名约定、安全性要求等;也可以是比较简约的易于理解是实施的规则性列表,譬如对象设计规范、SQL编写规范等。

总体来说,SQL开发规范应该根据不同的场景(OLTP/OLTP),不同的数据库类型进行设计,其主要目的是提升SQL正确性、可维护性、性能及安全。通常来讲,SQL开发规范的组成部分主要包括:

1. 对象命名规范

对象命名规范明确定义表名、视图名、列名、索引名等对象的命名规则,如使用大小写、前缀、下划线等方式。良好的命名有助于代码可读性。一个针对MySQL的典型的命名规范案例如下:

1. 命名规范
 - 数据库对象名仅可包含英文字母(小写)、下划线两类字符,且以英文字母开头。
 - 数据库对象名禁止使用MySQL关键字
 - 数据库对象名的长度不得超过32个字符
 - 主键列使用固定名称`id`
 - 索引名以`idx_`作为前缀
 ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2. 对象设计规范

对象设计规范指的是针对数据库对象(包括表、视图、列、索引、约束等等)的一些设计准则。一个好的数据库对象设计能够防止后续对于数据库对象的频繁修改,避免潜在的正确性、性能等问题,提升应用系统的健壮性和性能。

一个针对MySQL的典型对象设计规范如下:

2. 对象设计规范
	2.1. 通用设计规范
     - 使用INNODB作为存储引擎
     - 禁止使用视图、触发器、函数、分区表等
     - 字符集采用utf8mb4编码
     ...
    2.2. 表设计规范
     - 每个表都应该有主键
     - 表的列数不超过64
     - 表必须包含create_time, update_time列
     ...
    2.3. 列设计规范
     - 禁止使用set/enum/timestamp数据类型
     - 小数建议使用精确精度浮点数decimal
     - 长度超过64的字符串应使用varchar类型
     - 非空字段必须制定默认值
     ...
    2.4. 索引设计规范
     - 索引字段中的数目不应超过5个
     - 索引字段不可以为大字段类型
     - 禁止索引中有重复列
     - 禁止创建冗余索引
     - 禁止在分区表上创建全局索引
     ...
    2.5. 约束设计规范
     - 主键应采用自增列
     - 禁止在表上创建外建
     - 禁止使用check约束
     - 避免主外键类型不一致
     ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3. 对象操作规范

对象操作规范主要指的是针对生产环境的对象进行操作的SQL语句的规范。一个不合理的对象操作可能会导致数据库死锁,进而造成整个数据库不可用。一个典型的针对MySQL数据库的对象操作规范如下:

3. 对象操作规范
  3.1 禁止删除表、列等对象
  3.2 避免删除索引
  3.3 禁止降低字段长度
  3.4 禁止降低字段精度
  3.5 禁止在现有的列上提交默认值
  3.6 禁止在现有的列上添加非空约束
  ...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. SQL编写规范

SQL编写规范指的是DML语句的操作规范,它包括代码格式规范、正确性规范、可维护性规范、安全规范、性能规范等。

  • 正确性规范

某些SQL语句的写法虽然语法上是合法的,但是其运行结果却和开发者的预期不一致,导致正确性问题。

  • 安全规范

防范SQL注入、越权访问等安全风险,如禁止字符串拼接、启用参数化查询、最小权限原则等。

  • 性能规范

提出SQL性能优化建议,如控制查询复杂度、避免全表扫描、使用索引、分区等技术等。

  • 可维护性规范

规范SQL语句的格式化标准,如关键字大小写、缩进方式、空格使用、换行规则等,以提高代码的一致性和可读性。

一个典型针对MySQL数据库的SQL编写规范如下:

4. SQL编写规范
  4.1 正确性规范
   - 避免UPDATE/DELETE 中使用 LIMIT 子句
   - 禁止使用=NULL判断空值
   ...
  4.2 安全性规范
   - 禁止字符串拼接,防范SQL注入
   - 禁单条SQL语句同时更新多个表
   ...
  4.3 性能规范
   - 使用union all替代union,因为union all不需要去重,节省数据库资源,提高性能。
   - 不使用负向查询,如not in/like。
   - 禁止使用悲观锁定,即读锁 select … for update
   ...
  4.4 可维护规范
   - 在一个查询块中,多表应该使用别名
   - INSERT...VALUES应该指定列名
   - 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

总之,一个合理、全面的SQL开发规范不仅规范了编码过程,更重要的是对代码质量形成了有力约束,确保了SQL代码在可读性、可维护性、安全性、性能、规范性等方面的统一要求,提高了代码质量水平。

PawSQL往期文章精选

从SQL质量管理体系来看SQL审核(1)

从SQL质量管理体系来看SQL审核(2)

高级SQL优化 | 你真的了解用UNION替换OR吗?

EverSQL向左,PawSQL向右

关于PawSQL

PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss等,提供的SQL优化产品包括

PawSQL Cloud,在线自动化SQL优化工具,支持SQL审查,智能查询重写、基于代价的索引推荐,适用于数据库管理员及数据应用开发人员,
PawSQL Advisor,IntelliJ 插件, 适用于数据应用开发人员,可以IDEA/DataGrip应用市场通过名称搜索“PawSQL Advisor”安装。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/912807
推荐阅读
相关标签
  

闽ICP备14008679号