数据库的三个范式

xiaoxiao2021-02-28  132

总结:

1NF 列的原子性2NF 包含1NF,且非主键列依赖主键所有内容3NF 包含 2NF,且非主键列直接依赖主键,不能间接依赖

第一范式(1NF)

强调列的原子性,即列不能够再分成其他几列。

考虑有这样一个表:【联系人】(姓名、性别、电话) 如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构就不符合1NF,应把电话列拆分成家庭电话和公司电话。

第二范式(2NF)

首先是1NF,另外还有两部分内容。 1. 一个表必须有一个主键。 2. 不在主键里的列必须依赖主键的所有内容,而不能只依赖主键的一部分。 例如有一个【选课系统表】:

学号学生课程教材上课地点001张三高等数学高等数学(第七版)701001张三大学英语大学英语(第一版)702001张三大学物理大学物理第二版703002李四高等数学高等数学(第七版)704

只考虑同一门课只用一本教材的情况

主键为【学号】【学生】【课程】,上课地点完全依赖于【学号】【学生】【课程】,但【教材】列中的只依赖于课程,所以不符合2NF。易产生数据冗余。 应把数据库拆分成【选课系统】(学号、学生、课程)和【课程教材】(课程、教材)。来消除教材多次重复的情况。

表1

学号学生课程上课地点001张三高等数学701001张三大学英语702001张三大学物理703002李四高等数学704

表2

课程教材高等数学高等数学(第七版)大学英语大学英语(第一版)大学物理大学物理(第二版)

不符合 2NF 的情况只会出现在主键由超过一个字段构成的表中,因为对单单主键不存在部分依赖问题。

第三范式(3NF)

首先是2NF。另外非主键必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键A依赖于非主键B,非主键B依赖于主键的情况。

订单号购买日期顾客ID顾客姓名消费地点顾客住址00001201704091001张三深圳上海00002201705011003李四广州深圳00003201705021009王五香港北京00004201705051003李四新加坡深圳

上述表格中,主键为订单号,其他列完全依赖于订单号,符合第二范式。但是顾客姓名和顾客住址直接依赖顾客ID(非主键列),而不是直接依赖于主键,所以不符合3NF。应把该表拆分成:

表1

订单号购买日期顾客ID消费地点00001201704091001深圳00002201705011003广州00003201705051009香港00004201705051003新加坡

表2

顾客ID顾客姓名顾客住址1001张三上海1003李四深圳1009王五北京 总结:第二范式和第三范式的区别在于: 2NF 要求非主键列依赖于主键的所有列,而不能只依赖于主键的一部分。3NF 要求非主键列直接依赖于主键列,而不是直接依赖于非主键列。
转载请注明原文地址: https://www.6miu.com/read-29805.html

最新回复(0)