MySQL数据库开发规范精编WORD版

合集下载

MySQL数据库开发规范

MySQL数据库开发规范

MySQL数据库开发规范表结构设计1. INT 类型不使⽤ unsigned ⽆符号属性,容易引⼊额外的计算问题。

2. ⾃增⽤ 8 字节 BIG INT,不要使⽤ 4 字节 INT,且⾃增在 MySQL 8.0 版本前有回溯问题,请考虑是否业务有影响。

3. 字符集使⽤ UTF8MB4 字符编码,不推荐 GBK、UTF-8 等其他字符集。

4. ⽇期类型⽤ DATETIME 类型,需要精确到毫秒⽤ DATETIME(6),不要使⽤ INT、TIMESTAMP。

5. 类型 JSON 可⽤于存储⾮结构化数据,典型场景为⽤户标签,不要将 JSON ⽤于频繁更新的字段场景。

6. 每张表⼀定要有⼀个主键,这样⾄少满⾜⼀范式的要求,核⼼业务表⽤全局唯⼀字段(雪花算法、有序UUID)做主键,不要使⽤⾃增做主键。

7. 对于⽇志类的流⽔表、报警表、⽇志表,可以使⽤压缩设计,提升存储效率。

MySQL 5.7 版本开始推荐使⽤透明页压缩,不要使⽤传统的 KEY_BLOCK_SIZE 的页压缩。

8. 类别设计,⽤ ENUM+CHECK 约束,不要使⽤ INT 类型的设计。

9. 敏感字段需加密,如账户密码、信⽤卡号等存储使⽤:动态盐 + ⾮固定加密算法(MD5/AES256等) + 多轮加密,不要简单使⽤ MD5算法加密,容易被暴⼒破解。

10. MySQL 可以通过 KV 的⽅式访问表中的数据,若业务只是简单的 SET、GET 请求,可考虑将其转化为 Memcached 的 KV 访问⽅式,减少 SQL 解析的开销,性能可以有⾄少 50% 的提升。

索引设计1. 不要陷⼊设置单表⾏数、列数限制的固有印象,其他关系型数据库没有⾏数、列数限制,MySQL 也没有,⼤表的缺点不是性能,⽽是后续的 DDL 管理问题,随着 MySQL 8.0 快速加列功能的上线,⼤表 DDL 问题基本已解决。

2. MySQL 是索引组织表,表中的数据以 B+ 树索引结构,根据主键逻辑排序,由于 B+ 树索引的特点是树的⾼度为 3~4 层,所以从数⼗亿的记录中,通过主键查询⼀条记录只需要 3、4 次 I/O,当前到 SSD 存储设备设置每秒⾄少能完成 10000 次的 I/O 查询,不要担⼼通过索引查询⼀条或⼏条记录的性能,每秒百万次查询并不难。

通用MySQL数据库规范

通用MySQL数据库规范

通用MySQL数据库规范文档[V1.3]拟制人:审核人:批准人:2017年11月3日文件变更记录*A - 增加M - 修订D - 删除目录1 总则 (3)1.1 目的 (3)1.2 适用范围 (3)1.3 管理职责 (3)1.3.1 开发项目组 (3)1.3.2 运维部 (3)2 具体规范 (4)2.1 字符集 (4)2.2 命名规则 (4)2.2.1 数据库名称命名规则 (4)2.2.2 表名称命名规则 (5)2.2.3 字段命名规则 (5)2.2.4 索引命名规则 (5)2.3 字段类型选择 (6)2.3.1 数字类型 (6)2.3.2 字符串类型 (7)2.3.3 text和blob类型 (8)2.3.4 datetime和timestamp (8)2.4 默认情况 (8)2.4.1 主键 (8)2.4.2 默认值 (9)2.5 存储引擎 (9)2.6 数据库版本 (9)1 总则1.1 目的为使XXXX公司(以下简称“XX”)内部MySQL项目数据库设计遵循标准化、统一化原则,便于每个开发工程师了解不同业务逻辑关系,同时降低bug产生量和问题排查时间。

