MySQL进阶教程(三)—— 三大范式和E-R图

@
目录

前言

本期主要是要介绍MySQL数据库设计中的三大范式与E-R图,为后面设计我们自己的库以及里面表与表之间的关系做铺垫。

一、范式

数据库的范式是一组规则。在设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。

关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式),越高的范式数据库冗余越小。但是普遍认为范式越高虽然对数据关系有更好的约束性,但也可能导致数据库IO更繁忙。因此在实际应用中,数据库设计通常只需满足第三范式即可。所以我们也主要介绍前三个范式。

(一)第一范式

数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,对象等非原子数据。在关系型数据库的设计中,满足第一范式是对关系模式的基本要求。所以不满足第一范式的数据库就不能被称为关系数据库。

像图中所示的例子定义一个学生表,需要记录学生信息和学校信息。其中学校仍可继续拆分,所以其不满足第一范式。下面的例子就是符合第一范式的例子,虽然这样设计的表并不是十分合理。

但从以上例子,我们可以发现在关系型数据库中,每一列都可以用基本数据类型表示,就天然满足第一范式。

(二)第二范式

在满足第一范式的基础上,不存在非关键字段 对任意候选键 的部分函数依赖 ,存在于表中定义了复合主键的情况下,就是符合符合第二范式。

其中候选键是可以唯一标识一行数据的列或列的组合,可以从候选键中选⼀个或多个当做表的主键。

下面的例子是学生与课程成绩表。

这张表中使用学号+课程名定义复合主键来唯一标识以个学生某门课程的成绩。学生是通过学号来确定的,学生的其他信息不依赖课程名;同理学分只依赖课程名,不依赖学生。对于使用复合主键的表,如果一行数据中的有些列只与复合主键中的一个或其中几个列有关系,那
么就说他存在部分函数依赖,也就不满足第二范式
。所欲上面的表是不符合第二范式的。

而要将上表符合第二范式,需要将其拆分成以下3张表。

通过上诉例子,我们发现第二范式强调的是部分函数依赖,当一张表中的主键只有⼀列时,天然满足第二范式。

在这我们补充一下上表如果不符合第二范式会时可能会出现的问题。

  1. 数据冗余。学生的姓名、年龄、性别和课程的学分在每行记录中重复出现,造成了大量的数据冗余。
  2. 更新异常。如果要调整MySQL学分,那么就需要更新表中所有关于MySQL的记录,一旦执行中断导致某些记录更新成功,某些数据更新失败,会出现数据不一致的的问题。
  3. 插入异常。在原表中的设计里,成绩与每一门课和学生都有对应关系,也就是说只有学生参加选修课程考试取得了成绩才能生成一条记录。当有一门新课还没有学生参加考试取得成绩之前,其数据在数据库中是不存在的。
  4. 删除异常。如果把毕业学生的考试数据全都删除,此时课程和学分的信息也会被删除掉,有可能导致一段时间内,数据库里没有某门课程和学分的信息。

(三)第三范式

在满足第二范式的基础上,不存在非关键字段对任一候选键的传递依赖既符合第三范式。

下面给一张不符合第三范式,关于学生与其所属学院的表的例子。

在这个表结构中,可以看出学生的学号、姓名、年龄、性别与主键Id强相关;学院电话、学院地址与学院强相关;在一个表中出现了两个强相关的关系 ,而且这两个强相关关系又存在传递现象 ,即通过学生d可以找到学生记录,学生记录中包含学院名,每个学院又有自己的电话和地址。这种传递现象称为传递依赖,所以当前的表不满足第三范式。

要让上表符合第三范式,应该要将两个存在传递依赖的两个强相关关系分开。分出来定义学院表,学生表与学院表做关联。

二、实体-关系图 (E-R图)

实体-关系图(Entity-Relationship Diagram)简称E-R图,也称作实体联系模型、实体关系模型,是一种用于描述数据模型的概念图,主要用于数据库设计阶段。

