四、物理优化(1)范式化

一、范式化的概念

  范式化(Normalization)的目标是消除数据冗余,减小物理存储空间。

122434754.png

  常用的范式有以下3种:

1. 第一范式(1NF)

  在任何一个关系数据库中,1NF是对关系模式的基本要求,不满足1NF的数据库就不是关系数据库。

  所谓1NF是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在1NF中表的每一行只包含一个实例的信息。

  例如,对于员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只表示一个员工的信息,一个员工的信息在表中只出现一次。简而言之,第一范式就是无重复的列。  

 

2. 第二范式(2NF)

  2NF是在1NF的基础上建立起来的,即满足2NF必须先满足1NF。2NF要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。

  例如,员工信息表中加上了“员工编号”列,因为每个员工的员工编号是唯一的,因此每个员工可以被唯一区分。这个唯一属性列被称为主关键字或主键、主码。

  2NF要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。  

 

3. 第三范式(3NF)

  3NF要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。简而言之,3NF就是属性不依赖于其它非主属性。 满足3NF必须先满足2NF。 

  例如,存在一个部门信息表,有“部门编号”、“部门名称”、“部门简介”等列。那么在员工信息表中列出“部门编号”后就不能再将“部门名称”、“部门简介”等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则3NF也应该构建它,否则就会有大量的数据冗余。

 

 

二、范式化的优点

1. 从设计角度

  范式化之后,每个表的结构非常明确,对于设计人员来说非常清晰明了,更易于修改系统的架构。

 

2. 从性能的角度 

  范式化之后,每个表变成最窄,因此每一页可以容纳更多的行。查询、排序、索引的开销都会降低。

 

 

三、反范式化

1. 范式化的缺点

  当数据来自不同的表,需要join,当基表的记录非常多时,这也将是一个消耗资源的重要原因。此外,频繁查询一些派生列时需要临时计算,这也会影响性能,而且可能会使查询的设计过程变得复杂。

  例如:对于一张超市POS机的流水单明细表,3NF之后只记录商品ID、单价、数量、单项折扣等信息,查询时才临时产生一个单项金额。 而这张流水单明细表对应的流水单主表,同样也不会保存金额,在查询时通过聚合函数临时计算。

094650510.png

 

  对于上述表结构,如果频繁查询金额,并且表的记录数非常多,性能就会受影响。

 

2. 反范式化(De-normalization)

  在范式化的架构遇到性能问题时,就要考虑放宽范式的要求。通常要仔细权衡,将更新(增、删、改)与查询这两者的开销进行对比。

  例如,在数据更改时就直接计算聚合值,而不是在查询时再临时计算。

121051791.png

 

3. 反范式化的优势

(1)减少join的数量

(2)减少外键的数量

(3)减少索引的数量,从而节省存储空间

(4)加快查询速度,因为聚合值已经预先计算

(5)某些情况下可能减少表的数目 

 

四、反范式化的缺点

1. 虽然加速查询,但降低写入速度。

2. 需要考虑应用程序是否适应。

3. 可能需要增加物理表。

4. 可能使代码变得简单,也可能更复杂。

 

五、范式化 vs. 反范式化

  范式化对表结构的严格要求,可能会影响性能。在设计阶段,务必权衡查询与更新(增删改)的开销对比。

1. 考虑范式化

  较多的更新,而较少的查询时。

 

2. 考虑反范式化

  较少的更新,而较多的查询时。

 

 

本文结语:

  范式化和反范式化各有优势与短板,需要从存储空间、维护的开销、查询的开销等方面综合考量。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​如何在图书馆收获一段爱情?​