最终使得XX内部所有MySQL项目数据库设计条理有序,关系明确,特制订本使用规范。

1.2 适用范围本规范适用于XX内部所有MySQL项目数据库设计。

1.3 管理职责1.3.1 开发项目组(1)开发工程师依据该规范设计数据库。

(2)各项目组技术负责人先内部审核数据库设计方案。

1.3.2 运维部(1)由运维部严格把关各个项目组初审提交的数据库设计方案。

对于违法该规范,数据库管理员须要求其重新设计或修改,对于符合该规范可在服务器执行。

2 具体规范2.1 字符集凡涉及数据库表结构须统一utf8字符集,包括客户端和服务端。

1. 客户端字符集character_set_client= utf8 ; //客户端字符集设置2. 连接层字符集character_set_connection= utf8 //连接层字符集设置3. 数据库默认字符集character_set_database= utf8 //数据库端字符集默认设置4. 默认内部操作字符集character_set_server= utf8 //服务端字符集设置5. 系统元数据(字段名等)字符集character_set_system= utf8 //系统元数据字符集设置6. 查询结果字符集character_set_results= utf8 //查询结果字符集设置2.2 命名规则2.2.1 数据库名称命名规则数据库命名规则必须遵循如下规则:(1)小写字母,数字和半角下划线组合。

MySQL有哪些开发规范

MySQL有哪些开发规范

对于刚加入互联网的朋友们,肯定会接触到MySQL,MySQL作为互联网最流行的关系型数据库产品,它有它擅长的地方,也有它不足的短板,针对它的特性,结合互联网大多应用的特点,现总结出互联网MySQL的一些开发规范,仅供参考。

一基础规范(1) 使用INNODB存储引擎(2) 表字符集使用UTF8(3) 所有表都需要添加注释(4) 单表数据量建议控制在5000W以内(5) 不在数据库中存储图、文件等大数据(6) 禁止在线上做数据库压力测试(7) 禁从测试、开发环境直连数据库二命名规范(1) 库名表名字段名必须有固定的命名长度,12个字符以内(2) 库名、表名、字段名禁⽌止超过32个字符。

须见名之意(3) 库名、表名、字段名禁⽌止使⽤用MySQL保留字(4) 临时库、表名必须以tmp为前缀,并以日期为后缀(5) 备份库、表必须以bak为前缀,并以日期为后缀三、库、表、字段开发设计规范(1) 禁使用分区表(2) 拆分大字段和访问频率低的字段,分离冷热数据(3) 用HASH进⾏散表,表名后缀使⽤⼗进制数,下标从0开始(4) 按日期时间分表需符合YYYY[MM][DD][HH]格式(5) 采用合适的分库分表策略。

例如千库十表、十库百表等(6) 尽可能不使用TEXT、BLOB类型(7) 用DECIMAL代替FLOAT和DOUBLE存储精确浮点数(8) 越简单越好:将字符转化为数字、使用TINYINT来代替ENUM类型(9) 所有字段均定义为NOT NULL(10) 使用UNSIGNED存储非负整数(11) INT类型固定占用4字节存储(12) 使用timestamp存储时间(13) 使用INT UNSIGNED存储IPV4(14) 使用VARBINARY存储大小写敏感的变长字符串(15) 禁止在数据库中存储明文密码,把密码加密后存储(16) 用好数值类型字段Tinyint (1Byte)smallint (2Byte)mediumint (3Byte)int (4Byte)bigint (8Byte)如果数值字段没有那么大,就不要用bigint(17) 存储ip最好用int存储而非char(15)(18) 不允许使用ENUM(19) 避免使用NULL字段NULL字段很难查询优化,NULL字段的索引需要额外空间,NULL字段的复合索引无效(20) 少用text/blob,varchar的性能会比text高很多,实在避免不了blob,请拆表(21) 数据库中不允许存储大文件,或者照片,可以将大对象放到磁盘上,数据库中存储它的路径四、索引规范1、索引的数量要控制:(1) 单张表中索引数量不超过5个(2) 单个索引中的字段数不超过5个(3) 对字符串使用前缀索引,前缀索引长度不超过8个字符(4) 建议优先考虑前缀索引,必要时可添加伪列并建立索引2、主键准则(1) 表必须有主键(2) 不使用更新频繁的列作为主键(3) 尽量不选择字符串列作为主键(4) 不使用UUID MD5 HASH这些作为主键(数值太离散了)(5) 默认使非空的唯一键作为主键(6) 建议选择自增或发号器3、重要的SQL必须被索引,比如:(1) UPDATE、DELETE语句的WHERE条件列(2) ORDER BY、GROUP BY、DISTINCT的字段4、多表JOIN的字段注意以下:(1) 区分度最大的字段放在前面(2) 核⼼SQL优先考虑覆盖索引(3) 避免冗余和重复索引(4) 索引要综合评估数据密度和分布以及考虑查询和更新比例5、索引禁忌(1) 不在低基数列上建立索引,例如“性别”(2) 不在索引列进行数学运算和函数运算6、尽量不使用外键(1) 外键用来保护参照完整性,可在业务端实现(2) 对父表和子表的操作会相互影响,降低可用性7、索引命名:非唯一索引必须以idx_字段1_字段2命名,唯一所以必须以uniq_字段1_字段2命名,索引名称必须全部小写8、新建的唯一索引必须不能和主键重复9、索引字段的默认值不能为NULL,要改为其他的default或者空。

