什么是数据库的反规范化设计,为什么要进行反规范化设计,反规范化设计的方法有哪些
一般情况下我们对数据库的表结构进行设计时要遵循规范化的设计,就是要遵守一定的范式,数据库中的数据规范化的优点是减少了数据冗余,节约了存储空间,相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度,但是对完全规范的数据库查询,通常需要更多的连接操作,从而影响查询速度。因此在某些情况下,我们为了提高某些数据的查询速度,需要破坏规范化的设计,采用一些非常规的设计,即反规范化,常见的反规范化方法包括:
1、增加冗余列
增加冗余列是指在多个表中具有相同的列,它常用来在查询时避免连接操作。例如:以规范化设计的理念,学生成绩表中不需要字段“姓名”,因为“姓名”字段可以通过学号查询到,但在反规范化设计中,会将“姓名”字段加入表中。这样查询一个学生的成绩时,不需要与学生表进行连接操作,便可得到对应的“姓名”。
2、增加派生列
增加派生列指增加的列可以通过表中其他数据计算生成。它的作用是在查询时减少计算量,从而加快查询速度。例如:订单表中,有商品号、商品单价、采购数量,我们需要订单总价时,可以通过计算得到总价,所以规范化设计的理念是无须在订单表中设计“订单总价”字段。但反规范化则不这样考虑,由于订单总价在每次查询都需要计算,这样会占用系统大量资源,所以在此表中增加派生列“订单总价”以提高查询效率。
3、重新组表
重新组表指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。
4、分割表
有时对表做分割可以提高性能。表分割有两种方式。
水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。水平分割通常在下面的情况下使用。
情况 1:表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询效率。
情况 2:表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
情况 3:需要把数据存放到多个介质上。
垂直分割:把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少 I/O 次数。其缺点是需要管理冗余列,查询所有数据需要连接操作。
- 1vue和el-table使用经验-如何刷新表格数据10886
- 2three.js加载3D瓦片和3dtiles数据生成交互式地图的开源项目9452
- 3Microsoft Visual C++ Redistributable是什么,有什么作用?7182
- 4mybatis使用经验——mybatis-spring-boot-starter和mybatis的版本对应关系表(持续更新~)5760
- 5uni-app使用经验—vue页面和html页面如何互相调用接口并传参5438
- 6Spring学习经验—@ResponseBody注解的使用说明4845
- 7Intellij IDEA下的版本控制VCS的启用与关闭4789
- 8Druid异常解决经验—java.sql.SQLException url not set4466
- 9如何用批处理命令(bat脚本)启动和停止windows服务4231
- 10nuxt.js项目中如何添加和使用全局变量4098
- 11解决SpringBoot使用maven下载不了jar包的问题3452
- 12linux中解压tar.gz文件报错“gzip: stdin: invalid compressed data--format violated”3344
- 13nuxtjs asyncData使用经验—如何发起多个axios请求并携带参数3206
- 14在Nuxt.js项目的head中引用外部js文件3043
- 15在NVIDIA控制面板设置参数时提示“拒绝访问 无法应用选定的设置到您的系统”的解决方法之一3020