数据库设计原则与开发规范,你知道多少?
VOL 187
21
2020-12
今天距2021年11天
这是ITester软件测试小栈第187次推文
点击上方蓝字“ITester软件测试小栈“关注我,每周早上 08:30准时推送,每月不定期赠送技术书籍。
微信公众号后台回复“资源”、“测试工具包”领取测试资源,回复“微信交流群”、“内推群”一起进群打怪。
本文4352字,阅读约需11分钟
对一个程序来说,由于数据库资源的绝对宝贵性(无法无限扩展),所以数据库必须合理的运行使用。以保证高效、稳定、安全的运行。数据库设计得好, 系统健步如飞;数据库设计不好,系统蹒跚前行。今天介绍数据库的设计原则和规范,你知道得越多,你不知道的越多。你知道多少呢?
一
MySQL数据库设计原则
1
核心类原则
1.不在数据库做运算;
2.cpu计算务必移至业务层ecs
;
3.控制列数量(字段少而精,字段数建议在60以内);
4.平衡范式与冗余(效率优先;往往牺牲范式,但不要过度冗余);
5.拒绝大sql语句、拒绝大事物、拒绝大批量;
2
数据库原则
1.建议单库
不超过100个表;
2.建议单表数据量
不超过100w;
3.重要数据和不重要数据最好不要存在一个库中;
4.数据库字段如果有中文,建议为接口中字段长度的3倍;
3
基本表原则
基本表与中间表、临时表不同,因为它具有如下四个特性
:
原子性:基本表中的字段是不可再分解的;
原始性:基本表中的记录是原始数据(基础数据)的记录;
演绎性:由基本表与代码表中的数据,可以派生出所有的输出数据;
稳定性:基本表的结构是相对稳定的,表中的记录是要长期保存的;
4
字段类原则
1.尽量使用数值类型(用合适的字段类型节约空间);
2.字符转化为数字(能转化的最好转化,同样节约空间、提高查询性能);
3.尽量使用not null;
4.少用text
类型(尽量使用varchar代替text字段);
5.字段需要清晰的comment;
6.建议单表字段数上限控制在20~50个;
7.禁止同一个字段在不同的表之间用不同的数据类型;
5
索引类原则
1.合理使用索引(改善查询,减慢更新,索引一定不是越多越好);
2.字符字段必须建前缀索引;
3.不在索引做列运算;
4.innodb主键推荐使用自增列
;
5.禁止使用外键(由程序保证约束);
6.尽量不要使用唯一约束(无法利用mysql、的插入缓冲,造成插入性能慢);
7.大字段不宜索引,分区表 无法使用全文索引;
6
业务类原则
1.解耦合,模块之间尽量减少相互依赖,相互调用;
2.解耦合,接口之间禁止重复利用同一个查询接口;
3.保证事务的原子性,一致性;
4.保证数据完整性,安全性,有效性,防止非法用户使用数据库或合法用户非法使用数据库造成数据泄露、更改或破坏,防止不同模块用户交叉使用,敏感数据及早加密;
5.可伸缩性与可扩展性原则:数据库结构的设计应充分考虑发展的需要、移植的需要,具有良好的扩展性、伸缩性和适度冗余;
6.规范化:数据库的设计应遵循规范化理论,规范化的数据库设计可以减少数据库插入、删除、修改等操作时的异常和错误,降低数据冗余度等;
7
SQL类原则
1.sql语句尽可能简单;
2.简单的事务;
3.不用select *(消耗cpu,io,内存,带宽,这种程序不具有扩展性);
4.OR改写为IN(or的效率是n级别);
5.OR改写为UNION;
6.避免负向%;
7.慎用count(*);
8.limit高效分页(limit越大,效率越低);
9.使用union all替代union(union有去重开销);
10.少用连接join;
11.使用group by;
12.请使用同类型比较;
13.打散批量更新;
8
巧用性能分析工具
1.show profile;
2.mysqlsla;
3.mysqldumpslow;
4.explain;
5.show slow log;
6.show processlist;
二
MySQL数据库开发规范
1
常用规则
1.最少返回原则,数据库查询返回客户端数据是需要网络传输开销的,可能本来不需要读取这些列,但因为偷懒写成 SELECT * 导致内存buffer pool被这些“垃圾”数据把真正需要缓冲起来的热点数据给洗出去了。导致其他查询性能变慢;
2.一对一原则,每个查询接口只对接一个应用接口,禁止重复使用同一个查询接口,这对后期的影响是巨大的,跷跷板反应;
3.隐式转换、禁止使用隐式转换,这可能带来一些意外;
4.尽量避免全表扫描的情况;
5.避免三个表以上的关联;
6.大表查询,需要提前告知DBA;
7.where条件中按索引顺序写;
8.核心查询必须使用到索引,优先使用覆盖索引;
9.hash索引只有在等于的时候才有效;
10.经常使用EXPLAIN诊断,避免生成临时表,文件系统排序;
11.谨慎使用大表分页;
12.尽量不要一次查询过多数据,缩小查询范围;
13.排序字段一定要属于驱动表,才能利用驱动表上的索引完成排序;
2
索引禁忌与限制
1.不在离散度低的列上新建索引;
2.不在索引上做运算,函数操作;
3.like通配符开头,无法使用到索引;
4.类型转换,索引失效;
5.谨慎范围查询,只有第一列能真正使用到索引;
6.索引不宜过多,索引提升了查询性能,但降低了插入和更新性能;
7.索引尽量为少更新,如果到一定程度后,优化器将放弃索引走全表扫描;
8."!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE",like %aaa%‟ 尽量不用;
3
DML
1.禁止单个sql更新多个表;
2.所有更新必须使用到索引(实现高并发,减少锁资源争抢);
3.禁止使用delete,程序用户无delete权限;
4.禁止在DML中使用limit;
4
DDL
1.DDL 请使用Yearning工单,Yearning有DDL自动审核机制,会自动选则使用online 还是第三方工具;
2.多个DDL 能合并则尽量合并(减小代价);
3.DDL 统一安排在晚上;
5
TCL
1.核心部分,请使用事务,保证数据的一致性;
2.非核心部分业务,可拆分大事务,减少锁定时间;
6
排版与注射
1.SQL语句请格式化,Navicat可美化SQL,总的原则是使代码清晰可读;
2.注释尽可能详细、全面,并且将注释放在实现代码的前面,提高可读性;
三
MySQL数据库设计规范
1
数据库命名规范
1.采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_作为数据库名;
2.命名尽量简洁明确(长度不能超过30个字符);
例如:user, stat, log, 也可以wifi_user,wifi_log,wifi_stat给数据库加个前缀;
3.除非是备份数据库可以加0-9的自然数:user_db_2021220;
2
数据表命名规范
1.基本表:采用26个英文字母和0-9的自然数加上下划线'_'组成,命名尽量简洁明确,多个单词用下划线'_'分隔,同一块业务,开头需要保持一致,要做到看到表名知道表的来源;
例如:user_login, user_profile, user_detail, user_role, user_role_relation,user_role_right, user_role_right_relation;
2.关系表:例如以 rel_ 开头 或者 _rel 结尾,命名简洁明确,关系一看明了;
3.表必须有清晰的comment;
4.系列表需保持开头一致;
3
数据库的字段名命名规范
1.采用26个英文字母和0-9的自然数加上下划线'_'组成,一般不超过3个单词;
2.命名简洁明确,多个单词用下划线'_'分隔;
例如:user_login表字段 user_id, user_name, pass_word, eamil, status, mobile, add_time;
3.每个表中必须有自增主键,add_time(默认系统时间);
4.表与表之间的相关联字段名称要求尽可能的相同;
5.每个表必须包含固定字段,逻辑删除,创建时间,创建人,修改时间,修改人,备注;
6.每个字段必须清晰写明comment,并在修改时,及时更新comment;
7.将离散度高的列往前放,创建索引按列的顺序,查询按列的顺序查询,保持三者一致;
8.不得使用MySQL关键字,保留字;
4
数据库的字段类型规范
1.用尽量少的存储空间来存数一个字段的数据;
例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);
2.IP地址最好使用int类型;
3.固定长度的类型最好使用char,例如:邮编;
4.能使用tinyint就不要使用smallint,int;
5.最好给每个字段一个默认值,最好不能为null;
5
数据表索引规范
1.命名简洁明确,例如:user_login表user_name字段的索引应为user_name_index唯一索引;
2.为每个表创建一个主键索引;
3.为每个表创建合理的索引;
4.建立复合索引请慎重;
6
数据库三范式
第一范式(1NF):字段值具有原子性,不能再分(所有关系型数据库系统都满足第一范式);
例如:姓名字段,其中姓和名是一个整体,如果区分姓和名那么必须设立两个独立字段;
第二范式(2NF):一个表必须有主键,即每行数据都能被唯一的区分;
备注:必须先满足第一范式;
第三范式(3NF):一个表中不能包涵其他相关表中非关键字段的信息,即数据表不能有沉余字段;
备注:必须先满足第二范式;
以上
That‘s all
更多系列文章
敬请期待
ITester软件测试小栈(ID:ITestingA),专注于软件测试技术和宝藏干货分享,每周准时更新原创技术文章,每月不定期赠送技术书籍,第三方转载请注明出处。
ITester软件测试小栈
往期内容宠幸
1.Python接口自动化-接口基础(一)
2.Python接口自动化-接口基础(二)
3.Python接口自动化-requests模块之get请求
4.Python接口自动化-requests模块之post请求
5.Python接口自动化之cookie、session应用
6.Python接口自动化之Token详解及应用
7.Python接口自动化之requests请求封装
8.Python接口自动化之pymysql数据库操作
9.Python接口自动化之logging日志
10.Python接口自动化之logging封装及实战
想获取更多最新干货内容
快来星标 置顶 关注我
每周一、三、五 08:30见
<< 滑动查看下一张图片 >>
后台 回复"资源"取干货
回复"微信群"一起打怪升级
个人微信:Cc2015123
添加请注明来意 :)
真爱四连,获取更多知识~
数据库设计原则与开发规范,你知道多少?相关推荐
- 大型数据库的设计原则与开发技巧
目前,计算机技术已经广泛地应用于国民经济的各个领域当中,在计算机硬件不断微型化的同时,应用系统也逐渐向着复杂化.大型化的方向发展.数据库是整个系统的核心,它的设计直接关系系统执行的效率和系统的稳定性. ...
- 数据库设计基本步骤 / 数据库设计原则
基本步骤 按照规范设计的方法,同时考虑数据库及其应用系统开发的全过程,可以将数据库设计分为以下 6 个阶段: 需求分析阶段 需求分析是数据库设计的第一步,也是整个设计过程的基础,本阶段 ...
- [架构设计]-- 数据库设计原则
转自:http://blog.sina.com.cn/s/blog_735fb3b40100svet.html 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库 ...
- 数据库设计(二)——数据库设计原则
一.数据库表的设计原则 1.不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计:不同组件间所对应的数据库表之间的关联应尽可能减少,如果不 ...
- 数据库设计原则和优化
数据库设计原则: 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体. 在特殊情况下,它们可能是一对多或多对一 ...
- 规范化-数据库设计原则
摘要 关系型数据库是当前广泛应用的数据库类型,关系数据库设计是对数据进行组织化和结构化的过程,核心问题是关系模型的设计.对于数据库规模较小的情况,我们可以比较轻松的处理数据库中的表结构.然而,随着项目 ...
- 数据库设计原则和需要考虑的因素
MYSQL数据库设计规范1.数据库命名规范采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成;命名简洁明确(长度不能超过30个字符);例如:user, stat, lo ...
- mysql数据库设计的原则_MySQL数据库设计原则
转自 http://www.supidea.com/post/mysql_design_database.aspx MySQL数据库设计原则 MySQL对于成为一个非常快速的数据库服务器有着当之无愧的 ...
- MYSQL数据库设计原则
一.MYSQL数据库设计原则 1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大 ...
最新文章
- pandas 补充笔记:转换提取类型
- 【转】Postman安装与使用
- “压倒性快感”是怎么来的?氪金抽卡,是利用认知BUG的最强发明
- 前端生态混乱,AMPMIP在努力做标准化工作
- php 上传文件简单实例,php文件上传的简单实例
- 【2016年第5期】卫星影像大数据情报分析与应用
- 互斥与同步——local_irq_enable与local_irq_disable
- 中兴手机数据通道打不开_换了个新手机
- scala 隐式参数入门及应用
- 机器学习之支持向量回归(SVR)
- 无线信道模型分类和建模方法介绍--附思维导图
- 实现内外网互通-概述
- 考勤系统需求分析(软件工程)
- 航信税控系统 - 安装分析(一)
- matlab newton method,matlab Newton method
- ios 七种手势详解
- Android项目---快递查询
- 图标右上角的数字小圆圈 如图 在tabBarController中设置
- 微信小程序之日期时间筛选器实现(支持年月日时分)
- 计算机控制系统期末测试,学堂在线计算机操作系统考试题及答案
热门文章
- 杭电 4548 美素数
- 下列php语法描述错误的是,下列关于对象替换语法规则的描述中,错误的是( )。...
- mfc大观之二(类识别)
- 司机行为识别_台州交警上线“闯红灯抓拍神器”人脸识别+4米大屏,拍到违章直接曝光...
- python三维圆曲面_python – matplotlib中的曲面和三维轮廓
- java修改请求url_spring cloud zuul修改请求url的方法
- matlab双立方插值法_双三次插值(Bicubic interpolation)缩放图片
- php自动下载 linux,Linux下软件、PHP和Perl的模块等都实现了自动安装
- python函数转换_将Python函数转换为PL/Python函数
- mysql update emp set_Mysql数据库性能优化一