MySQL数据库开发规范

MySQL数据库开发规范

MySQL数据库开发规范1. 规范背景与目的MySQL数据库与Oracle、SQL Server 等数据库相比,有其内核上的优势与劣势。

我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。

本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。

在数据库变更和处理流程、数据库表设计、SQL编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。

2. 设计规范2.1 数据库设计以下所有规范会按照【高危】、【强制】、【建议】三个级别进行标注,遵守优先级从高到低。

对于不满足【高危】和【强制】两个级别的设计,DBA会强制打回要求修改。

2.1.1 库名1.【强制】库的名称必须控制在32个字符以内,相关模块的表名与表名之间尽量提现join的关系,如user表和user_login表。

2.【强制】库的名称格式:业务系统名称_子系统名,库内同一模块使用的表名尽量使用统一前缀。

3.【强制】一般分库名称命名格式是库名_编号,编号从0开始递增,比如wenan_01,以时间进行分库的名称格式是库名_时间。

4.【强制】创建数据库时必须显式指定字符集,并且字符集只能是utf8。

创建数据库SQL举例:create database db1 default character set utf8;2.1.2 表结构1.【强制】表和列的名称必须控制在32个字符以内,表名只能使用字母、数字和下划线,一律小写。

2.【建议】表名要求模块名强相关,如师资系统采用”sz”作为前缀,渠道系统采用”qd”作为前缀等。

3.【强制】创建表时必须显式指定字符集为utf8。

4.【强制】创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为InnoDB。

当需要使用除InnoDB/MyISAM/Memory以外的存储引擎时,必须通过DBA审核才能在生产环境中使用。

因为Innodb表支持事务、行锁、宕机恢复、MVCC等关系型数据库重要特性,为业界使用最多的MySQL存储引擎。

MYSQL数据库管理规范

MYSQL数据库管理规范

