mysql 范式化_MySQL-范式和反范式

1.第一范式(1NF)(列不能再拆分)

原子性,字段不可分(列的信息),只要是关系型数据库,就自动满足1NF;

2.第二范式(2NF)(主键唯一,且被依赖)

在第一范式基础上建立的,即满足第二范式的必须先满足第一范式。要求DB表中的每个实例或行必须可以被唯一区分,通常设计一个主键来实现,其他属性完全依赖主键。

3.第三范式(3NF)(表与其他表间没有关联)

必须满足第二范式,要求一个数据库表中不包含已在其他表中已包含的非主键字段。即:表的信息,如果能够被推导出来,就不应该单独设计一个字段来存放(能尽量外键join就用外键join)。很多时候,为满足第三范式往往会把一张表分成多张表,如:

c1e9148a29265ae838229e48e72ab9f9.png

4.反范式

通过增加冗余或重复的数据来提高数据库的读性能。

具体做法:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,减少了查询时的关联,提高查询效率,因为在数据库的操作中查询的比例要远远大于DML的比例。但是反范式化一定要适度,并且在原本已满足三范式的基础上再做调整。

实际,比如:可以减少关联查询时,jion表的次数,如:在3中,增加字段role_name。

5.范式化优点及缺点:

优点:

.更新操作通常比反范式化要快;

.范式化的表通常更小,没有数据冗余,更省数据库空间,同时可以放在内存,所以执行操作会更快。

.很少有多余数据意味着检索列表数据更少需要distinct或group by语句。

.数据较好的范式化,只有很少或没有重复数据,所以,只需要修改更少的数据。

缺点:

.范式化schema通常需要关联,可能使一些索引策略无效。

.范式等级越高,设计出来的表越多,可能会增加查询需要的时间。

6.反范式化优点及缺点:

优点:

.可以很好避免关联。

.如果不需要关联表,对大部分查询最差情况,没有使用索引,全表扫描,当数据比内存大时,可能比关联快,避免随机IO

7.实际经验

实际中,不会极端使用范式化或反范式化schema,可能使用部分范式化schema、缓存表、及其他技巧。

最常见反范式化数据方法:复制或缓存,在不同表中存储相同的特定列,比如:实际业务涉及的表非常多,表间连接会比较多,对表的操作要尽量快,通常会使用反范式设计,用空间换时间,把数据冗余在多张表中,查询时可以减少或避免表间关联。

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

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

相关文章

端口被占用解决办法

1. 端口被占用解决办法 netstat -ano | findstr 8080(端口号) taskkill -pid (进程pid) –f转载于:https://www.cnblogs.com/xaoco/p/9114773.html

java 判断是否是list_JAVA从头开始一基础梳理(4-3)

大家好,今天我们介绍一下java中常用的集合类型。首先,我们先看一下java中集合类型的结构。以上是集合的继承关系图,通常我们使用的比较多的是 Set , List , Map以及其衍生的子类和接口实现类。首先给大家介绍一下List,List本身是一…

Python2.x还是3.x?

2.x 和 3.x对于程序员的编码来说,没有发生太大的变化,当然也是有变化的,主要是Python内部发生了巨变。 要用3.x的原因是: 1、3.x和2.x版本不兼容。 2、Python库新增的内容不支持2.x了。 3、2.x版本官方支持到2020年结束。 晚改…

前端网页广告无线翻滚_从小白到web前端工程师进阶之路 从0到1到更深

互联网的发展,让web前端技术发生了翻天覆地的变化,前端开发工程师可以让网页内容变得更加生动,为用户带来更好的体验。那么,武汉web前端培训哪个好?web前端好学吗?作为一个合格的Web前端工程师,…

PowerDesigner导出表为Excel(转)

打开脚本运行器CtrlShiftX 导出: ****************************************************************************** Option ExplicitDim rowsNumrowsNum 0 -----------------------------------------------------------------------------Main function -------…

判读一个对象不为空_ArrayList实现分析(一)——对象创建

ArrayList是java中最常用的集合类之一,它的内部实现是基于数组,因此ArryList可以根据索引实现随机访问。ArryList继承了AbstractList类,并且实现了List, RandomAccess, Cloneable接口。下面详细分析一下ArrayList的实现,下面的分析…