(一)数据库设计过程

在讲述E-R图前,我们先要了解数据库的基本设计过程,其可以分为以下三个过程。

  1. 从现实业务中抽象得到概念类
    概念类是从现实世界中抽象出来的,在需求分析阶段就需要确定下来 。
    类对应了数据库设计中的实体,实体对应了数据库中的表。
    类中的属性对应实体中的属性,实体的属性对应了表中的列。
  2. 确定实体与实体之间的关系,并画出E-R画,方便项目参与人员理解与沟通。
  3. 根据E-R图完成SQL语句的编码并创建数据库

(二)E-R图的基本组成

E-R图包含了以下三种基本成分:

  • 实体:即数据对象,用矩形框表示,比如用户、学生、班级等。
  • 属性:实体的特性,用椭圆形或圆角矩形表示,如学生的姓名、年龄等。
  • 关系:实体之间的联系,用菱形框表示,并标明关系的类型,并用直线将相关实体与关系连接起来

(三)关系的类型

接下来我们要以例子来介绍E-R图里的关系类型,并给出具体的E-R图。

1、一对一关系 (1 : 1)

用户与账户

2、一对多关系 (1 : N)

学生与班级

3、多对多关系 (M : N)

学生与课程

对于多对多关系,可以使用中间表进行记录,比如⼀个学生参加了某一门课程的考试得到了相应的成绩,用E-R图表示如下:

(四)设计表

有了E-R图,我们现在就可以根据这些来设计表。

1、用户与账户的一对一关系

sql 复制代码
# 在⽤⼾实体中添加对账⼾实体的关联
drop table if exists users;
create table users (
id bigint primary key auto_increment,
name varchar(20) not null,
nickname varchar(20),
phone_num varchar(11),
email varchar(50),
gender tinyint(1),
account_id bigint
);
drop table if exists account;
create table account (
id bigint primary key auto_increment,
username varchar(20) not null,
password varchar(32) not null
);
# 在账⼾实体中添加对⽤⼾实体的关联
drop table if exists users;
create table users (
id bigint primary key auto_increment,
name varchar(20) not null,
nickname varchar(20),
phone_num varchar(11),
email varchar(50),
gender tinyint(1)
);
drop table if exists account;
create table account (
id bigint primary key auto_increment,
username varchar(20) not null,
password varchar(32) not null,
users_id bigint
);

2、学生与班级的一对多关系

sql 复制代码
# 班级表
drop table if exists class;
create table class (
id bigint primary key auto_increment,
name varchar(20)
);
# 学⽣表
drop table if exists student;
create table student (
id bigint primary key auto_increment,
name varchar(20) not null,
sno varchar(10) not null,
age int default 18,
gender tinyint(1),
enroll_date date,
class_id bigint
)

3、学生、课程与成绩的多对多关系

sql 复制代码
# 学⽣表
drop table if exists student;
create table student (
id bigint primary key auto_increment,
name varchar(20) not null,
sno varchar(10) not null,
age int default 18,
gender tinyint(1),
enroll_date date,
class_id bigint,
foreign key (class_id) references class(id)
);

# 课程表
drop table if exists course;
create table course (
id bigint primary key auto_increment,
name varchar(20)
);
# 分数表
drop table if exists score;
create table score (
id bigint primary key auto_increment,
score float,
student_id bigint,
course_id bigint,
foreign key (student_id) references student(id),
foreign key (course_id) references course(id)
);

三、逆向查看EE-R图

当表创建完成,并设置了正确的主外键关系之后,可以通过可视化客户端工具的逆向生成数据库模型(EE-R图) 。这里就不具体介绍了。

结语

以上便是本期关于MySQL设计三大范式和E-R图的全部内容了。如果喜欢我的内容,请点赞、收藏加关注,多多支持我,以及欢迎各位在评论区讨论交流,并指出我的不足,谢谢大家。