1 你为什么不喜欢拍照片(素材来源网络,侵删)▼2 当登记处挂起横幅▼3 这几天老是犯的错误▼4 在图书馆收获的爱情(素材来源网络,侵删)▼5 当老师用键盘讲课(素材来源网络,侵删&a…

MongoDB服务无法启动,原因居然是...

前言某台CentOS服务器上的MongoDB服务突然停止运行,于是登上去排查原因,接下来就是苦逼的爬坑之旅。爬坑记录1、重启服务使用systemctl命令重启服务:systemctl restart mongod.service查看系统日志:journalctl -ex只是提示启动失败…

python绘制饼图双层_有趣!如何用Python-matplotlib绘制双层饼图及环形图?

(1) 饼图(pie),即在一个圆圈内分成几块,显示不同数据系列的占比大小,这也是我们在日常数据的图形展示中最常用的图形之一。 在python中常用matplotlib的pie来绘制,基本命令如下所示&…

C# 获取Excel中的合并单元格

C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格。在取消合并单元格时需要逐个查找及取消,比较麻烦。这里分享一个简单的方法来识别Excel中的合并单元格,识别这些合并单元格之后对这些单元格进行取消合并…

SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区

一、前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思。这里我就里面的一些概念进行讲解,方便大家的交流。 SQL Server 解读【已分区索引的特殊指…

Android之SharedPreferences 存储复杂对象

用SharedPreferences存储一些常用的设置信息很方便,但是我们知道SharedPreferences只能存储一些简单的类型 如何用SharedPreferences来存储一些复杂的对象?下面以map为例,看看SharedPreferences 存储复杂对象的方法 如果想用SharedPreference…

.NET 云原生架构师训练营(设计原则设计模式)--学习笔记

▲ 点击上方“DotNet NB”关注公众号回复“1”获取开发者路线图学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章目录设计原则设计模式设计原则DRY (Dont repeat yourself 不要重复)KISS (Keep it stupid simple 简单到傻子都能看懂)YAGNI (You Arent Gon…

qt qss设置字体大小_Qt编写自定义控件70-扁平化flatui

一、前言对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反而没有扁平化来得…

机器学习之决策树熵信息增量求解算法实现

此文不对理论做相关阐述,仅涉及代码实现: 1.熵计算公式: P为正例,Q为反例 Entropy(S) -PLog2(P) - QLog2(Q); 2.信息增量计算: Gain(S,Sv) Entropy(S) - (|Sv|/|S|)ΣEntropy(Sv); 举例: 转化数据输入: 5 14Outlook Sunny Sunny Overcast Rain Rain Rain …

centos6.4下安装jdk

centos安装好后一般默认安装好了openJDK,且在6.4版本下是jdk7,我们要将其卸载在安装jdk6 1.卸载默认安装好的jdk,按下图所示的命令行命令卸载jdk 2.将jdk安装包上传到/usr/local目录下(将jdk其安装到这个目录下,可用winSCP工具上传…

实践剖析.NET Core如何支持Cookie滑动过期和JWT混合认证、授权

【导读】为防止JWT Token被窃取,我们将Token置于Cookie中,但若与第三方对接,调用我方接口进行认证、授权此时仍需将Token置于请求头,通过实践并联系理论,我们继续开始整活首先我们实现Cookie认证,然后再次引…

简单音乐播放实例的实现,Android Service AIDL 远程调用服务

2019独角兽企业重金招聘Python工程师标准>>> Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借…

C# 使用int.TryParse,Convert.ToInt32,(int)将浮点类型转换整数时的区别

int.TryParse,Convert.ToInt32,(int) 这几种类型在将浮点类型转换整数时是有差别Convert.ToInt32则会进行四舍五入int.TryParse只能转换整数,即浮点类型全部会返回0(int)不会进行四舍五入,只取整数部分,小数点部分完全舍弃using System;public class DoubleToInt{public …

每个女孩子起床后做的第一件事......

1 假如你暴富了(素材来源网络,侵删)▼2 当客服到底有多难?(素材来源网络,侵删)▼3 挺好的(素材来源网络,侵删)▼4 每个女孩子起床后做的第一件事&#xff…

国产知名老牌 PDF 工具正式开源

文 | Travis出品 | OSC开源社区(ID:oschina2013)「PDF 补丁丁」是开发者 wmjordan 所开发的一款适用于 Windows 系统的多功能 PDF 文档工具箱,开发者最早于 2009 年开始了该程序的开发,如今已有十二年历史,…

.net Repeater知识知多少

&#xff08;一&#xff09;.net中使用Repeater绑定数据&#xff0c;并使用repeater循环出的两个值&#xff0c;赋给repeater中的div的value值。详细如下&#xff1a; 前端.net代码&#xff1a; <div class"wytz_xmlb_nr clear"><asp:Repeater ID"RpBi…

目瞪口呆!137亿年的宇宙演化,竟然如此震撼!简直颠覆想象....

▲ 点击查看1968年圣诞节&#xff0c;阿波罗8号在环月球轨道上拍摄了一张照片。这是地球拥有的第一张自拍。也让人类第一次感受到&#xff0c;原来在广阔无垠的宇宙中&#xff0c;地球不过是一个美丽而又珍贵的孤岛。1990年&#xff0c;旅行者1号完成了所有的观测使命&#xff…

Martin Fowler:数字化时代,远程与本地协同工作孰优孰劣?| IDCF

作者&#xff1a;Martin Fowler译者&#xff1a;冬哥原文&#xff1a;https://martinfowler.com/articles/remote-or-co-located.html远程工作与同地工作之间不是简单的二分法&#xff0c;相反&#xff0c;团队有多种分布模式&#xff0c;每种模式都有不同的权衡和适合的有效技…