MySQL数据库规范(设计规范+开发规范+操作规范)目录MySQL数据库规范(设计规范+开发规范+操作规范) (1)I 文档定义 (2)1.1 编写目的 (2)1.2 适用范围 (2)II . 命名设计规范 (2)2.1 总则 (2)2.2 库名 (3)2.3 表名 (3)2.4 字段名 (3)2.5 索引名 (4)2.6 视图命名 (4)2.7 存储过程命名 (4)2.8 函数命名 (4)III 数据库设计规范 (5)3.1 表设计原则 (5)3.2 字段设计原则 (6)3.3 主键设计原则 (7)3.4 索引设计原则 (8)3.5 数据库里不建议存放业务日志 (8)IV SQL设计规范 (9)4.1 避免数据类型的隐式转换 (9)4.2 避免复杂SQL (9)4.3 批量插入 (9)4.4 数据更新 (9)4.5 避免使用TRUNCATE TABLE (9)4.6 避免使用SELECT * (10)4.7 使用索引做条件查询count(*) (10)4.8 避免IN子句 (10)4.9 避免不必要的排序 (10)4.10 合理利用最左索引 (10)4.11 多表连接 (11)4.12 避免在where后的索引字段上使用函数 (11)4.13 尽量不要做’%’前缀模糊查询 (11)4.14 使用UNION ALL代替UNION (12)4.15 尽量避免OR操作 (12)4.16 MySQL 在否定条件中不能使用索引 (12)4.17 MySQL 在JOIN中连接字段类型如果不一致,则不能使用索引 (13)4.18 如果两个字段列的字符集不同,不推荐JOIN (13)V 完整性设计规范 (13)5.1 主键约束 (13)5.2 NULL值 (13)5.3 视图使用原则 (14)VI 安全性设计规范 (14)6.1 数据库账号使用规范 (14)6.2 用户与权限 (15)6.3 用户密码管理 (15)VII 开发行为规范 (15)7.1 总则 (15)7.2 避免使用触发器 (16)7.3 避免使用存储过程和函数 (16)7.4 避免使用视图 (16)VIII 其他规范 (17)8.1 编制文档 (17)8.2 维护计划规范 (17)(2)数据归档删除 (17)I 文档定义1.1 编写目的此规范依照《中国科协数据管理总纲》(暂行)、《中国科协数据标准管理办法》(暂行)、《中国科协数据质量管理办法》(暂行)制定。

MySql数据库规范

MySql数据库规范

MySql数据库规范一、建库规范(1)、库名必须使用小写字母,“_”分割。

(2)、库名必须不超过12个字符。

(3)、字符集选择UTF8。

如果需要存储表情,那么选择utf8mb4来进行存储,注意它与utf-8编码的区别。

二、.建表规范(1)、表名必须使用小写字母,“”分割,表的命名最好是加上“业务名称表的作用。

(2)、新表必有字段参见—>公共字段规约。

(3)、新表必有comment中文注释,方便其它开发人员查看。

(4)、表名总长度不超过26个字符。

(5)、建议使用InnoDB存储引擎。

三、字段规范(1)、字段名必须使用小写字母,“_”分割。

一般采用简写,关键字要准确,避免歧义。

(2)、字段名原则上不超过20个字符,且必有comment注释。

(3)、表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 tinyint ( 1表示是,0表示否)。

(4)存储精确浮点数统一使用【decimal】(长度10,小数点2)替代【float】和【double】。

如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。

(5)存储时间统一使用【datetime】(长度0)。

(6)、若是表关联字段,必须注明所关联表的表名及字段名。

(7)、字段名禁用保留字,如 desc、range、match、delayed 等等,请参考 MySQL 官方保留字。

四、.索引(1)、业务上具有唯一特性的字段,必须建成唯一索引(2)、索引中的字段数建议不超过5个。

(3)、单张表的索引数量控制在5个以内。

(4)、多表关联查询时,保证被关联的字段需要有索引。

五、SQL规约(1)、超过三个表的 join尽量避免。

需要 join的字段,数据类型要保持绝对一致。

(2)、SELECT语句只获取前端需要的字段(禁止使用万能SQL:select *进行查询)。

(3)、禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

MySql数据库设计规范

