MySQL之范式优化(三范式)

今日份记录关于数据库优化的一类方法:三范式。
下面就让我们一起来看看吧!
今日内容无代码演示(数据库的代码演示太繁琐,严重影响阅读体验)具体内容我都做了举例,个人感觉也算思路清晰吧,有不清楚的地方可以评论我为大家做简单解答。

范式定义:

  1. 是一种离散数学中的知识,是为了解决一种数据的存储与优化问题:即保证了保存数据的存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储。减少了数据的冗余。
  2. 是一种分层结构的规范,分为六层;每一层都比上一层更加严格,若要满足下一层范式,前提条件是满足上一层范式。
  3. 结构:
    1NF,2NF,3NF,4NF,5NF,6NF;1NF最底层要求最低,6NF最高层,要求最严格。

Mysql与范式的关系:

Mysql属于关系型数据库,有空间浪费,而范式的作用就是节省空间,在设计数据库时会利用范式来指导设计(范式在数据库的设计中只有指导意义,不是强制规范,属于锦上添花),但数据库又不仅仅解决空间问题,还有保证效率问题;范式只能解决空间问题,所以数据库的设计不可能完全按照范式的要求实现,一般数据库的设计只需要满足前三种范式:1NF,1NF,3NF

1NF:

  1. 定义:
    字段的数据具有原子性(不可再分)即该字段存储的数据即拿即用,不用拆分处理。在设计表存储数据时,若表中设计的字段所存储的数据在取出来使用之前还需要额外的处理(拆分),则该表的设计不满足第一范式。
  2. 举例:
    一个时间字段中含有起始时间和截止时间,查询该数据时需要显示起始时间和截止时间,这时就需要将该时间字段拆分出起始时间和截止时间,再将其显示,这样就不满足第一范式要求。
  3. 解决方法:
    将该字段分成两个字段,一个存起始时间,一个存截止时间,查询时按字段查询,直接显示出相对应要求的数据,不需要对其进行拆分,这样就满足第一范式。(也就是一个字段只存储一类数据)

2NF:

  1. 定义:
    不允许数据表中某字段存在部分依赖。在数据表设计过程中,如果有复合主键(多字段主键),且表中有字段并不是由整个主键来确定而是依赖复合主键中的某个字段(部分主键),存在字段依赖主键的部分问题,称其为部分依赖
  2. 举例:
    一个数据表中,字段a与字段b无法单独作为主键,两字段组合在一起作为主键(复合主键),假设此时数据表中还有字段1,字段2,字段3,字段4;字段1与复合主键相关联,(也就是复合主键决定了字段1),而字段2只依赖字段a,字段3只依赖字段b,也就是字段2与字段3分别由字段a和字段b决定(两字段之间有关系),而与复合主键的另一部分无关,这样则产生部分依赖。
  3. 解决方式1:
    将有依赖的连个字段单独出来重新建表,字段2与字段a单独成表,字段3与字段b单独成表。
  4. 解决方式2:
    取消复合主键,使用逻辑主键。使用逻辑主键可解决字段间的部分依赖问题,使所有字段都依赖逻辑主键(尽管字段2,字段3分别与字段a,字段b有依赖关系)范式与唯一键无关
    (主键分为逻辑主键与业务主键;前者可理解为自增长字段;后者可理解为具体的数据)

3NF:

  1. 定义:
    不允许表中存在传递依赖。理论上讲,一张表中的所有字段都应该直接依赖主键(逻辑主键无业务意义,此处特指业务主键),如果表设计中存在一个字段并不直接依赖主键,而是通过某个非主键字段依赖,最终实现依赖主键,把这种不是直接依赖主键而是依赖非主键字段的依赖关系称之为传递依赖(有点不恰当,但也差不多就比如你的亲戚A有他的亲戚B,你与B不是亲戚,但你通过你的亲戚A还是和B有一点远房亲戚的意思)
  2. 举例:
    一个数据表x中有四个字段a,b,c,d。字段a通过字段b与主键相关联,字段c通过字段d与主键相关联,而字段b与字段d都与主键直接关联,即字段a与字段b都通过一个非主键字段与主键产生了传递依赖。
  3. 解决方式:
    将产生传递依赖的两个字段分离出新的表y,将其逻辑主键存入数据表x中,取消其传递依赖关系。(此处应注意:逻辑主键无实际业务意义,新表中的业务主键仍是分离出的与数据表x主键直接关联的字段,也就是举例中的字段b和字段d。)

好了,以上就是我今天和大家分享的关于数据库优化的三范式(更确切的说应该是数据表优化),前面我们也介绍了范式只能解决数据库的空间优化问题,下面再跟大家提一下关于数据库的效率优化——逆规范化

逆规范化:

在设计数据表时,如果一张表中有几个字段是需要外键约束从另外的表中获取信息,这种获取数据的方式效率较低。所以我们在某些表中不会去保存另一个表的主键(逻辑主键),使用外键约束来获取;而是直接保存想要的数据信息,这样做在查询数据时一张表就可直接提供数据,提升效率。(缺点就是会导致数据冗余)

对比范式和逆规范化:

范式:提升磁盘利用率,节省存储空间,降低效率;
逆规范化:提升效率,导致数据冗余

所以说呢,范式和逆规范化算是两个极端,就看你是追求效率至上还是存储空间至上了。

=========手动分隔=

到此我们今天的分享就做一结束了,(基本上我们平时都是按照三范式来建表的,在这里我也只是就这一小知识点做一总结,算是一个小扩展吧。)若有纰漏,也请各位前辈多多指教!!!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值