加入收藏 | 设为首页 | 会员中心 | 我要投稿 聊城站长网 (https://www.0635zz.com/)- 智能语音交互、行业智能、AI应用、云计算、5G!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

Mysql设置之范式详析

发布时间:2023-08-01 15:31:41 所属栏目:MySql教程 来源:
导读:范式的定义是什么?范式:Normal Format,是一种离散数学中的知识,是为了解决数据的存储与优化的问题:保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余。
范式的定义是什么?范式:Normal Format,是一种离散数学中的知识,是为了解决数据的存储与优化的问题:保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余。
 
范式背景:
 
1、是为了解决数据冗余
 
2、是为了数据的优化与存储
 
3、保存数据之后,可以通过关系得到的数据,不再存储
 
范式概念:
 
1、是一种分层结构的规范,分为6层
 
2、每一层都比上一层更严格
 
3、若要满足下一层范式,前提是满足上一层
 
4、范式在数据库中具有指导意义,但是不强制规范
 
5、数据库不仅要考虑空间问题,还要考虑效率问题,一般用前第三层
 
6、六层范式, 1NF是最底层,要求最低;6NF最高层,最严格.
 
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般说来,数据库只需满足第三范式(3NF)就行了。
 
第一范式:确保每一列不可再分
 
要求
 
1、在设计表存储数据时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么表的设计不满足第一范式
 
2、第一范式要求字段具有原子性、不可再分割
 
例如:
 
讲师代课表

上表设计不存在问题: 但是如果需求是将数据查出来之后,要求显示一个老师从什么时候开始上课,到什么时候结课:, 则需要将代课时间进行拆分: 不符合1NF, 数据不具有原子性, 可以再拆分.
 
解决方案
 
解决方案: 将代课时间拆分成两个字段就解决问题.
 
第二范式:确保表中每一列都和主键有关
 
要求
 
1、在数据表设计过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定,而是依赖于主键中的某个字段(主键的部分)
 
2、存在字段依赖主键的部分的问题,称之为部分依赖
 
3、第二范式就是解决表设计不允许出现部分依赖
 
复合主键: 讲师+班级
 
以上表中: 代课时间,开始和结束字段都与当前的主键(讲师和班级)有关系, 但是性别并不依赖班级, 教室不依赖讲师, 性别只依赖讲师, 教室只依赖班级, 出现了性别和教室依赖主键中的一部分: 部分依赖.不符合第二范式.
 
解决方案
 
解决方案1: 可以将性别与讲师单独成表, 班级与教室也单独成表.
 
解决方案2: 取消复合主键, 使用逻辑主键
 
逻辑主键:没有业务含义,比如自增主键
 
业务主键:有业务含义,比如person表用身份证号当主键

第三范式:确保每一列都和主键列直接相关,而不是间接相关
 
要求
 
1、要满足第三范式、必须满足第二范式
 
2、理论上讲,应该一张表中的所有字段都应该直接依赖于主键,如果表设计中存在一个字段,并不直接依赖主键,而是通过某个非关键字段依赖,最终实现依赖主键,把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖
 
3、第三范式就是解决传递依赖的问题
 
主键: ID
 
以上设计方案中: 性别依赖讲师存在, 讲师依赖主键; 教室依赖班级,班级依赖主键: 性别和教室都存在传递依赖.
 
解决方案
 
将存在传递依赖的字段,以及依赖的字段本身单独取出,形成一个单独的表, 然后在需要对应的信息的时候, 使用对应的实体表的主键加进来.
 
反范式
 
有时候,在设计表的时候,如果一张表中有几个字段需要从另外的表中去获取信息,理论上讲,的确可以获得想要的数据,但是效率低一点,会刻意的在某些表中,不去保存另外表的主键,而是直接保存想要的数据信息,这样一来,在查询数据的时候,一张表可以直接提供数据,而不需要多表查询((效率低),但是冗余会增加
 
 

(编辑:聊城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章