MySQL~范式概述、12345范式+巴斯范式(BCNF)、反范式化

范式概述

范式:

  • 关系型数据库中,数据表设计的规则就是范式
  • 要想设计一张合理的数据表,必须满足某种范式

范式分类:
关系型数据库中,有6种:
12345范式+巴斯范式(BCNF)

从低到高阶:123+巴斯+45

  • 范式越高阶,冗余度越低
  • 高阶一定符合低阶要求
  • 满足最低要求的是第一范式,有更多规范要求的是第二范式,以此类推,越来越严格
  • 实际开发中,一般都是3NF,最多到巴斯范式,剩下的45范式很少涉及

在这里插入图片描述

键和相关属性

  • 超键:标识元组的属性集

可以理解为主键 或者 主键+其他字段 的组合就是超键
只要能唯一确定这条数据的字段/字段组合就可以叫超键

  • 候选键:如果超建没有其他属性,就是候选键

可以理解为 最小的超键。
只要能唯一确定这条数据的单一字段就是候选键

  • 主键:用户可以从候选键中选一个作为主键
  • 外键:如果表1中某个属性不是主键,是表2的主键,那这个属性就是表1外键
  • 主属性:在任一候选键中的属性

可以作为主键的字段就是主属性

  • 非主属性:不在任意候选键中的属性
第一范式(1NF)

主要确保每个字段值具有原子性,放在数据表中每个字段的值都是最小的,不可以进行拆分的.

错误举例:手机号字段中只能放一个手机号,不能存放两个手机号
在这里插入图片描述

第二范式(2NF)
  • 要求:
    1.必须满足范式1
    2.表中任意数据,必须可唯一标识
    3.所有非主键字段,必须完全依赖主键,不能部分依赖主键。比如主键是联合主键A+B,现在要查找C,必须知道A和B才能确认C是完全依赖,知道A或B中的一个就可以确认C是部分依赖

举例:
成绩表中 ,主键是(学号+课程),要想查询成绩,必须知道哪个课,哪个学生。只知道学号或者课程都无法确认成绩,这就是完全依赖.

如果非主属性不是完全依赖主键,会出现下列问题:

  • 数据冗余:出现大量重复数据
  • 插入异常:无法确定插入那个记录中
  • 删除异常:删除时会删除其他记录
  • 更新异常:更新一条记录会导致其他记录更新

1NF指出字段属性需要是原子性的
2NF指出一张表就是一个独立的对象,一张表值表达一个意思

举例:
在这里插入图片描述

总结:第2范式就是要求表中的字段必须完全依赖主键字段,如果不完全依赖,应该分离出去,建立一个新表,旧表和新表之间是一对多关系

第三范式(3NF)
  • 要求:
    1.必须符合第2范式
    2.数据表中所有非主键字段不能依赖于其他非主键字段。主键是A或B,那么C可以依赖A,或者依赖B,但是不能依赖D,或表里其他字段

非主键字段之间不能互相依赖,必须相互独立

巴斯范式(BCNF)

全名巴斯科德范式,因为没有新的规范加入,只是在3NF的基础上稍微严格了一些,所以不被称为第四范式,可以理解为是对第三范式的一个扩充.

  • 要求:
    1.符合3NF
    2.只有一个主键,主键只有一个字段

通常数据库的设计就到3NF或者BC就可以了

举例:
学生导师表中,学生+专业是联合主键
在这里插入图片描述
该表符合三范式:字段值不可分、字段完全依赖主键、非主键字段相互独立。但有一个问题是 专业依赖导师,知道了导师,自然就知道了学生专业.这不符合BC范式,所以拆成2个表:
在这里插入图片描述
在这里插入图片描述

第四范式(4NF)

在巴德范式的基础上,把同一表内多对多的关系删除

举例:
职工表(职工编号,职工姓名,职工选修课)
该表中,同一个职工可能有多个孩子,也可能选修多个课程,这就是多对多的关系,不符合4NF
如果想要符合4NF,可以将上表拆成2个表:
职工表1(职工名,职工孩子姓名)
职工表2(职工名,职工选修课程)
这样每个表都是一对多的关系,符合4NF

第五范式(5NF)了解即可

第五范式又叫完美范式,在4NF的基础上,消除非候选键的连接依赖

如果关系模式R中每一个连接依赖都是和R的候选键相关,那么R就符合完美范式.

5NF针对的是无损连接问题,由于无损连接在实际中很少出现,所以没啥意义,了解即可。

反范式化
  • 概述
    1.遵循业务优先原则,不能只遵循范式,随机应变
    2.数据量非常大,系统访问频次高时,如果只遵循范式,会产生大量关联查询,影响数据库性能,这时需要反范式化

  • 可能带来的问题
    1.空间换时间,存储空间变大
    2.表中字段修改,如果另一张表中有冗余字段,也需要修改,否则数据不同步
    3.数据量非常小的情况下,不适合用反范式,体现不出性能优势,反而让数据表变得复杂

  • 使用场景:冗余信息非常有价值的时候

  • 什么字段适合做冗余字段:必须用,不需要经常修改

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值