Mysql中的范式

Mysql中的范式目录 范式定义 第一范式 第二范式 第三范式 反范式 范式定义 范式:Normal Format,是一种离散数学中的知识,是为了解决数据的存储与优化的问题:保存数据的存储之后,凡是能够通过关系寻找出来

Mysql中的范式

目录

  • 范式定义
  • 第一范式
  • 第二范式
  • 第三范式
  • 反范式

范式定义

范式:Normal Format,是一种离散数学中的知识,是为了解决数据的存储与优化的问题:保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余。

范式背景:

1、是为了解决数据冗余
2、是为了数据的优化与存储
3、保存数据之后,可以通过关系得到的数据,不再存储

代码100分

范式概念:

代码100分1、是一种分层结构的规范,分为6层
2、每一层都比上一层更严格
3、若要满足下一层范式,前提是满足上一层
4、范式在数据库中具有指导意义,但是不强制规范
5、数据库不仅要考虑空间问题,还要考虑效率问题,一般用前第三层
6、六层范式, 1NF是最底层,要求最低;6NF最高层,最严格.

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般说来,数据库只需满足第三范式(3NF)就行了。

第一范式:确保每一列不可再分

要求

1、在设计表存储数据时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么表的设计不满足第一范式
2、第一范式要求字段具有原子性、不可再分割

例如:
讲师代课表

讲师 性别 班级 教室 代课时间 代课时间(开始/结束)
朱元璋 Male php0226 D302 30天 2014-02-27,2014-05-05
朱元璋 Male Php0320 D206 30天 2014-03-21,2014-04-20
朱元璋 Female Php0320 D206 30天 2014-06-01,2014-06-15

上表设计不存在问题: 但是如果需求是将数据查出来之后,要求显示一个老师从什么时候开始上课,到什么时候结课:, 则需要将代课时间进行拆分: 不符合1NF, 数据不具有原子性, 可以再拆分.

解决方案

解决方案: 将代课时间拆分成两个字段就解决问题.

讲师 性别 班级 教室 代课时间 开始 结束
朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
朱元璋 Male Php0320 D206 30天 2014-03-21 2014-04-20
花木兰 Female Php0320 D206 30天 2014-06-01 2014-06-15

第二范式:确保表中每一列都和主键有关

要求

代码100分1、在数据表设计过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定,而是依赖于主键中的某个字段(主键的部分)
2、存在字段依赖主键的部分的问题,称之为部分依赖
3、第二范式就是解决表设计不允许出现部分依赖

讲师带课表

讲师 性别 班级 教室 代课时间 开始 结束
朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
朱元璋 Male Php0320 D206 30天 2014-03-21 2014-04-20
花木兰 Female Php0320 D206 30天 2014-06-01 2014-06-15

复合主键: 讲师+班级

以上表中: 代课时间,开始和结束字段都与当前的主键(讲师和班级)有关系, 但是性别并不依赖班级, 教室不依赖讲师, 性别只依赖讲师, 教室只依赖班级, 出现了性别和教室依赖主键中的一部分: 部分依赖.不符合第二范式.

解决方案

解决方案1: 可以将性别与讲师单独成表, 班级与教室也单独成表.

解决方案2: 取消复合主键, 使用逻辑主键

  • 逻辑主键:没有业务含义,比如自增主键
  • 业务主键:有业务含义,比如person表用身份证号当主键
ID 讲师 性别 班级 教室 代课时间 开始 结束
1 朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
2 朱元璋 Male Php0320 D206 30天 2014-03-21 2014-04-20
3 花木兰 Female Php0320 D206 30天 2014-06-01 2014-06-15

第三范式:确保每一列都和主键列直接相关,而不是间接相关

要求

1、要满足第三范式、必须满足第二范式
2、理论上讲,应该一张表中的所有字段都应该直接依赖于主键,如果表设计中存在一个字段,并不直接依赖主键,而是通过某个非关键字段依赖,最终实现依赖主键,把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖
3、第三范式就是解决传递依赖的问题

讲师带课表

ID 讲师 性别 班级 教室 代课时间 开始 结束
1 朱元璋 Male php0226 D302 30天 2014-02-27 2014-05-05
2 朱元璋 Male Php0320 D206 30天 2014-03-21 2014-04-20
3 花木兰 Female Php0320 D206 30天 2014-06-01 2014-06-15

