史上最简单的 MySQL 教程(十九)「范式」

释放双眼,带上耳机,听听看~!

范式

范式:Normal Farmat,是为了解决数据的存储和优化问题

在数据存储之后,凡是能够通过关系寻找出来的数据,坚决不再重复存储,范式的终极目标是减少数据冗余。

范式是一种分层结构的规范,共 6 层,分别为1NF、2NF、3NF、4NF、5NF和6NF,每一次都比上一层严格,若要满足下一层范式,其前提是先满足上一层范式。其中,1NF是最底层的范式,6NF为最高层的范式,也最严格。

MySQL 数据库属于关系型数据库,其存储数据的时候有些浪费空间,但也致力于节省空间,这就与范式想要解决的问题不谋而合,因此在设计数据库的时候,大都会利用范式来指导设计。但是数据库不单是要解决存储空间的问题,还要保证效率的问题,而范式只为解决存储空间的问题,所以数据库的设计又不能完全按照范式的要求来实现,因此在一般情况下,只需要满足前三种范式即可。

此外,咱们需要知道:范式在数据库的设计中是有指导意义的,但不是强制规范

1NF

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

例如,咱们设计一个「学校假期时间表」,如下所示:

表 1:学校假期时间表

1
哈尔滨工业大学
20170625,20170903
2
浙江大学
20170630,20170901

观察上表,咱们会发现表1的设计并没有什么问题,但是如果需求是查询各学校开始放假的日期呢?那显然上表的设计并不满足1NF,数据不具有原子性。对于此类问题,解决的方案就是将表1进行拆分:

表 2:拆分后的表 1

1
哈尔滨工业大学
20170625
20170903
2
浙江大学
20170630
20170901

2NF

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

例如,咱们设计一个「教室授课表」,如下所示:

表 3:教室授课表

许仙

《如何追到心爱的女孩》
杭州西湖
白娘子

《论女人的恋爱修养》
雷峰塔
白娘子

《如何打赢与和尚之间的持久战》
金山寺

观察上表,咱们会发现:教师不能作为独立的主键,需要与授课地点相结合才能作为主键(复合主键,每个教师的某个课程只能在固定的地点上),其中性别依赖于具体的教师,而课程依赖于授课地点,这就出现了表的字段依赖于部分主键的问题,从而导致不满足第二范式。

  • 解决方案 1:将教师和性别,课程和授课地点,分成两张单独的表;
  • 解决方案 2:取消复合主键,使用逻辑主键。

在此,咱们采用 方案 2 的解决方法,即取消复合主键,使用逻辑主键。

1
许仙

《如何追到心爱的女孩》
杭州西湖
2
白娘子

《论女人的恋爱修养》
雷峰塔
3
白娘子

《如何打赢与和尚之间的持久战》
金山寺

3NF

待续………
待续………
待续………


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

给TA打赏
共{{data.count}}人
人已打赏
安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

安全运维

设计模式的设计原则

2021-12-12 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索