AngularJS与Angular的区别

指同一事物,版本的区别,叫法不同 Angular2.0之前的版本(1.x)叫做AngularJS 1.x的使用是引入AngularJS的js文件到网页。 2.0之后,就是完全不同了。 Angular2.x与Angular1.x 的区别类似 Java 和 JavaScript 或者说是…

网页控制台调用click()失败_C# 调用百度AI 人脸识别

一、设置登录百度云控制台,添加应用-添加人脸识别,查找,对比等。设置人脸识别应用记住API Key和Secret Key二、创建Demo程序1、使用Nuget安装 Baidu.AI 和 Newtonsoft.JsonNuget2、直接下载SDK https://ai.baidu.com/file/7D961BC013AB4AA790…

mysql查看服务器CPU和内存_怎么查看服务器的cpu和内存的硬件信息

可以按照如下方式进行操作:一、查看cpu总个数方法:1、首先执行top命令,如下图中内容所表示。2、在top命令的显示界面,按数字键1,即可查看到当前系统中的总cpu数,如下图中内容所表示。二、查看总内存的方法&…

内核模式下的文件操作

内核模式下的文件操作 转载于:https://www.cnblogs.com/endenvor/p/9119495.html

极光推送指定用户推送_干货|SpringBoot集成极光推送完整实现代码(建议收藏)...

工作中经常会遇到服务器向App推送消息的需求,一般企业中选择用极光推送的比较多,在集成极光时发现极光的文档并不完整,网上的文章也很多不能直接使用,这里列出我在工作中集成极光的全部代码,只需要按照如下代码保证一次…

什么是ES6?

什么是ES6? ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。Mozilla公司将在这个标准的基础上,推出JavaScript 2.0。   ECMAScript和JavaScript到底是什么关系?很多…

Babylon-AST初探-代码更新删除(Update Remove)

通过前两篇文章的介绍,大家已经了解了Create和Retrieve,我们接着介绍Update和 Remove操作。Update操作通常配合Create来完成。我们这篇文章主要介绍几个常用的NodePathAPI:replace、insert、remove。具体也可以看babel-handbook中的Manipulat…

python中时间间隔默认单位是什么_Python时间增量(以年为单位)

你需要不止一个timedelta来说明多少年过去了;你还需要知道开始(或结束)日期。(这是闰年的事。)最好的方法是使用dateutil.relativedeltaobject,但这是第三方模块。如果您想知道从某个日期起的datetime年(默认为现在),可以执行以下操作&#x…

编解码异常分析

前言 最近在做的项目,有H264解码的需求。部分H264文件解码播放后,显示为绿屏或者花屏。 分析 如何确认是否是高通硬解码的问题 adb 指令 adb root adb remount adb shell setenforce 0 adb shell setprop vendor.gralloc.disable_ubwc 1 adb shell c…

python读取数据库导出文件_python如何导出excel表格数据库数据

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户…

mysql堆溢出_为什么这个MySQL触发器会导致堆栈溢出?

我今天遇到了同样的问题,每次触发都会导致堆栈溢出.原来我的Zend社区服务器安装附带了一个默认的my.cnf文件,其中thread_stack大小设置为128K,这导致每个线程中可用于堆栈的131072字节:mysql> show variables where Variable_name thread_stack;---------------…

MySQL定义数据库对象之指定definer

mysql创建view、trigger、function、procedure、event时都会定义一个Definer: SQL SECURITY 有两个选项,一个为DEFINER,一个为INVOKER;SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示按定义者拥有的权限来…

js根据name获取value_js 函数的重载

js 函数的重载我们知道,很多编程语言都有函数的重载。所谓的重载,看定义:重载,简单说,就是函数或者方法有相同的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间&#xff…

python调用菜单响应事件_[Python] wxpython 编程触发菜单或按钮事件

最近逐步熟悉wxpython,编写了几个小小功能的GUI程序,GUI中免不了会有在代码中触发控件事件的业务需求。在其他Gui界面的语言中有postevent、triggerevent 调用事件名称的函数,非常方便。在wxpython里如何解决呢,上一段简单的代码。…