MySql数据库设计规范
● MySql用户名与数据库名字一样。
2. 命名
(1) 命名应使用富有意义的英文词汇,多个单词组成的,中间以下划线分割。
(2) 命名只能使用英文字母,数字和下划线。
(3) 命名避免使用 MySql 的保留字(详见附录 )和系统关键字。
(4) 命名长度以不超过 15 个字符为宜(避免超过 20)。
BIGINT
8 个字节, -9223372036854775808 to 922337203685477580
0 to 18446744073709551615
DECIMAL(P,S)
定点数(以字符串形式存放)
默认:P 为 10,S 为 0,最大 65 位
DATE
Time
DATETIME
TIMESTAMP
● 所有的 MySQL数据库除历史原因外,都采用CHARSET=utf8mb4 COLLATE=utf8mb4_bin 编
码。 ● MySql对 DDL 支持很差,表结构推荐设计为 Key-Value 结构。如果是关系型结构的数据库,
请尽量预留一些字段,如 value1,value2,value3。
范围 '1970-01-01 00:00:01' 到 '2038-01-19 03:14:07'
格式'YYYY-MM-DD HH:MM:SS' 宽度固定 为 19 个字符(4 字节) 不建议532>n>4, 注意,n 是字符 数,而不是字节数
CHAR(n)
(4) 请不要使用外键约束,如果数据存在外键关系,请在程序层面实现。
(5) 如果应用使用的是长连接,应用必须具有自动重连的机制。但请避免每执行一个 SQL去检查 一次 DB 可用性。

mysql数据库开发标准

mysql数据库开发标准

mysql数据库开发标准MySQL是一种流行的开源关系型数据库管理系统,被广泛用于Web应用开发。

在进行MySQL数据库开发时,遵循一套标准的开发规范可以使开发过程更加高效、可维护和可扩展。

下面是一些MySQL数据库开发的标准参考内容:1. 数据库命名规范:- 数据库名:使用小写字母,使用下划线(_)分隔单词,例如:my_database。

- 表名:使用小写字母,使用下划线(_)分隔单词,例如:user_info。

- 列名:使用小写字母,使用下划线(_)分隔单词,例如:first_name。

2. 数据类型选择:- 使用合适的数据类型来存储数据,例如使用INT来存储整数,VARCHAR来存储可变长度字符串。

- 避免使用过长的VARCHAR类型,浪费存储空间。

- 只存储必要的信息,避免在数据库中重复存储相同的数据。

3. 索引的使用:- 为频繁用于查找、排序和过滤的列创建索引,以提高查询性能。

- 避免在频繁插入、删除或更新的列上创建过多的索引,因为索引的维护会影响性能。

4. SQL语句编写规范:- 使用缩进和换行使SQL语句易读。

- 使用全部大写或全部小写的关键字,提高可读性。

- 使用注释来解释复杂的SQL语句的用途。

5. 数据库表的设计:- 使用主键来唯一标识每一行,以提高数据访问效率。

- 使用外键来建立表与表之间的关系,保持数据一致性。

- 避免使用过多的表连接操作,以提高查询性能。

6. 安全性考虑:- 使用合适的权限管理机制,限制用户的访问权限。

- 避免在SQL语句中直接拼接用户输入的数据,以防止SQL 注入攻击。

- 定期备份数据库,以防止数据丢失。

7. 性能优化:- 使用恰当的查询语句,使用索引来提高查询性能。

- 避免频繁的查询和更新操作,使用批量操作来提高性能。

- 使用数据库缓存来加快数据访问速度。

8. 数据库文档:- 编写数据库设计文档,包括数据库结构、表结构和索引等信息。

- 在存储过程、函数和触发器等对象中添加注释,方便其他开发人员理解和维护。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

M y S Q L数据库开发规范精编W O R D版IBM system office room 【A0816H-A0912AAAHH-GX8Q8-GNTHHJ8】平安金融科技数据库(MySQL)开发规范作者: 简朝阳Last Updated: 25/02/14 19:30:18历史修订记录:修订时间修订内容版本修订人1.01.1李海军2013-03-11增加部分说明及修改1.2李海军2013-07-29增加连接池使用说明和memory引擎的控制增加了char类型,修改了timestamp的使用1.3李海军2014-02-25场合。

说明本规范包含平安金融科技使用 MySQL 数据库时所需要遵循的所有对象设计(数据库,表,字段),所需要遵循的命名,对象设计,SQL 编写等的规范约定。

所有内容都为必须严格执行的项目,执行过程中有任何疑问,请联系 DBA Team 取得帮助。

概述禁止明文传播数据库帐号和密码。

禁止开发工程师通过应用帐号登录生产数据库。

禁止应用在服务器安装MySQL客户端(可以安装开发包)。

