关系:

  所有的关系都是指表与表之间的关系。

  将实体与实体的关系,反应到最终数据库表的设计上来,可以将关系分成三种:一对一,一对多(多对一)和多对多。

  一对一:

  一张表的一条记录一定只能与另外一张表的记录进行对应,反之亦然。

  数据库表设计成以上形式是符合要求的。其中姓名、性别、年龄、身高、体重属于常用数据;但是婚姻、籍贯、住址、联系人属于不常用数据。如果每次查询都是查询所有数据,不常用数据就会影响效率。

  解决方案:

  将常用数据和不常用数据分离,分成两张表进行存储。

一个常用表中的一条记录,永远只能在一张不常用表中匹配一条记录;反过来,一个不常用表中的一天记录在常用表中也只能陪陪一条记录;一对一的关系。

  一对多:

  一张表中有一条记录,可以对应另外一张表中的多条记录;但反过来,另一张表中的一条记录只能对应第一张表中的一条记录;一对多或者多对一关系。

  以上关系一个妈妈可以在多个孩子表中找到对应记录(也可能是一条);但是在一个孩子表中,只能找到一个妈妈,这是一种典型的一对多关系。

  在上面设计中,解决了实体的设计表问题,但是没有解决关系问题,这样孩子是找不到妈妈的,妈妈也找不到孩子,解决方案:

  在孩子表中增加一个字段指向妈妈表,因为孩子表的记录只能匹配到一条妈妈表的记录。

  

  多对多:

   一张表中(A)的一条记录能够对应另外一张表(B)中的多条记录,同时B表中的一条记录也能对应A表中的多条记录;多对多的关系。

  以上设计方案:实现了实体的设计,但是没有维护实体的关系。一个老师教过多个学生,一个学生也被多个老师教过。

  解决方案:

  在学生表中增加老师字段:不管在哪张表中增加字段,都会出现一个问题,该字段要保存多个数据,而且是与其他表有关系的字段,不符合表的设计规范。所以增加一张新表,专门维护两张表之间的关系。

  增加中间表之后,中间表与老师表形成一对多关系,而且中间表是多表,维护了能够唯一找到老师表的关系。同样,学生表与中间表也是一个一对多的关系,一对多的关系可以匹配到关联表之间的数据。

范式(Normal Format):

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

  范式是一种分层结构的规范,共分为六层,每一层都比上一层更加严格。若要满足下一层范式,前提是满足上一层范式。

  六层范式:1NF,2NF,3NF,4NF,5NF,6NF。1NF是最底层,要求最低;6NF是最高层,要求最严格。

  MySQL属于关系层数据库,有空间浪费,也是致力于节省存储空间,与范式所解决的问题不谋而合,在设计数据库的时候,会利用到范式来指导设计。

  但是数据库不单是要解决空间问题,要保证效率问题;范式只为解决空间问题,所以数据库的设计又不可能完全按照范式的要求实现,一般情况下,只有前三种范式需要满足。

  范式在数据库的设计当中是有指导意义,但不是强制规范。

  1NF:

  第一范式:在设计存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么说明表的设计不满足第一规范。

第一范式要求字段的数据具有原子性:不可再分。

  讲师代课时间:

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

  解决方案:将代课时间拆分为两个字段就能解决问题。

  

  2NF:

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

  讲师代课表:

  

之上表中:因为讲师没有办法作为独立主键,需要结合班级才能作为主键(复合主键:一个老师在一个班永远只带一个阶段的课程),代课时间,开始和结束字段都与当前的代课主键(讲师和班级),但是性别并不依赖班级,教室不依赖讲师,性别只依赖讲师,教室只依赖班级,出现了性别和教室依赖主键中的一部分,部分依赖,不符合第二范式。

  3NF:

  要满足第三范式,必须满足第二范式

  第三范式理论上讲,应该在一张表中的所有字段都应该直接依赖主键(逻辑主键:代表的是业务主键),如果表设计中存在一个字段,并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键,把这种不是直接依赖主键,而是依赖非主键字段的依赖关系称之为传递依赖。第三范式就是要解决传递依赖的问题。

  上表中:性别依赖讲师存在,讲师依赖主键;教室依赖班级,班级依赖主键;性别和教室都存在传递依赖。

  解决方案:将存在传递依赖的字段,以及依赖的字段本身单独取出,形成一个单独的表,然后再续约对应的信息的时候,使用对应的实体表的主键加进来。

  逆规范化:

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

逆规范化:磁盘利用率与效率的对抗。

