MySQL之表关系与范式
关系:
所有的关系都是指表与表之间的关系。
将实体与实体的关系,反应到最终数据库表的设计上来,可以将关系分成三种:一对一,一对多(多对一)和多对多。
一对一:
一张表的一条记录一定只能与另外一张表的记录进行对应,反之亦然。

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

一个常用表中的一条记录,永远只能在一张不常用表中匹配一条记录;反过来,一个不常用表中的一天记录在常用表中也只能陪陪一条记录;一对一的关系。
一对多:
一张表中有一条记录,可以对应另外一张表中的多条记录;但反过来,另一张表中的一条记录只能对应第一张表中的一条记录;一对多或者多对一关系。

以上关系一个妈妈可以在多个孩子表中找到对应记录(也可能是一条);但是在一个孩子表中,只能找到一个妈妈,这是一种典型的一对多关系。
在上面设计中,解决了实体的设计表问题,但是没有解决关系问题,这样孩子是找不到妈妈的,妈妈也找不到孩子,解决方案:
在孩子表中增加一个字段指向妈妈表,因为孩子表的记录只能匹配到一条妈妈表的记录。

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

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


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

范式(Normal Format):
是一种离散数学中的知识,为了解决一种数据的存储于优化的问题,保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,终极目标是为了减少数据的冗余。
范式是一种分层结构的规范,共分为六层,每一层都比上一层更加严格。若要满足下一层范式,前提是满足上一层范式。
六层范式:1NF,2NF,3NF,4NF,5NF,6NF。1NF是最底层,要求最低;6NF是最高层,要求最严格。
MySQL属于关系层数据库,有空间浪费,也是致力于节省存储空间,与范式所解决的问题不谋而合,在设计数据库的时候,会利用到范式来指导设计。
但是数据库不单是要解决空间问题,要保证效率问题;范式只为解决空间问题,所以数据库的设计又不可能完全按照范式的要求实现,一般情况下,只有前三种范式需要满足。
范式在数据库的设计当中是有指导意义,但不是强制规范。
1NF:
第一范式:在设计存储数据的时候,如果表中设计的字段存储的数据,在取出来使用之前还需要额外的处理(拆分),那么说明表的设计不满足第一规范。
第一范式要求字段的数据具有原子性:不可再分。
讲师代课时间:

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

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

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


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

上表中:性别依赖讲师存在,讲师依赖主键;教室依赖班级,班级依赖主键;性别和教室都存在传递依赖。
解决方案:将存在传递依赖的字段,以及依赖的字段本身单独取出,形成一个单独的表,然后再续约对应的信息的时候,使用对应的实体表的主键加进来。

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

逆规范化:磁盘利用率与效率的对抗。
MySQL之表关系与范式的更多相关文章
- Mysql多表关系
mysql多表关系 多表关系是关系型数据库特有的 三种关系 一对一关系 一对多关系 多对多关系 总结 一对一 例子:用户和用户信息 外键设置在用户上,外键字段唯一非空 添加 无级联:先增加被关联表记录 ...
- MySQL之表关系
MySQL表关系 一对多关系 一对多与多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系. 举例,学校中一个学.院可以有很多的学生,而一个学生只属于某一个学院(通常情况下), ...
- MySql 多表关系
多表关系 一对一关系 一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面 一对多关系 班级是1端,学生是多端,结合面向对象的思想 ...
- mysql管理表关系
表关系管理 关注公众号"轻松学编程"了解更多. 1.概述 表与表之间的关系可以是一对一.一对多.多对一的.通过外键把表连接起来,外键放在任意一张表都可以,通常选择由从表(相对次 ...
- MySQL约束条件 表关系建立 查询数据
约束条件 unsigned 无符号 即为非负数,用此类型可以增加数据长度 例如 tinyint最大范围是127,那tinyint unsigned 最大就可以到 127 * 2 通常用在不会出现符号的 ...
- MySQL开发——【多表关系、引擎、外键、三范式】
多表关系 一对一关系 一对多或多对一关系 多对多关系 MySQL引擎 所谓的MySQL引擎就是数据的存储方式,常用的数据库引擎有以下几种: Myisam与InnoDB引擎之间的区别(面试) ①批量插入 ...
- 库增删该查,表增删该查,记录增删该查,表与表关系(多对多,多对一,一对一),mysql用户管理
库增删该查 增加库 create database db1 create database db1 charset="gbk 查看库 show databases 查看所有库 show cr ...
- MySQL数据库篇之完整性约束和表关系
主要内容: 一.完整性约束 二.表关系 1️⃣ 完整性约束 (1)何为完整性约束? 约束条件与数据类型的宽度一样,都是可选参数. 作用:用于保证数据的完整性和一致性 (2)分类主要有以下五类: 1.n ...
- mysql数据库之表关系
外键 前戏之一对多关系 # 定义一张部门员工表id name gender dep_name dep_desc1 jason male 教学部 教书育人2 egon male 外交部 漂泊游荡3 ta ...
随机推荐
- Python表达式与生成式
Python表达式与生成式 前言 本章节中的所有知识点均为在不丧失代码可读性的前提下最大程度精简代码的一系列操作.其中涉及到一些性能问题(微乎其微)可以不做考虑. 三元表达式 三元表达式中有三个重要的 ...
- 在树莓派上读取DHT11温湿度传感器-python代码实现及常见问题(全面简单易懂)
最近由于自己的课题需要,想要用在树莓派上使用DHT11温湿度传感器来读取空气中温湿度,遇到了几个问题,解决之后也对之前的知识进行了回顾,总结,特整理如下,希望能给也在学习树莓派的小伙伴们带来一些帮助. ...
- 基于TCP与UDP协议的socket通信
基于TCP与UDP协议的socket通信 C/S架构与初识socket 在开始socket介绍之前,得先知道一个Client端/服务端架构,也就是 C/S 架构,互联网中处处充满了 C/S 架构(Cl ...
- 使用docker创建mysql容器
1.拉取mysql容器 docker pull mysql:5.7
- Python实用笔记 (9)高级特性——列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, ...
- CSS DIV中表格居中显示
将div的text-align设为center,然后将table的margin设为auto,即: <div> <table style="margin:auto; widt ...
- 使用Fiddler模拟Post请求
做了一个动态的GIF来做演示,应该更加直观些. (完)
- Python3笔记004 - 2.1 python的语法特点
第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.1 python的语法特点 2.1.1 注释 注释的内容将被python解释器忽略,并不会在 ...
- 机器分配——线性dp输出路径
题目描述 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15 ...
- 洛谷 P2607 [ZJOI2008]骑士 树形DP
题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里, ...