禁止开发人员在SQL中添加 Hint,Hint只能由DBA审核后添加。

禁止使用悲观锁定,即读锁select … for update。

禁止在开发代码中使用DDL语句,比如 truncate,alter table … 等。

禁止DML语句的where条件中包含恒真条件(如:1=1)。

1. 命名规范总则数据库对象名仅可包含小写英文字母、数字、下划线(_)三类字符,并以英文字母开头。

数据库对象命名禁止使用MySQL保留字。

多个单词之间用下划线(_)分隔。

对象名称长度若超过限制,则使用简写/缩写命名。

1.1. 数据库命名数据库以"db_"前缀 + "站点名_"前缀及其所服务的应用名称命名。

1.2. 表命名所属同一模块的表必须以模块名作为前缀命名。

历史数据表在原表基础上增加"_his"后缀命名。

1.3. 字段命名布尔意义的字段以"_flag"作为后缀,前接动词。

如:表示逻辑删除意义的字段可命名为 delete_flag。

各表间相同意义的字段(如:作为连接关系的引用字段)使用相同的字段名。

1.4. 索引命名唯一索引以 uk_tablename_columnnames 方式命名普通索引以 idx_tablename_columnnames 方式命名组合索引以 idx_tablename_column1_column2... 方式命名示例站点名:maymay模块名:order ;数据表:item;字段组成:order_item_id,add_time,raw_update_time,c1,c2,c3,c4,c5标准数据库名:db_maymay_order;标准数据表名:order_item;历史数据表名:order_item_his;索引需求:c1唯一,c2和c3 组合索引:uk_order_item_c1, idx_order_item_c2_c3字段实际意义:是否已删除;标准字段名:delete_flag;字段 order.order_id被order_item引用;order_item 表中与之对应的字段命名必须为:order_id2. 对象设计规范总则所有表、字段必须添加能够清楚表示其含义的注释。

状态类字段的注释中必须明确列出各状态值的说明。

MySQL数据库中仅可以使用下文提及的数据类型。

2.1. 数据类型2.1.1. 数值类型DECIMAL(M,D)当表示定点小数的情况下使用该类型,禁止使用浮点类型,会带来不精确。

定点数在MySQL内部以字符串形式存储,比浮点数更精确,适合用来表示货币等精度高的数据。

INT系列所有整数类型字段使用INT(TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT),根据所存放的数据大小选择合适的子类型,且所有INT类型都不使用长度限制。

2.1.2. 字符串类型VARCHAR所有可变长度的字段均使用VARCHAR类型,对于有限类别的字段(如性别、状态等),均建议使用VARCHAR类型存储能明显表现其意义的字符串。

TEXT系列仅当需存储的字节数可能超过20000时,使用TEXT系列类型(TEXT、MEDIUMTEXT、LONGTEXT)。

并和原表进行分拆,与原表主键组成新表存储,且每个表只允许有一个TEXT系列类型字段。

CHAR仅当字段确定为定长,且将来不会修改长度时,使用CHAR类型。

上线以后不允许修改字段类型。

谨慎使用2.1.3. 时间类型DATE只需要精确到天的字段使用DATE类型。

精确到"天"的取当前时期的操作使用CURDATE()函数实现。

-DATETIME需要精确到时间(时、分、秒)的字段使用DATETIME类型。

精确到"秒"的取当前时间的操作使用NOW()函数实现。

取值范围:'1000-01-01'到'9999-12-31'TIMESTAMP该类型仅允许raw_update_time字段使用,其它字段不允许使用该类型。

取值范围:'1970-01-01 00:00:00'到'2037-01-01 00:00:00'2.2. 表设计必含字段id INT:主键使用MySQL的自增类型raw_add_time DATETIME:创建日期(大字段拆分表除外),必须使用数据库时间(用now()生成)raw_update_time TIMESTAMP:修改日期(大字段拆分表除外, 但内容变化必须修改主表的update_time字段),由数据库自动变更,应用不操作此字段以上3个字段都必须是没有任何商业意义的与业务无关的字段,不允许赋予任何商业意义作为表间连接关系的字段,数据类型必须保持严格一致,避免索引无法正常使用。