MySQL之表关系与范式的更多相关文章

  1. Mysql多表关系

    mysql多表关系 多表关系是关系型数据库特有的 三种关系 一对一关系 一对多关系 多对多关系 总结 一对一 例子:用户和用户信息 外键设置在用户上,外键字段唯一非空 添加 无级联:先增加被关联表记录 ...

  2. MySQL之表关系

    MySQL表关系 一对多关系 一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系. 举例,学校中一个学.院可以有很多的学生,而一个学生只属于某一个学院(通常情况下), ...

  3. MySql 多表关系

    多表关系 一对一关系 一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面 一对多关系 班级是1端,学生是多端,结合面向对象的思想 ...

  4. mysql管理表关系

    表关系管理 关注公众号"轻松学编程"了解更多. 1.概述 ​ 表与表之间的关系可以是一对一.一对多.多对一的.通过外键把表连接起来,外键放在任意一张表都可以,通常选择由从表(相对次 ...

  5. MySQL约束条件 表关系建立 查询数据

    约束条件 unsigned 无符号 即为非负数,用此类型可以增加数据长度 例如 tinyint最大范围是127,那tinyint unsigned 最大就可以到 127 * 2 通常用在不会出现符号的 ...

  6. MySQL开发——【多表关系、引擎、外键、三范式】

    多表关系 一对一关系 一对多或多对一关系 多对多关系 MySQL引擎 所谓的MySQL引擎就是数据的存储方式,常用的数据库引擎有以下几种: Myisam与InnoDB引擎之间的区别(面试) ①批量插入 ...

  7. 库增删该查,表增删该查,记录增删该查,表与表关系(多对多,多对一,一对一),mysql用户管理

    库增删该查 增加库 create database db1 create database db1 charset="gbk 查看库 show databases 查看所有库 show cr ...

  8. MySQL数据库篇之完整性约束和表关系

    主要内容: 一.完整性约束 二.表关系 1️⃣ 完整性约束 (1)何为完整性约束? 约束条件与数据类型的宽度一样,都是可选参数. 作用:用于保证数据的完整性和一致性 (2)分类主要有以下五类: 1.n ...

  9. mysql数据库之表关系

    外键 前戏之一对多关系 # 定义一张部门员工表id name gender dep_name dep_desc1 jason male 教学部 教书育人2 egon male 外交部 漂泊游荡3 ta ...

随机推荐

  1. python的常用魔法方法详细总结

    构造和初始化 __init__我们很熟悉了,它在对象初始化的时候调用,我们一般将它理解为"构造函数". 实际上, 当我们调用x = SomeClass()的时候调用,__init_ ...

  2. NodeMCU手把手入门:配置NodeMCU ESP8266开发板环境及点亮LED灯

    之前一直在玩树莓派,最近实验室买了些NodeMCU就想着玩一玩,没想到挺有意思的.其实树莓派能实现的功能,它大部分也可以,价格比派也便宜不少,舍不得买派的同学可以先买这个开发板玩一玩. 本文主要介绍了 ...

  3. 编辑器之神_vim

    01vim简介 1.什么是vim: 文本编辑器 2.vim特点: 没有图形界面;只能是编辑文本内容;没有菜单 ;只有命令 3.在很多linux发行版中,直接把vi作为vim的软连接 02打开和新建文件 ...

  4. 关键字 package 和 import

    1. package的使用 1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识 ...

  5. AT2272 [ARC066B] Xor Sum 题解

    题目连接:传送门 分析 这道题只看题目中给的样例是找不出规律的 所以我们可以打一下表 1, 2, 4, 5, 8, 10, 13, 14, 18 如果你还是没有看出什么规律的话,我们可以从OEIS上搜 ...

  6. NOIP 2016 洛谷 P2827 蚯蚓 题解

    题目传送门 展开 题目描述 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手 ...

  7. 一文搞定 Spring Data JPA

    Spring Data JPA 是在 JPA 规范的基础上进行进一步封装的产物,和之前的 JDBC.slf4j 这些一样,只定义了一系列的接口.具体在使用的过程中,一般接入的是 Hibernate 的 ...

  8. springBoot整合redis(作缓存)

    springBoot整合Redis 1,配置Redis配置类 package org.redislearn.configuration; import java.lang.reflect.Method ...

  9. Esp8266 网络结构体

    Esp8266建立网络连接相关结构体如下: 结构体头文件espconn.h /** Protocol family and type of the espconn */ enum espconn_ty ...

  10. 最新Spark入门篇

    一.Spark简介 1.什么是Spark Apache Spark是一种快速的集群计算技术,基于Hadoop MapReduce技术,扩展了MapReduce模型,主要特性是在内存中集群计算,速度更快 ...