主键: ID

以上设计方案中: 性别依赖讲师存在, 讲师依赖主键; 教室依赖班级,班级依赖主键: 性别和教室都存在传递依赖.

解决方案

将存在传递依赖的字段,以及依赖的字段本身单独取出,形成一个单独的表, 然后在需要对应的信息的时候, 使用对应的实体表的主键加进来.

讲师带课表

ID 讲师ID 班级ID 代课时间 开始 结束
1 1 5 30天 2014-02-27 2014-05-05
2 1 6 30天 2014-03-21 2014-04-20
3 2 6 30天 2014-06-01 2014-06-15

讲师表

ID 讲师 性别
1 朱元璋 Male
2 花木兰 Femle

教室表

ID 讲师 性别
5 php0226 D302
6 Php0320 D206

反范式

有时候,在设计表的时候,如果一张表中有几个字段需要从另外的表中去获取信息,理论上讲,的确可以获得想要的数据,但是效率低一点,会刻意的在某些表中,不去保存另外表的主键,而是直接保存想要的数据信息,这样一来,在查询数据的时候,一张表可以直接提供数据,而不需要多表查询((效率低),但是冗余会增加

站在巨人的肩膀上摘苹果:

https://www.cnblogs.com/hum0ro/p/8877364.html

https://blog.csdn.net/weixin_43048795/article/details/88564962

https://www.jianshu.com/p/2a7242e3d21a

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9438.html

(0)
上一篇 2023-02-08
下一篇 2023-02-08

相关推荐

  • 云小课|MRS基础原理之Oozie任务调度[通俗易懂]

    云小课|MRS基础原理之Oozie任务调度[通俗易懂]阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要:Oozie是一个基

    2023-06-13
    155
  • 使用Python列表管理和操作项目

    使用Python列表管理和操作项目在Python中,列表是一个经常被使用的数据结构,用于存储一组有序的数据。列表可以包含不同类型的元素,例如数字、字符串和其他列表。Python提供了一些内置函数和方法,可以方便地对列表进行管理和操作。下面将从多个方面对使用Python列表管理和操作项目进行详细阐述。

    2024-03-03
    81
  • 元类, pymysql[通俗易懂]

    元类, pymysql[通俗易懂]元类, pymysql 一、元类 自定义元类 二、pymysql 通过pymysql 去连接数据库

    2022-12-26
    149
  • Mysql索引失效的情况[通俗易懂]

    Mysql索引失效的情况[通俗易懂]前提:建立了一个employee表,同时建立了一个组合索引lastName,gender 。 1.最常说的like匹配 例1 explain select * from employee where

    2023-03-04
    193
  • SQL查询结果排序_sql中查询结果多余5条

    SQL查询结果排序_sql中查询结果多余5条【SQL从一点一滴分析系列文章】为实际开发中的点点滴滴的总结,从最最简单的SQL 查询 到 综合分析查询 在分析 SQL 时,也会同时分析 mybatis 、Hibernate 中的相关操作 点击查…

    2023-01-29
    151
  • 重庆哪里有开餐饮费发票

    重庆哪里有开餐饮费发票电薇13530507261 保-真,可-先-幵-验,陈经理。链接与装载是一个比较晦涩的话题,大家往往容易陷入复杂的细节中而难以看清问题的本来面目。从本质上讲各个系统的编译、链接、装载过程都是大同小异…

    2023-02-16
    162
  • Python字符串分割函数用法详解

    Python字符串分割函数用法详解Python中的字符串分割函数split()可以将一个字符串按照指定的分割符进行分割,并将每个分割后的子字符串转化为一个列表。

    2023-12-06
    116
  • 中国银行KONDOR系统_TIDB在win10安装

    中国银行KONDOR系统_TIDB在win10安装作者介绍:韩宇,中国银行信息科技运营中心工程师。 本文的内容可能和之前的金融企业将 TiDB 应用在业务上的实践不同,下面主要介绍我们如何把 TiDB 应用在金融行业的后台运维监控上。Zabbix …

    2023-03-17
    142

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注