附属表拆分后,附属表关联字段使用主表主键字段,且附属表须有独立主键(大字段拆分的表不需要单独的主键)存在过期概念的表,在其设计之初就必须有过期机制,且有明确的过期时间。

过期数据必须迁移至历史表中。

不再使用的表,必须通知DBA予以更名归档。

线上表中若有不再使用的字段,为保证数据完整,禁止删除,而是进行更名归档,名称统一增加"droped_"前缀2.3. 约束使用2.3.1. 主键主键不能包含业务含义。

主键在任何情况下不允许被更新。

2.3.2. 唯一约束除主键外,需存在唯一性约束的,可通过创建以"uk_"为前缀的唯一索引实现。

2.3.3. 外键任何情况不在数据库创建外键约束,外键规则由应用控制。

2.3.4. 非空列所有非空列须在建表之初明确标识"NOT NULL",上线之后,不允许再变更。

2.3.5. 存储过程、触发器、视图、计划任务禁止任何业务逻辑通过封装在数据库中的procedure/function/trigger实现。

禁止应用程序使用view。

禁止业务逻辑使用数据库的计划任务。

3. SQL编写规范3.1. 绑定变量与替代变量原则所有 Query 的 Where 条件中的变量,都需要使用绑定变量来实现,此要求并不完全是基于性能的考虑,更多是基于安全方面的考虑。

3.2. 数据类型转换原则避免因数据类型转换导致执行计划有误。

说明where条件中的过滤字段如需转换类型,只可转换过滤值,不可转换被过滤字段。

表连接操作中,作为连接条件的字段的数据类型严格一致。

如果表连接字段数据类型不一致,在SQL中用显示用类型转换,具体情况咨询DBA。

示例正确用法1:select col1, col2 from tbl1, tbl2where tbl1.col3 = tbl2.col4;其中"tbl1.col3"与"tbl2.col4"数据类型严格一致。

正确用法2:select col1,col2 from tblwhere gmt_create = str_to_date('20100526 00:00:00','%Y%m%d %H:%i:%s');"count(…)"使用除非是明确目的是统计某个字段上值不为空的记录的数目,否者只允许之用 count(*),而不允许使用count(column_name) 或者 count(1)。

3.3. "select * from …"使用原则为避免查询中无用字段参与排序操作而导致的性能降低及潜在的安全隐患。

禁止使用"select * from …"。

说明任何情况都要明确列出查询需要返回的字段,禁止使用select * 返回所有字段。

3.4. "insert into tablename values()"使用原则为避免增加或删除字段带来的SQL报错。

禁止使用省略字段名的insert into语句。

说明任何情况都要明确列出需要写入的字段名称。

3.5. 表连接原则规范连接语法以方便SQL脚本的阅读及提升连接操作性能。

说明非外连接查询中,连接表在"from"子句中列出,并以逗号分隔;连接条件在"where"子句中列出,而不允许使用join … on 方式实现join。

外连接查询中,可使用"left join … on"语法;外连接一律使用"left join"表示。

可以改写为连接的子查询禁止使用子查询方式,而应改写为连接方式。

示例规范select col1, col2 from tbl1, tbl2 where tbl1.col4 = tbl2.col3;select col1, col2 from tbl1 left outer join tbl2 on tbl1.col4 = tbl2.col3;select col1, col2 from tbl1 left outer join tbl2 on tbl1.col4 = tbl2.col3;select col1 from tbl1,tbl2 where tbl1.col2 = tbl2.col3;select col1 from tbl1 left join tbl2 on tbl1.col2 = tbl2.col3 where tbl2.col3 is null;非规范:select col1, col2 from tbl1 join tbl2 on tbl1.col4 = tbl2.col3;select col1 from tbl1 where col2 in (select col3 from tbl2);select col1 from tbl1 where col2 not in (select col3 from tbl2);3.6. 分页查询说明分页查询必须带有唯一的排序条件,除非业务逻辑明确要求随机展现数据。

相关文档
最新文档