← 返回首页
MySQL基础教程(十)
发表时间:2020-03-16 21:27:46
讲解数据库设计的三大范式

范式:简言之就是,数据库设计时要符合某一种设计要求的经验总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

数据库设计必须满足三大范式:

第一范式:保证列的原子性,保证列不可再分。

第二范式:唯一性 ;一个表只说明一个事物;有主键且非主键依赖主键;(限制多对多的关系,建立一个关联表,通过外键和联合主键来关联两张表)

第三范式:每列都与主键有直接关系,不存在传递依赖;(限制一对多的关系,在从表中建立一个外键,通过外键来引用主表的信息)

1.1NF

数据库表中不能出现重复记录,每个字段是原子性的不能再分割。 不符合第一范式的实例:

存在问题: 最后一条记录和第一条重复(不唯一,没有主键) 联系方式字段可以再分,不是原子性的。

改进方案: 根据第一范式要求,每一行必须唯一,也就是每个表必须有主键,这是数据库设计的最基本要求,主要采用数值型或定长字符串表示,关于字段不可再分,应该根据具体的情况来决定。如联系方式,为了开发上的便利可能就采用一个字段。

2.2NF

第二范式是建立在第一范式基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖。

不符合第二范式的实例:

以上虽然确定了主键,但此表会出现大量的冗余,主要涉及到的冗余字段为“学生姓名”和“教师姓名”,出现冗余的原因在于,学生姓名部分依赖了主键的一个字段学生编号,而没有依赖教师编号,而教师姓名部分依赖了主键的一个字段教师编号,这就是第二范式部分依赖。

改进方案:

3.3NF

建立在第二范式基础上的,非主键字段不能传递依赖于主键字段(不要产生传递依赖)。 不符合第三范式的实例:

上表虽然符合第二范式的要求,不存在部分依赖,但是班级名称字段存在冗余,因为班级名称字段没有直接依赖于主键,班级名称字段依赖于班级编号,班级编号依赖于学生编号,这就是传递依赖,解决的办法就是将冗余字段单独拿出来建立表:

以上设计是典型的一对多的设计,一存储在一张表中,多存储在一张表中,在多的那张表中添加外键指向一的一方。

4.符合三大范式的经典设计方案

一对一:

第一种方案:分两张表存储,共享主键 第二种方案:分两张表存储,外键唯一

一对多: 分两张表存储,在多的一方添加外键, 这个外键字段引用一的一方中的主键字段

多对多: 例如学生与课程的关系 分三张表存储,在学生表中存储学生信息,在课程表中存储课程信息, 在学生选课表中存储学生和课程的关系信息

实际开发中,数据库设计尽量遵循三范式,但是还是根据实际情况进行取舍,有时可能会拿冗余换速度,最终目的是要满足客户需求。

5.3NF练习题